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文件 加入下面这行

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

运行如下命令安装docker

1
2
apt-get update
apt-get install docker.io

开始编译

  1. 开始之前先启动docker服务,不然到后面会报错
1
/etc/init.d/docker start
  1. 设置AOSP_VOL环境变量,设置为你要存放源码的路径,给VMWare添加硬盘扩容的设置成挂载的硬盘的路径。我设置的/Android路径
1
export AOSP_VOL=/Android
  1. 下载Wrapper脚本,我这里演示编译kitkat(Android 4.4),编译其他版本可以参考https://github.com/tiann/docker-aosp, 脚本根对国内环境做了优化,使用速度比较快的清华源。
1
curl -O https://raw.githubusercontent.com/tiann/docker-aosp/master/tests/build-kitkat.sh
  1. 编译源码,直接运行上一步下载下来的源码。该脚本会下载docker镜像,并且下载Android源码到AOSP_VOL指定的路径,然后编译。
1
sh ./build-kitkat.sh

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

编译内核

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

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

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

找到名字带有 hammerhead的。

1
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函数部分修改成如下:

1
2
3
4
5
6
7
//省略
else {
if (strstr(symname, "trace")) {
return sprintf(buffer, "%s", "sys_epoll_wait");
}
return sprintf(buffer, "%s", symname);
}

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

1
2
3
4
5
6
7
"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变量修改成

1
2
3
4
5
6
7
8
9
10
11
12
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路径为编译工具链,用来编译内核的。
1
2
3
4
5
6
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

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

1
sh run.sh

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

1
2
3
4
5
6
7
8
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;

分别运行它们

1
2
3
sh extract-broadcom-hammerhead.sh
sh extract-lge-hammerhead.sh
sh extract-qcom-hammerhead.sh

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

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

刷机

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

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

1
fastboot oem unlock

这个是Nexus 5的解锁方式

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

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

1
2
3
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. 参考
|