看到的一篇比較靠譜的AOSP源碼編譯和刷機實戰文章。轉自:https://blog.csdn.net/u012417380/article/details/73196722
一、下載專有的二進制文件
目前網絡上的中文教程以及出版的書籍幾乎都是直接編譯AOSP源碼用模擬器加載啟動鏡像。但是要想讓用AOSP源碼編譯出的系統鏡像在特定的設備中運行,僅僅編譯AOSP分支的源代碼是不夠的,必須下載相應的與硬件相關的其他專有庫。
由于我使用的是NEXUS 5 設備,并且打算編譯Android 4.4.4_r1版本,所以去官方 Nexus 和 Pixel 設備的二進制驅動下載頁面:https://developers.google.com/android/drivers?下載了相應的二進制驅動。
三個鏈接下載的三個驅動文件?
將三個壓縮包解壓出的自解壓腳本放在源碼樹的根目錄下并運行?
運行后,會提示你查看證書,按Enter鍵一行行的查看,出現下面的輸入提示時,輸入?I ACCEPT,解壓到了vendor?目錄下。其它兩個自解壓腳本也是這樣執行
解壓后的目錄:?
這三個.sh自解壓文件執行下來按Enter按的痛苦么?很痛苦!!!于是我看了看這三個文件的結構:
把第254行改為'if test "$typed" = I\ ACCEPT'就可以一路Enter到底至解壓了。感興趣的可以踩踩這個坑兒,成功后告訴我~
命令刪除所有以前編譯操作的已有輸出:
$ make clobber
使用?build目錄中的envsetup.sh?腳本初始化環境
$sourcebuild/envsetup.sh
或
$ . build/envsetup.sh
使用lunch選擇要編譯的目標。確切的配置可作為參數進行傳遞。例如以下命令(只是舉例,不用執行):
$ lunch aosp_arm-eng//該命令表示針對模擬器進行完整編譯,并且所有調試功能均處于啟用狀態。
不設置參數直接運行lanch的話,會提示從菜單中選擇一個目標?
所有編譯目標都采用?BUILD-BUILDTYPE形式,其中?BUILD?是表示特定功能組合的代號。
BUILDTYPE?是以下類型之一:?
三者具體差異Google也在官方文檔中給出了說明:https://source.android.com/source/building
模擬器一般選eng,調試功能全開。?
調試真機的話選userdebug?。?
發行最終版本用user?。
官方給出了一份自己出廠設備的代號和編譯配置選項?
我們用的設備是NEXUS 5 ,所以lanch?編譯配置為aosp_hammerhead-userdebug
我們使用make命令來編譯代碼,為了提高編譯速度,GNU Make 可以借助 -jN 參數處理并行任務,通常使用的任務數 N 介于編譯時所用計算機上硬件線程數的 1-2 倍之間。
我們來查看自己計算機上的核心數:
aosp444@aosp444-virtual-machine:~$ cat /proc/cpuinfo| grep processor
可看到自己創建的虛擬機CPU核心共有 4 個,那么要實現最快的編譯速度,可以使用介于?make -j4?到?make -j8之間的命令。
運行下面的命令進行編譯:
make-j8
在虛擬機中編譯了4小時左右,編譯結束。?
編譯后輸出的文件都放在了源碼根目錄下的out文件中,編譯后生成的文件:
那么我們刷機刷入哪些生成的文件呢?
事實上,我之前已經下載了Nexus 5官方進行鏡像包進行了刷機,可參考我寫的這篇文章:NEXUS 5 工廠鏡像刷機教程及刷機包目錄解析?,萬一自己編譯的系統刷機失敗,可刷官方刷機包來救急。
下面是官方刷機包的目錄:
對比我們編譯生成的文件,我們知道編譯的可刷機的文件有boot.img、system.img、recovery.img、cache.img、userdata.img五個鏡像文件。
當我們編譯前執行source build/envsetup.sh?、lanch aosp_hammerhead-userdebug?兩條命令時,腳本已經為我們自動設置好了環境變量和編譯選項,其中·lanch命令為我們設置好了ANDROID_PRODUCT_OUT變量的值。adb、fastboot工具 的路徑也被設置好了。
我們在刷機前輸出ANDROID_PRODUCT_OUT變量的值,確保它的值和編譯后鏡像輸出目錄的路徑值一致。如果不一致的話,重新設置ANDROID_PRODUCT_OUT的值與編譯后鏡像輸出目錄路徑值一致。
用USB數據線連接手機連接手機與虛擬機,無法識別的話需要設置USB選項,具體參考上一篇USB環境變量配置.?
默認情況下,Nexus 5是上鎖無法刷入鏡像的,需要我們解鎖,解鎖會擦除手機數據的,最好先備份用戶數據。在開機的情況下,輸入命令進入bootloader?模式
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
輸入下面的命令進行解鎖:
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oem unlock
按上下音量鍵選擇YES選項,再按電源鍵確認就解鎖成功了?
輸入下面的命令進行刷機
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot-wflashall
這時,會刷入boot.img、system.img、recovery.img、cache.img、userdata.img五個鏡像文件
然后手機會重啟1-2次,直至進入系統界面。原汁原味~?
在開機的情況下,再次輸入命令進入bootloader?模式,進行設備上鎖
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oemlock
上鎖成功后按電源鍵啟動設備。至此我編譯android系統4.4.4_r1源碼輸入Nexus 5 設備。
另外一篇比較好的文章:https://c55jeremy-tech.blogspot.com/2019/04/aosppixel-2-romrom.html