看到的一篇比較靠譜的AOSP源碼編譯和刷機(jī)實(shí)戰(zhàn)文章派阱。轉(zhuǎn)自:https://blog.csdn.net/u012417380/article/details/73196722
一染突、下載專有的二進(jìn)制文件
目前網(wǎng)絡(luò)上的中文教程以及出版的書籍幾乎都是直接編譯AOSP源碼用模擬器加載啟動鏡像贮懈。但是要想讓用AOSP源碼編譯出的系統(tǒng)鏡像在特定的設(shè)備中運(yùn)行,僅僅編譯AOSP分支的源代碼是不夠的颈渊,必須下載相應(yīng)的與硬件相關(guān)的其他專有庫遂黍。
由于我使用的是NEXUS 5 設(shè)備俊嗽,并且打算編譯Android 4.4.4_r1版本,所以去官方 Nexus 和 Pixel 設(shè)備的二進(jìn)制驅(qū)動下載頁面:https://developers.google.com/android/drivers?下載了相應(yīng)的二進(jìn)制驅(qū)動绍豁。
三個(gè)鏈接下載的三個(gè)驅(qū)動文件?
將三個(gè)壓縮包解壓出的自解壓腳本放在源碼樹的根目錄下并運(yùn)行?
運(yùn)行后芯咧,會提示你查看證書竹揍,按Enter鍵一行行的查看,出現(xiàn)下面的輸入提示時(shí)无拗,輸入?I ACCEPT昧碉,解壓到了vendor?目錄下。其它兩個(gè)自解壓腳本也是這樣執(zhí)行
解壓后的目錄:?
這三個(gè).sh自解壓文件執(zhí)行下來按Enter按的痛苦么焰扳?很痛苦Q肝堋8珉埂嗅辣!于是我看了看這三個(gè)文件的結(jié)構(gòu):
把第254行改為'if test "$typed" = I\ ACCEPT'就可以一路Enter到底至解壓了。感興趣的可以踩踩這個(gè)坑兒愿题,成功后告訴我~
命令刪除所有以前編譯操作的已有輸出:
$ make clobber
使用?build目錄中的envsetup.sh?腳本初始化環(huán)境
$sourcebuild/envsetup.sh
或
$ . build/envsetup.sh
使用lunch選擇要編譯的目標(biāo)雁仲。確切的配置可作為參數(shù)進(jìn)行傳遞。例如以下命令(只是舉例攒砖,不用執(zhí)行):
$ lunch aosp_arm-eng//該命令表示針對模擬器進(jìn)行完整編譯,并且所有調(diào)試功能均處于啟用狀態(tài)惰蜜。
不設(shè)置參數(shù)直接運(yùn)行l(wèi)anch的話,會提示從菜單中選擇一個(gè)目標(biāo)?
所有編譯目標(biāo)都采用?BUILD-BUILDTYPE形式政钟,其中?BUILD?是表示特定功能組合的代號养交。
BUILDTYPE?是以下類型之一:?
三者具體差異Google也在官方文檔中給出了說明:https://source.android.com/source/building
模擬器一般選eng,調(diào)試功能全開碎连。?
調(diào)試真機(jī)的話選userdebug?驮履。?
發(fā)行最終版本用user?。
官方給出了一份自己出廠設(shè)備的代號和編譯配置選項(xiàng)?
我們用的設(shè)備是NEXUS 5 倒戏,所以lanch?編譯配置為aosp_hammerhead-userdebug
我們使用make命令來編譯代碼,為了提高編譯速度矫夷,GNU Make 可以借助 -jN 參數(shù)處理并行任務(wù),通常使用的任務(wù)數(shù) N 介于編譯時(shí)所用計(jì)算機(jī)上硬件線程數(shù)的 1-2 倍之間淑趾。
我們來查看自己計(jì)算機(jī)上的核心數(shù):
aosp444@aosp444-virtual-machine:~$ cat /proc/cpuinfo| grep processor
可看到自己創(chuàng)建的虛擬機(jī)CPU核心共有 4 個(gè)忧陪,那么要實(shí)現(xiàn)最快的編譯速度嘶摊,可以使用介于?make -j4?到?make -j8之間的命令。
運(yùn)行下面的命令進(jìn)行編譯:
make-j8
在虛擬機(jī)中編譯了4小時(shí)左右等孵,編譯結(jié)束蹂空。?
編譯后輸出的文件都放在了源碼根目錄下的out文件中,編譯后生成的文件:
那么我們刷機(jī)刷入哪些生成的文件呢辨萍?
事實(shí)上,我之前已經(jīng)下載了Nexus 5官方進(jìn)行鏡像包進(jìn)行了刷機(jī)爪飘,可參考我寫的這篇文章:NEXUS 5 工廠鏡像刷機(jī)教程及刷機(jī)包目錄解析?拉背,萬一自己編譯的系統(tǒng)刷機(jī)失敗椅棺,可刷官方刷機(jī)包來救急。
下面是官方刷機(jī)包的目錄:
對比我們編譯生成的文件床估,我們知道編譯的可刷機(jī)的文件有boot.img诱渤、system.img、recovery.img鞋吉、cache.img励烦、userdata.img五個(gè)鏡像文件。
當(dāng)我們編譯前執(zhí)行source build/envsetup.sh?赊锚、lanch aosp_hammerhead-userdebug?兩條命令時(shí)屉栓,腳本已經(jīng)為我們自動設(shè)置好了環(huán)境變量和編譯選項(xiàng),其中·lanch命令為我們設(shè)置好了ANDROID_PRODUCT_OUT變量的值牲平。adb域滥、fastboot工具 的路徑也被設(shè)置好了蜈抓。
我們在刷機(jī)前輸出ANDROID_PRODUCT_OUT變量的值沟使,確保它的值和編譯后鏡像輸出目錄的路徑值一致渊跋。如果不一致的話,重新設(shè)置ANDROID_PRODUCT_OUT的值與編譯后鏡像輸出目錄路徑值一致燕少。
用USB數(shù)據(jù)線連接手機(jī)連接手機(jī)與虛擬機(jī)蒿囤,無法識別的話需要設(shè)置USB選項(xiàng)蟋软,具體參考上一篇USB環(huán)境變量配置.?
3.以fastboot 模式啟動手機(jī),進(jìn)行設(shè)備解鎖
默認(rèn)情況下凄敢,Nexus 5是上鎖無法刷入鏡像的湿痢,需要我們解鎖,解鎖會擦除手機(jī)數(shù)據(jù)的拒逮,最好先備份用戶數(shù)據(jù)臀规。在開機(jī)的情況下,輸入命令進(jìn)入bootloader?模式
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
輸入下面的命令進(jìn)行解鎖:
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oem unlock
按上下音量鍵選擇YES選項(xiàng),再按電源鍵確認(rèn)就解鎖成功了?
輸入下面的命令進(jìn)行刷機(jī)
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot-wflashall
這時(shí)恩袱,會刷入boot.img胶哲、system.img、recovery.img澈吨、cache.img、userdata.img五個(gè)鏡像文件
然后手機(jī)會重啟1-2次,直至進(jìn)入系統(tǒng)界面屈藐。原汁原味~?
5.以fastboot 模式啟動手機(jī)熙尉,進(jìn)行設(shè)備上鎖
在開機(jī)的情況下检痰,再次輸入命令進(jìn)入bootloader?模式,進(jìn)行設(shè)備上鎖
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oemlock
上鎖成功后按電源鍵啟動設(shè)備公壤。至此我編譯android系統(tǒng)4.4.4_r1源碼輸入Nexus 5 設(shè)備椎椰。
另外一篇比較好的文章:https://c55jeremy-tech.blogspot.com/2019/04/aosppixel-2-romrom.html