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 | apt-get update |
开始编译
1.开始之前先启动docker服务,不然到后面会报错
1 | /etc/init.d/docker start |
2.设置AOSP_VOL环境变量,设置为你要存放源码的路径,给VMWare添加硬盘扩容的设置成挂载的硬盘的路径。我设置的/Android路径
1 | export AOSP_VOL=/Android |
3.下载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 |
4.编译源码,直接运行上一步下载下来的源码。该脚本会下载docker镜像,并且下载Android源码到AOSP_VOL指定的路径,然后编译。
1 | sh ./build-kitkat.sh |
编译完成后,使用的是系统默认自带的内核,我们还需要重新修改编译内核绕过反调试
编译内核
- clone内核源码 我使用的手机是Nexus 5,对应的内核源码为kernel/msm。设备名是hammerhead
在存放源码的目录创建kernel文件夹,我这里存放源码目录为/Android
1 | cd /Android/aosp |
- 选择系统版本 切换到克隆下来的源码目录,切换分支
1 | git branch -a |
找到名字带有 hammerhead的。
1 | git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1 |
- 修改源码
需要修改kernel/msm/fs/proc/base.c
和kernel/msm/fs/proc/array.c
两个文件
base.c中 proc_pid_wchan
函数部分修改成如下:
1 | //省略 |
array.c中tast_state
函数部分修改成
1 | "Gid:\t%d\t%d\t%d\t%d\n", |
task_state_array
变量修改成
1 | static const char * const task_state_array[] = { |
- 创建编译脚本 在
/Android/aosp/kernel/msm
目录,即内核源码所在的目录创建一个脚本,内容如下,保存为run.sh. PATH前面的gcc路径为编译工具链,用来编译内核的。
1 | export PATH='/Android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin';$PATH |
然后运行该脚本开始编译内核
1 | sh run.sh |
出现如下提示表示内核已经编译ok
1 | CALL scripts/checksyscalls.sh |
在/Android/aosp/kernel/msm/arch/arm/boot
找到zImage-dtb,这个是nexus 5内核文件,拷贝到/Android/aosp/device/lge/hammerhead-kernel
覆盖原来的文件
- 下载驱动设备 要刷机到实体机,还需要下载三个驱动设备
从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.sh
、extract-lge-hammerhead.sh
和extract-qcom-hammerhead.sh
;
分别运行它们
1 | sh extract-broadcom-hammerhead.sh |
一直按回车,等到如下提示输入 I ACCEPT。
1 | Type "I ACCEPT" if you agree to the terms of the license: |
- 再次编译源码 再次运行编译脚本重新编译,这次会很快
1 | sh ./build-kitkat.sh |
刷机
先确定bootloader有没有解锁,没解锁是刷不进去的。
Nexus 5 是两个音量键和开机键一起一直按到出现bootloader界面。usb连接手机,输入以下命令
1 | fastboot oem unlock |
这个是Nexus 5的解锁方式,Android源码编译成功后,文件保存在/Android/aosp/out/target/product/hammerhead
。
输入如下命令就可以刷入实体机了。
1 | cd /Android/aosp/out/target/product/hammerhead |
参考
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