在一、Android系統源碼下載實戰 一文中,我們配置好了編譯環境以及下載好了系統源碼,下面我們我們來實戰系統源碼的編譯。Google官方教程https://source.android.com/source/building
一、下載專有的二進制文件
目前網絡上的中文教程以及出版的書籍幾乎都是直接編譯AOSP源碼用模擬器加載啓動鏡像。但是要想讓用AOSP源碼編譯出的系統鏡像在特定的設備中運行,僅僅編譯AOSP分支的源代碼是不夠的,必須下載相應的與硬件相關的其他專有庫。
下載專用的二進制源碼
由於我使用的是NEXUS 5 設備,並且打算編譯Android 4.4.4_r1
版本,所以去官方 Nexus 和 Pixel 設備的二進制驅動下載頁面:https://developers.google.com/android/drivers 下載了相應的二進制驅動。
三個鏈接下載的三個驅動文件
解壓專有二進制文件
將三個壓縮包解壓出的自解壓腳本放在源碼樹的根目錄下並運行
運行後,會提示你查看證書,按Enter鍵一行行的查看,出現下面的輸入提示時,輸入 I ACCEPT
,解壓到了vendor
目錄下。其它兩個自解壓腳本也是這樣執行
解壓後的目錄:
這三個.sh自解壓文件執行下來按Enter按的痛苦麼?很痛苦!!!於是我看了看這三個文件的結構:
echo
echo The license for this software will now be displayed.
echo You must agree to this license before using this software.
echo
echo -n Press Enter to view the license
read dummy
echo
more << __EOF__
......
證書信息
......
__EOF__
if test $? != 0
then
echo ERROR: Couldn\'t display license file 1>&2
exit 1
fi
echo
echo -n Type \"I ACCEPT\" if you agree to the terms of the license:\
read typed
第254行 if test "$typed" != I\ ACCEPT
then
echo
echo You didn\'t accept the license. Extraction aborted.
exit 2
fi
echo
tail -n +276 $0 | tar zxv
if test $? != 0
then
echo
echo ERROR: Couldn\'t extract files. 1>&2
exit 3
else
echo
echo Files extracted successfully.
fi
exit 0
第276行xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
把第254行改爲'if test "$typed" = I\ ACCEPT'
就可以一路Enter到底至解壓了。感興趣的可以踩踩這個坑兒,成功後告訴我~
清理
命令刪除所有以前編譯操作的已有輸出:
$ make clobber
二、設置環境
使用 build
目錄中的envsetup.sh
腳本初始化環境
$ source build/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
工具 的路徑也被設置好了。
1.檢查輸出目錄變量的值
我們在刷機前輸出ANDROID_PRODUCT_OUT
變量的值,確保它的值和編譯後鏡像輸出目錄的路徑值一致。如果不一致的話,重新設置ANDROID_PRODUCT_OUT
的值與編譯後鏡像輸出目錄路徑值一致。
2.用USB數據線連接手機
用USB數據線連接手機連接手機與虛擬機,無法識別的話需要設置USB選項,具體參考上一篇USB環境變量配置.
3.以fastboot 模式啓動手機,進行設備解鎖
默認情況下,Nexus 5是上鎖無法刷入鏡像的,需要我們解鎖,解鎖會擦除手機數據的,最好先備份用戶數據。在開機的情況下,輸入命令進入bootloader
模式
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
輸入下面的命令進行解鎖:
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oem unlock
按上下音量鍵選擇YES
選項,再按電源鍵確認就解鎖成功了
4.刷入鏡像
輸入下面的命令進行刷機
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot -w flashall
這時,會刷入boot.img
、system.img
、recovery.img
、cache.img
、userdata.img
五個鏡像文件
--------------------------------------------
Bootloader Version...: HHZ11k
Baseband Version.....: M8974A-2.0.50.1.16
Serial Number........: 03a784052519107e
--------------------------------------------
checking product...
OKAY [ 0.100s]
sending 'boot' (8700 KB)...
OKAY [ 1.127s]
writing 'boot'...
OKAY [ 0.739s]
sending 'recovery' (9284 KB)...
OKAY [ 1.296s]
writing 'recovery'...
OKAY [ 0.772s]
erasing 'system'...
OKAY [ 1.012s]
sending 'system' (291004 KB)...
OKAY [ 31.360s]
writing 'system'...
OKAY [ 21.154s]
erasing 'userdata'...
OKAY [ 13.403s]
formatting 'userdata' partition...
Creating filesystem with parameters:
Size: 29236371456
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 7137786
Block groups: 218
Reserved block group size: 1024
Created filesystem with 11/1785856 inodes and 156120/7137786 blocks
sending 'userdata' (139109 KB)...
writing 'userdata'...
OKAY [ 38.506s]
erasing 'cache'...
OKAY [ 0.550s]
formatting 'cache' partition...
Creating filesystem with parameters:
Size: 734003200
Block size: 4096
Blocks per group: 32768
Inodes per group: 7472
Inode size: 256
Journal blocks: 2800
Label:
Blocks: 179200
Block groups: 6
Reserved block group size: 47
Created filesystem with 11/44832 inodes and 5813/179200 blocks
sending 'cache' (13348 KB)...
writing 'cache'...
OKAY [ 3.243s]
rebooting...
finished. total time: 113.788s
aosp444@aosp444-virtual-machine:~/Android444_r1$
然後手機會重啓1-2次,直至進入系統界面。原汁原味~
5.以fastboot 模式啓動手機,進行設備上鎖
在開機的情況下,再次輸入命令進入bootloader
模式,進行設備上鎖
aosp444@aosp444-virtual-machine:~/Android444_r1$ adb reboot bootloader
aosp444@aosp444-virtual-machine:~/Android444_r1$ fastboot oem lock
上鎖成功後按電源鍵啓動設備。至此我編譯android系統4.4.4_r1源碼輸入Nexus 5 設備。