前言
本文不涉及源碼的下載,主要記錄自己的編譯源碼過程及其中遇到的問題,並最終運行在真機上。
通用的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版本,有可能會缺少某些包,可以參考上一篇文章。
編譯要求
1 編譯android-5.1.1版本
1)要求
a. jdk版本
android 9以上版本的master分支自帶預編譯版本的jdk,而舊版aosp需要自行安裝相應版本的jdk,具體舊版jdk參考鏈接:
https://source.android.google.cn/setup/build/older-versions
JDK
- Android 7.0 (Nougat) - Android 8.0 (Oreo):Ubuntu -OpenJDK 8;Mac OS - jdk 8u45 或更高版本
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
此時在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
2) 下載驅動
如上一篇博客所述,驅動仍然是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下包括了下載文件的三個同名文件夾。
3)編譯執行
a、執行. build/envsetup.sh初始化編譯環境
b、執行lunch命令選擇編譯目標版本(本次運行在nexus 5手機上,因此選擇hammerhead版本,具體手機機型跟代號的對應關係上篇博客有講過)
c、執行time make -j8開始編譯
4)刷機
編譯成功後,進入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
5)編譯5.1踩坑
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
編譯android-6.0.1_r45版本
1)要求
JDK版本,根據前面的版本知道跟android 5一樣,這裏就不贅述了。
JDK
- Android 7.0 (Nougat) - Android 8.0 (Oreo):Ubuntu -OpenJDK 8;Mac OS - jdk 8u45 或更高版本
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
2)下載驅動
根據以上描述的步驟
先在鏈接中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
3) 編譯執行
a、執行. build/envsetup.sh初始化編譯環境
b、執行lunch命令選擇編譯目標版本(本次運行在nexus 5x手機上,因此選擇bullhead版本,具體手機機型跟代號的對應關係上篇博客有講過)
c、執行time make -j8開始編譯
4)刷機
編譯成功後,進入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
5)編譯6.0踩坑
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