AOSP-docker编译安卓源码绕过反调试

看了很多编译源码的文章,发现很多都有坑,大部分都是环境配置问题,编译不同版本的源码jdk版本不一样,ubuntu版本也不一样。这很让人蛋疼,光是折腾环境就得半天了。

自从有了docker就不一样了,有人把Android源码编译的环境打包成了docker,就是AOSP docker;这样我们就不需要去折腾环境,直接拿人家弄好的来用。

推荐使用linux装docker,不用管是debian还是ubuntu;虽然windows也可以使用docker,但是还是有点小问题。

分配硬盘

linux至少要分配100g的硬盘空间。空间足够的可以跳过,原本装有VMWare linux,但是空间不足,又不想重新装个虚拟机。 可以参考 这篇文章http://blog.csdn.net/u010372981/article/details/46514011 给虚拟机加块硬盘。

安装docker

默认源中没有docker,我们需要在添加backports源,在/etc/apt/sources.list文件 加入下面这行

  deb http://http.debian.net/debian jessie-backports main

运行如下命令安装docker

apt-get update
apt-get install docker.io

开始编译

1.开始之前先启动docker服务,不然到后面会报错

 /etc/init.d/docker start

2.设置AOSP_VOL环境变量,设置为你要存放源码的路径,给VMWare添加硬盘扩容的设置成挂载的硬盘的路径。我设置的/Android路径

export AOSP_VOL=/Android

3.下载Wrapper脚本,我这里演示编译kitkat(Android 4.4),编译其他版本可以参考https://github.com/tiann/docker-aosp, 脚本根对国内环境做了优化,使用速度比较快的清华源。

curl -O https://raw.githubusercontent.com/tiann/docker-aosp/master/tests/build-kitkat.sh

4.编译源码,直接运行上一步下载下来的源码。该脚本会下载docker镜像,并且下载Android源码到AOSP_VOL指定的路径,然后编译。

sh ./build-kitkat.sh

编译完成后,使用的是系统默认自带的内核,我们还需要重新修改编译内核绕过反调试

编译内核

  1. clone内核源码 我使用的手机是Nexus 5,对应的内核源码为kernel/msm。设备名是hammerhead

在存放源码的目录创建kernel文件夹,我这里存放源码目录为/Android

cd /Android/aosp
mkdir kernel
cd kernel
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
  1. 选择系统版本 切换到克隆下来的源码目录,切换分支
git branch -a

找到名字带有 hammerhead的。

git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
  1. 修改源码

需要修改kernel/msm/fs/proc/base.ckernel/msm/fs/proc/array.c两个文件

base.c中 proc_pid_wchan函数部分修改成如下:

//省略
else {
           if (strstr(symname, "trace")) {
                return sprintf(buffer, "%s", "sys_epoll_wait");
           }
           return sprintf(buffer, "%s", symname);
      }

array.c中tast_state函数部分修改成

"Gid:\t%d\t%d\t%d\t%d\n",
              get_task_state(p),
              task_tgid_nr_ns(p, ns),
              pid_nr_ns(pid, ns),
              ppid, /*tpid*/0,
              cred->uid, cred->euid, cred->suid, cred->fsuid,
              cred->gid, cred->egid, cred->sgid, cred->fsgid);

task_state_array变量修改成

static const char * const task_state_array[] = {
     "R (running)",        /*    0 */
     "S (sleeping)",       /*    1 */
     "D (disk sleep)",     /*    2 */
     "S (sleeping)",       /*    4 */
     "S (sleeping)", /*     8 */
     "Z (zombie)",         /*  16 */
     "X (dead)",           /*  32 */
     "x (dead)",           /*  64 */
     "K (wakekill)",       /* 128 */
     "W (waking)",         /* 256 */
};
  1. 创建编译脚本 在/Android/aosp/kernel/msm目录,即内核源码所在的目录创建一个脚本,内容如下,保存为run.sh. PATH前面的gcc路径为编译工具链,用来编译内核的。
export PATH='/Android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin';$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make hammerhead defconfig
make -j4

然后运行该脚本开始编译内核

sh run.sh

出现如下提示表示内核已经编译ok

CALL    scripts/checksyscalls.sh
CHK     include/generated/compile.h
Kernel: arch/arm/boot/Image is ready
LD      arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
CAT     arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready

/Android/aosp/kernel/msm/arch/arm/boot找到zImage-dtb,这个是nexus 5内核文件,拷贝到/Android/aosp/device/lge/hammerhead-kernel覆盖原来的文件

  1. 下载驱动设备 要刷机到实体机,还需要下载三个驱动设备

https://developers.google.com/android/drivers找到对应的驱动设备。

搜索Nexus 5找到对应的系统版本,我的是Android 4.4.4。找到的结果如下:

Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)

Hardware Component Company Download SHA-256 Checksum
NFC, Bluetooth, Wi-Fi Broadcom Link f258605e24c9c3d4e78c9af934f3516a4f8d3410da697005fad42cad36c5ed5c
Camera, Sensors, Audio LG Link fc72704e0fba9c51c6505ae009e474570de27ee8565d51483368d8dae6c0f44e
Graphics, GSM, Camera, GPS, Sensors, Media, DSP, USB Qualcomm Link 8603d85ad511346d65c27c3747919da280523b86d55a39dfce657a4ca1b0685b

Download对应的是下载连接,我们把这三个文件下载后解压到/Android/AOSP目录。得到三个sh脚本文件 extract-broadcom-hammerhead.shextract-lge-hammerhead.shextract-qcom-hammerhead.sh;

分别运行它们

sh extract-broadcom-hammerhead.sh
sh extract-lge-hammerhead.sh
sh extract-qcom-hammerhead.sh

一直按回车,等到如下提示输入 I ACCEPT。

Type "I ACCEPT" if you agree to the terms of the license: 
You didn't accept the license. Extraction aborted.
  1. 再次编译源码 再次运行编译脚本重新编译,这次会很快
sh ./build-kitkat.sh

刷机

先确定bootloader有没有解锁,没解锁是刷不进去的。

Nexus 5 是两个音量键和开机键一起一直按到出现bootloader界面。usb连接手机,输入以下命令

fastboot oem unlock

这个是Nexus 5的解锁方式

Android源码编译成功后,文件保存在/Android/aosp/out/target/product/hammerhead

输入如下命令就可以刷入实体机了。

cd /Android/aosp/out/target/product/hammerhead
Adb reboot bootloader
Fastboot -w flashall

参考

http://blog.csdn.net/gaisylly/article/details/50113791
https://github.com/tiann/docker-aosp
http://weishu.me/2016/12/30/simple-way-to-compile-android-source/
http://bbs.pediy.com/thread-213481.htm
http://blog.csdn.net/sunao2002002/article/details/53057374
https://developers.google.com/android/drivers

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 分配硬盘
  2. 2. 安装docker
  3. 3. 开始编译
  4. 4. 编译内核
  5. 5. 刷机
  6. 6. 参考
,