二、Android系統源碼編譯及刷機實戰

一、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

第254if 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 0276行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 -j4make -j8之間的命令。
運行下面的命令進行編譯:

make -j8

在虛擬機中編譯了4小時左右,編譯結束。
編譯後輸出的文件都放在了源碼根目錄下的out文件中,編譯後生成的文件:

這裏寫圖片描述

五、刷入目標設備

那麼我們刷機刷入哪些生成的文件呢?

事實上,我之前已經下載了Nexus 5官方進行鏡像包進行了刷機,可參考我寫的這篇文章:NEXUS 5 工廠鏡像刷機教程及刷機包目錄解析 ,萬一自己編譯的系統刷機失敗,可刷官方刷機包來救急。
下面是官方刷機包的目錄:

這裏寫圖片描述
對比我們編譯生成的文件,我們知道編譯的可刷機的文件有boot.imgsystem.imgrecovery.imgcache.imguserdata.img五個鏡像文件。

當我們編譯前執行source build/envsetup.shlanch aosp_hammerhead-userdebug 兩條命令時,腳本已經爲我們自動設置好了環境變量和編譯選項,其中·lanch命令爲我們設置好了ANDROID_PRODUCT_OUT變量的值。adbfastboot工具 的路徑也被設置好了。

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.imgsystem.imgrecovery.imgcache.imguserdata.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 設備。

這裏寫圖片描述

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