1.引言
19年加入一家生產機頂盒的公司,第一次接觸到Android 系統相關的知識。拓寬了我職業知識面。讓我知道了原來編譯系統可以在服務器上進行;知道了framework開發日常工作內容;知道使用串口刷機;知道使用一些常用的Linux命令和Linux工具。20年又加入了一家Android TV 開發公司。再次接觸到Android系統編譯的知識。系統編譯知識對我而言充滿了神秘感。像一個披著紅布的新娘,坐著自己的面前,等待著我去掀開她的頭巾。內心充滿了好奇和激動。今天正式開啟這塊內容的學習,解鎖內心的好奇。
2.開發環境
操作系統: | Windows 10 |
---|---|
遠程服務器 | ubantu 18.04 |
手機 | Pixel |
ssh工具 | xshell |
網絡環境 | 能翻墻訪問google |
3.源碼下載
-
在ubantu上 安裝并初始repo客戶端
repo介紹,使用參考鏈接:https://source.android.com/setup/develop https://source.android.com/setup/develop/repo
-
運行
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
?
-
同步代碼 執行命令:
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。
將這倆個文件下載下來之后,解壓得到如下倆個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 分區的完整性,并顯示啟動狀態部分中指定的警告。
-
fastboot 介紹
Fastboot,英語翻譯意思是快速啟動。 在安卓手機中fastboot是一種比recovery更底層的刷機模式(俗稱引導模式)。 就是使用USB數據線連接手機的一種刷機模式。 相對于某些系統(如iOS)卡刷來說,線刷更可靠,安全。
進入fastboot有倆種方式:
-
在關機的情況下,同時按下power鍵和音量鍵,在boot驅動界面 手機插上USB線,進入CMD命令:
fastboot devices -- 查看設備是否連上
-
在開機情況下,手機插上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
執行完畢,手機將會自動重啟。
7.問題總結
-
因為代碼是在服務器編譯的。fastboot flash boot “boot.img 路徑”。這個路徑是本地的映射路徑。導致flash的時候,太慢或者出現其他 的錯誤。
解決的方法就是要將服務器上的img,保存到本地。提示如下錯誤:
fastboot: error: cannot get boot partition size
- usb線 太差,太水,也會導致一些異常錯誤。
-
第一次刷機,系統一直停留在開機動畫哪里,卡主無法前進。長按電源鍵15s,會強行關機。再次開機,依舊卡在開機動畫。下載官網的鏡像:官網鏡像
下載完畢,解壓zip,將得到這么個玩意:
此時,讓設備進入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 |