Android 源码由 Google 管理,下载源码之前请先明确自己下载源码的目的,总结下,总共有如下几种:
- 阅读,查阅;
- 编译调测制作对应手机 root 包;
- 编译定制对应手机 ROM;
其中第2,3可以归纳为同一个目的,下载源码并编译在手机运行。
一、确保分区大小写敏感
对于 Mac 10.13 以上、使用 APFS 分区的场景:
运行“磁盘工具”,选择“添加宗卷”,选择“APFS区分大小写”。
二、下载对应 Tag 及版本镜像
查阅 Google 官网上
https://source.android.com/setup/build-numbers
android-7.1.2_r28 N2G48C
下载命令:
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.2_r28
镜像文件下载地址:
https://developers.google.com/android/images
三、下载对应的 kernel 代码
kernel 内核为单独一个仓,由于 nexus 6p 为高通平台,下载msm即可。
git clone https://android.googlesource.com/kernel/msm
msm 内核项目是 Google 公司针对高通 msm 移动芯片组(骁龙处理器)而开发的内核项目
我们可以在设置 > 关于手机 > 内核版本 中直接查看内核版本信息,也可以通过 cat /proc/version
命令查看。内核版本信息的格式为 kernel version-gXXXXXXX ,其中 XXXXXXX 部分的值是 git 提交中的 short commit id的值
在本地 git clone
后,本地只有一个 master 分支,git checkout d59db4e -b 分支名
为下载对应版本的源码并新建对应tag分支。
四、修改 kernel 源码中 Makefile
将 msm 目录下的 Makefile 文件中 ARCH 和 CROSS_COPMPILE 修改为如下
Mac路径
ARCH ?= arm64
CROSS_COMPILE ?= /Volumes/winsky/aosp/prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
其中 CROSS_COPMPILE 为交叉编译工具,路径在 Android 源码 Prebuilts 对应目录下。
Mac路径需要选择 darwin-x86 路径下
Liunx 路径设置
ARCH ?= arm64
CROSS_COMPILE ?= /home/ivan/android_nexus6p/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
五、开始编译内核
make angler_defconfig
make
编译完成后,生成的 Image.gz-dtb 在 arch/arm64/boot/Image.gz-dtb
路径下
编译过程中,以下错误都是由于环境未配置好导致的编译错误,以及网上找的解决办法
error: 'vdso_offset_sigtramp' undeclared (first use in this function)
(void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \
更改文件
更改arch/arm64/kernel/vdso/gen_vdso_offsets.sh脚本
中
's/^\([0-9a-fA-F]*\) . VDSO_\([a-zA-Z0-9_]*\)$/\#define vdso_offset_\2\t0x\1/p'
改为
's/^\([0-9a-fA-F]*\) . VDSO_\([a-zA-Z0-9_]*\)$/\#define vdso_offset_\2 0x\1/p'
其他错误
编译过程中会出现 elf.h 找不到的问题
安装 libelf
http://stackoverflow.com/questions/10018764/building-linux-kernel-on-mac-os-x
https://forum.xda-developers.com/android/help/failed-to-build-arm64-goldfish-kernel-t3342461
http://lukeat.me/2017/03/20/Build-Android-Kernel-of-ARM64-on-OS-X/
六、生成 boot.img 镜像
在路径 kernel\msm\arch\arm64\boot 中将编译生成的 Image.gz-dtb 复制到Android 源码路径device\huawei\angler-kernel 路径中 nexus6p 的代号为 angler 华为代工,故在以上路径。 回到android源码根目录,进行环境设置
source build/envsetup.sh
Lunch 选择angler相关选项(如果需要编译其他内核,选择对应即可)
make bootimage -j4
最终生成的 bootimage 在 Android 源码 out/target/product/angler/boot.img
下
运行烧写命令:
adb reboot bootloader ----进入Bootloaer
fastboot flash boot bootimage
fastboot reboot
以上编译出来的 boot 镜像为未 root 权限镜像。
如需要编译 root 权限镜像,以此运行如下命令:
source build/envsetup.sh
Lunch 选择 angler 相关选项(如果需要编译其他内核,选择对应即可)
choosecombo 选择 angler,最后一项选择 eng 即可,root 的关键是编译时选择 eng。
(或者直接运行命令 choosecombo 1 aosp_angler 3 默认选择好eng)
make bootimage -j4
编译过程中可能存在的问题:
(一)lunch 过程中会出现找不到 xcode 不支持
解决办法就是将 mac_sdk_versions_supported 改为系统中所装版本
#mac_sdk_versions_supported := 10.6 10.7 10.8 10.9
mac_sdk_versions_supported := 10.11
所以我们需要下载其他的 sdk 放到这个文件夹下面
我是在这个网站下载的, 没有任何问题 https://github.com/phracker/MacOSX-SDKs/releases 参考链接 http://www.jianshu.com/p/1513fc9e1a74
(二)编译过程中会提示头文件定义冲突
external/libcxx/include/cmath:683:46: error: declaration conflicts with target of using declaration already in scope
回退到 8.3.3
(三)出现 error: ‘syscall’的错误
将 xcode 回退到 8.3.3 即可
(四)bison 编译错误
[ 85% 2068/2406] Yacc: checkpolicy <= external/selinux/checkpolicy/policy_parse.y
FAILED: /bin/bash -c "prebuilts/misc/darwin-x86/bison/bison -d -v --defines=out/host/darwin-x86/obj/EXECUTABLES/checkpolicy_intermediates/policy_parse.h -o out/host/darwin-x86/obj/EXECUTABLES/checkpolicy_intermediates/policy_parse.c external/selinux/checkpolicy/policy_parse.y"
[ 85% 2068/2406] target C: libcrypto_static <= external/boringssl/src/crypto/ec/p256-64.c
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
按照如下步骤解决
https://android-review.googlesource.com/c/platform/external/bison/+/517740/1/lib/vasnprintf.c ---源码Bug
Patch bison fix for High Sierra and build bison:
◦ cd /Volumes/AOSP/external/bison
◦ git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160
◦ mma
• Replace prebuilt bison binary with patched binary
◦ cp /Volumes/AOSP/out/host/darwin-x86/bin/bison /Volumes/AOSP/prebuilts/misc/darwin-x86/bison/
参考链接:
七. 编译单模块
修改了FingerprintManager源码,如下路径 frameworks\base\core\java\android\hardware 配置好环境后执行:make framework
修改了FingerprintServices,如下路径 frameworks\base\services\core\java\com\android\server\fingerprint 配置好环境后编译命令:make services
附录
思考: Android 内核和linux 内核的区别 参考文章: http://blog.csdn.net/codemydream/article/details/53819312
华为开源内核编译指导
https://www.modaco.com/forums/topic/377314-how-to-build-the-kernel-for-your-huawei-p9-plus/