本文不涉及源码的下载,主要记录自己的编译源码过程及其中遇到的问题,并最终运行在真机上。
通用的aosp具体的编译步骤已经在上一篇博客详细描述过了,链接如下:
https://blog.csdn.net/u012195899/article/details/82078384#comments
本篇博客只针对android 5和android 6的编译差别进行描述。
1、ubuntu16.04,8G内存,2T硬盘
2、手机真机nexus 5x(刷入android 6), nexus 5(刷入android5)
3、编译源码版本为android-5.1.1_r14和android-6.0.1_r45两个
版本选择参考链接:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds,根据你的真机型号选择对应的源码版本。
本文是基于之前的编译环境继续编译5.1和6.0版本,如果你没有编译过7.1和4.4版本,有可能会缺少某些包,可以参考上一篇文章。
a. jdk版本
android 9以上版本的master分支自带预编译版本的jdk,而旧版aosp需要自行安装相应版本的jdk,具体旧版jdk参考链接:
https://source.android.google.cn/setup/build/older-versions
此时在Ubuntu上编译android 5.x,因此选择对应的OpenJDK7版本。
执行命令安装:
//正常来说命令行配置jre即可
sudo apt-get install openjdk-8-jre
//但我同时安装了jdk
sudo apt-get install openjdk-8-jdk
执行以下命令切换当前jdk版本,具体操作可以自行google
sudo update-alternatives --config java
执行命令查看是否安装成功:
java -version
javac -version
如上一篇博客所述,驱动仍然是image和二进制两种方式,这里我采用的是二进制自己编译这种方式,比较稳定。
因为要刷入到真机nexus,因此需要下载android-5.1.1_r14对应的vendor驱动,具体步骤如下:
在链接https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds中查找android-5.1.1_r14的版本代号为LMY48M, 在driver链接https://developers.google.cn/android/drivers搜索版本代号LMY48M,注意这里会存在该代号对应不同机型的驱动,我们根据要刷入的具体手机机型选择Nexus 5 (GSM/LTE) binaries for Android 5.1.1 (LMY48M)这个版本的驱动,如下图所示
如图所示,下载Broadcom、LG、Qualcomm三个链接,复制到编译目录根路径下,分别解压得到三个.sh文件,分别执行.sh文件,每一个.sh文件需要阅读一些东西,然后最后会让你确认是否接受,输入I ACCEPT即可。执行完三个.sh文件后,会看到源码目录下新增文件夹vendor,并且vendor下包括了下载文件的三个同名文件夹。
a、执行. build/envsetup.sh初始化编译环境
b、执行lunch命令选择编译目标版本(本次运行在nexus 5手机上,因此选择hammerhead版本,具体手机机型跟代号的对应关系上篇博客有讲过)
c、执行time make -j8开始编译
编译成功后,进入out/target/product/hammerhead目录,依次执行以下命令即可。
//进入手机bootloader
adb reboot bootloader
//开始刷机
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash cache cache.img
fastboot flash userdata userdata.img
fastboot flash recovery recovery.img
//启动
fastboot reboot
a、
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1
make: *** Waiting for unfinished jobs....
host C++: dalvikvm <= art/dalvikvm/dalvikvm.cc
修复:
cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld
b、
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed in the
errors above.
2) You can update current.txt by executing the following command:
make update-api
To submit the revised current.txt to the main Android repository,
you will need approval.
修复:这个报错可能是因为我个人编译的时候修改了源码,增加了部分公开类和方法,因此需要更新api,根据提示执行make update-api即可
c、
unable to remove 'out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar': No such file or directory
make: *** [out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar] Error 1
修复:有时候更新后会出现一些莫名其妙的错误,这个时候就把之前生成的中间文件全部清楚,重来一遍。清楚后重新编比较耗时,谨慎操作。具体命令如下,依次执行即可:
make clobber
make update-api
time make -j8
JDK版本,根据前面的版本知道跟android 5一样,这里就不赘述了。
根据以上描述的步骤
先在链接中https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds查找到android-6.0.1_r45对应的代号MTC19V
然后在二进制驱动链接https://developers.google.cn/android/drivers中查找MTC19V,发现没有找到相应的二进制驱动(这是因为google对android 6就没有提供对应的二进制驱动文件)
因此我们只能选择直接刷入image的方式,在iamge链接https://developers.google.cn/android/images中查找MTC19V,因为我们刷入的机型为nexus 5x,找到对应bullhead的image文件下载,如下图所示
根据MTC19V对应的link下载image压缩文件,解压bullhead-mtc19v-factory-61de3a6f.zip
a、执行. build/envsetup.sh初始化编译环境
b、执行lunch命令选择编译目标版本(本次运行在nexus 5x手机上,因此选择bullhead版本,具体手机机型跟代号的对应关系上篇博客有讲过)
c、执行time make -j8开始编译
编译成功后,进入out/target/product/bullhead目录,可以看到生成了boot.img, cache.image, recovery.image, system.image, userdata.img,没有vendor.image。
所以需要先从之前下载的bullhead-mtc19v-factory-61de3a6f.zip文件中解压出image文件,依次执行以下命令即可。
// 进入解压后的系统镜像,刷入google提供的原生镜像
sh flash-all.sh
// 这一步虽然将整个系统全部重刷,实际目的只是为了刷入可用的vendor.img(之前我单独刷vendor包,
// 然后刷入自己编译的image,系统启动失败),时间比较久,你可以来杯咖啡,刷好之后会自动启动手机
//使用快捷键进入fastboot boot模式, 开始刷入我们自己编译的镜像文件
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash cache cache.img
fastboot flash userdata userdata.img
fastboot flash recovery recovery.img
//启动
fastboot reboot
a、*** [out/host/linux-x86/obj/lib/libartd.so] Error 1
修复:
修改配置文件:art/build/Android.common_build.mk
搜索关键字符串:WITHOUT_HOST_CLANG,
ART_HOST_CLANG := true修改为
ART_HOST_CLANG := false
修改后的相应配置如下:
# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := false
endif