Android源码kernel编译

Android 源码由 Google 管理,下载源码之前请先明确自己下载源码的目的,总结下,总共有如下几种:

  1. 阅读,查阅;
  2. 编译调测制作对应手机 root 包;
  3. 编译定制对应手机 ROM;

其中第2,3可以归纳为同一个目的,下载源码并编译在手机运行。  

一、确保分区大小写敏感

对于 Mac 10.13 以上、使用 APFS 分区的场景:

运行“磁盘工具”,选择“添加宗卷”,选择“APFS区分大小写”。

二、下载对应 Tag 及版本镜像

查阅 Google 官网上

https://source.android.google.cn/setup/start/build-numbers?hl=zh-cn#source-code-tags-and-builds

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/

参考链接:

https://groups.google.com/forum/#!searchin/android-building/prebuilts2Fmisc2Fmisc2Fdarwin-x862Fbison2Fbison2Fbison|sort:date/android-building/D1-c5lZ9Oco/h2kAzh7SAwAJ

七. 编译单模块

修改了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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值