Android系統編譯之AOSP刷機

1.引言

19年加入一家生產機頂盒的公司,第一次接觸到Android 系統相關的知識。拓寬了我職業知識面。讓我知道了原來編譯系統可以在服務器上進行;知道了framework開發日常工作內容;知道使用串口刷機;知道使用一些常用的Linux命令和Linux工具。20年又加入了一家Android TV 開發公司。再次接觸到Android系統編譯的知識。系統編譯知識對我而言充滿了神秘感。像一個披著紅布的新娘,坐著自己的面前,等待著我去掀開她的頭巾。內心充滿了好奇和激動。今天正式開啟這塊內容的學習,解鎖內心的好奇。

2.開發環境

操作系統: Windows 10
遠程服務器 ubantu 18.04
手機 Pixel
ssh工具 xshell
網絡環境 能翻墻訪問google

3.源碼下載

參考:android官網下載指導

  • 運行 repo init 獲取最新版本的 Repo 及其最新的問題修復。清單文件指定了 Android 源代碼中包含的各個代碼庫位于工作目錄中的什么位置,您必須為該清單指定一個網址。

    repo init -u https://android.googlesource.com/platform/manifest
    

    因為我們用的是Pixel手機,所以要設置對應的代碼分支。請參閱源代碼標記和 build

    最終運行的是:repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r5
    
image-20201129124539154.png

?

  • 同步代碼 執行命令:repo sync ,同步命令行會有如下提示:

    Updating files: 100% (1898/1898), done.
    Updating files: 100% (2018/2018), done.latform/system/ca-certificatesUpdating files:  79% (1614/2018)
    Updating files: 100% (972/972), done.
    Updating files: 100% (1778/1778), done.latform/system/tools/syspropUpdating files:  93% (1660/1778)
    Updating files: 100% (161/161), done. platform/tools/currysrcUpdating files:  63% (103/161)
    Updating files: 100% (18/18), done.
    Checking out projects: 100% (733/733), done.
    repo sync has finished successfully.
          
    

假如不能翻墻,就通過清華鏡像,按照官網的步驟一步一步執行即可。千萬要注意同步的代碼分支,一定要和刷機手機相匹配

4.下載驅動

官方驅動文檔

因為我下載的是android-10.0.0_r5, 對應的build為 QP1A.191005.007.A1。

image-20201129150038228.png

將這倆個文件下載下來之后,解壓得到如下倆個sh:

extract-google_devices-sailfish.sh
extract-qcom-sailfish.sh

這個倆個sh最終生成vendor文件夾。是用bash命令寫的。所以我們也得用bash去執行。但是在windows,運行會提示不成功。得在ubantu上運行

bash extract-google_devices-sailfish.sh
bash extract-qcom-sailfish.sh

運行成功,提示如下:并且得到一個vendor文件夾

Type "I ACCEPT" if you agree to the terms of the license: I ACCEPT

vendor/
vendor/google_devices/
vendor/google_devices/sailfish/
vendor/google_devices/sailfish/android-info.txt
vendor/google_devices/sailfish/BoardConfigPartial.mk
vendor/google_devices/sailfish/proprietary/
vendor/google_devices/sailfish/proprietary/vendor.img
vendor/google_devices/sailfish/device-partial.mk
vendor/google_devices/marlin/
vendor/google_devices/marlin/BoardConfigVendor.mk
vendor/google_devices/marlin/device-vendor-sailfish.mk

5.編譯源碼

官方文檔

  • 設置環境,使用 envsetup.sh 腳本初始化環境:

    source build/envsetup.sh
    
  • 選擇編譯目標

    lunch aosp_sailfish-userdebug(因為用的是pixel設備)
    

    因為我用的是pixel設備,所以需要編譯aosp_sailfish。參考選擇設備 build

  • 啟動編譯

    make -j32
    

6.FastBoot刷機

  • bootLoader介紹

    bootLoader是供應商專有的映像,負責在設備上啟動內核。它會監護設備狀態,負責初始化可信執行環境 (TEE) 以及綁定其信任根。

    bootLoader由許多部分組成,包括啟動畫面。要開始啟動,bootLoader可能會直接將一個新映像刷寫到相應的分區中,也可能會使用 recovery 開始重新刷寫過程,該過程與 OTA 的操作過程一致。一些設備制造商會創建多bootLoader,然后將它們組合到一個 bootloader.img 文件中。

    最重要的是,bootLoader會在將執行工作移到內核之前先驗證 boot 分區和 recovery 分區的完整性,并顯示啟動狀態部分中指定的警告。

    解鎖bootLoader官方教程

  • fastboot 介紹

    Fastboot,英語翻譯意思是快速啟動。 在安卓手機中fastboot是一種比recovery更底層的刷機模式(俗稱引導模式)。 就是使用USB數據線連接手機的一種刷機模式。 相對于某些系統(如iOS)卡刷來說,線刷更可靠,安全。

進入fastboot有倆種方式:

  1. 在關機的情況下,同時按下power鍵和音量鍵,在boot驅動界面 手機插上USB線,進入CMD命令:

    fastboot devices  -- 查看設備是否連上
    
  1. 在開機情況下,手機插上USB線,進入CMD命令:

    adb reboot bootloader              -- 進入fastboot模式
    fastboot devices                 -- 查看設備是否連上
    

將服務器上的img,拷貝到本地,打開命令行執行下面的步驟:

fastboot  flashing  unlock 
fastboot  flash  boot  E:\aosp\boot.img
fastboot  flash  ramdisk E:\aosp\ramdisk.img 
fastboot  flash  ramdisk-recovery E:\aosp\ramdisk-recovery.img 
fastboot  flash  system  E:\aosp\system.img 
fastboot  flash  userdata E:\aosp\userdata.img 
fastboot  flash  vendor E:\aosp\vendor.img 
fastboot  flash  system_other E:\aosp\system_other.img 
fastboot reboot
image-20201129185824023.png

執行完畢,手機將會自動重啟。

7.問題總結

  • 因為代碼是在服務器編譯的。fastboot flash boot “boot.img 路徑”。這個路徑是本地的映射路徑。導致flash的時候,太慢或者出現其他 的錯誤。

    解決的方法就是要將服務器上的img,保存到本地。提示如下錯誤:

    fastboot: error: cannot get boot partition size
    
  • usb線 太差,太水,也會導致一些異常錯誤。
  • 第一次刷機,系統一直停留在開機動畫哪里,卡主無法前進。長按電源鍵15s,會強行關機。再次開機,依舊卡在開機動畫。下載官網的鏡像:官網鏡像

    下載完畢,解壓zip,將得到這么個玩意:

image-20201129190214415.png

此時,讓設備進入fastboot model。雙擊flash-all.bat 這個腳本會自動將img刷進手機中。之后,在將自己的img 以上述的方式刷進去。就能正常開機。

8.各個img簡介

android 系統映射文件

img名稱 img描述
system.img Android系統運行的程序包,framework就在此img中。掛載到/system下
boot.img 包含內核啟動參數
ramdisk.img 小型文件系統,是android系統啟動的關鍵。包含了android 根目錄的鏡像
userdata.img 各程數據存儲所在,被掛載到/data目錄下
cache.img 存儲系統或用戶應用產生的臨時數據,通常的鏡像文件名為chche.img
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容