Ubuntu16.04編譯Android源碼系列二—— android 5.1和android 6.0及踩坑

前言

本文不涉及源碼的下載,主要記錄自己的編譯源碼過程及其中遇到的問題,並最終運行在真機上。

通用的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

此時在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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章