《AOSP 原始碼下載》完成後,就可以開編了。
整編
整編,顧名思義就是編譯整個 Android 原始碼,最終 out 目錄會生成幾個重要的映象檔案,其中有 system.img、userdata.img、ramdisk.img 等,這些是可以刷機的。
初始化編譯環境
專案目錄,開啟終端,輸入命令:
source build/envsetup.sh複製程式碼
選擇編譯目標
命令:
lunch複製程式碼
輸出:
You're building on LinuxLunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_blueline-userdebug 4. aosp_car_arm-userdebug 5. aosp_car_arm64-userdebug 6. aosp_car_x86-userdebug 7. aosp_car_x86_64-userdebug 8. aosp_cf_x86_64_auto-userdebug 9. aosp_cf_x86_64_phone-userdebug 10. aosp_cf_x86_64_tablet-userdebug 11. aosp_cf_x86_64_tablet_3g-userdebug 12. aosp_cf_x86_64_tv-userdebug 13. aosp_cf_x86_64_wear-userdebug 14. aosp_cf_x86_auto-userdebug 15. aosp_cf_x86_phone-userdebug 16. aosp_cf_x86_tablet-userdebug 17. aosp_cf_x86_tablet_3g-userdebug 18. aosp_cf_x86_tv-userdebug 19. aosp_cf_x86_wear-userdebug 20. aosp_crosshatch-userdebug 21. aosp_marlin-userdebug 22. aosp_sailfish-userdebug 23. aosp_taimen-userdebug 24. aosp_walleye-userdebug 25. aosp_walleye_test-userdebug 26. aosp_x86-eng 27. aosp_x86_64-eng 28. beagle_x15-userdebug 29. hikey-userdebug 30. hikey64_only-userdebug 31. hikey960-userdebug 32. hikey960_tv-userdebug 33. hikey_tv-userdebug 34. m_e_arm-userdebug 35. mini_emulator_arm64-userdebug 36. mini_emulator_x86-userdebug 37. mini_emulator_x86_64-userdebug 38. poplar-eng 39. poplar-user 40. poplar-userdebug 41. uml-userdebugWhich would you like? [aosp_arm-eng] 26複製程式碼
編譯目標格式說明
編譯目標的格式:BUILD-BUILDTYPE,比如上面的 poplar-eng 的 BUILD 是 poplar,BUILDTYPE 是 eng.
什麼是 BUILD
BUILD 指的是特定功能的組合的特定名稱,即表示編譯出的映象可以執行在什麼環境。其中 aosp(Android Open Source Project)代表 Android 開源專案;arm 表示系統是執行在 arm 架構的處理器上,arm64 則是指 64 位 arm 架構處理器,x86 則表示 x86 架構的處理器,更多裝置程式碼和編譯目標參考官方文件。
什麼是 BUILDTYPE
BUILDTYPE 則指的是編譯型別,通常有三種:
- user:用來正式釋出到市場的版本,許可權受限,如沒有 root 許可權,不能 dedug 等。
- userdebug:在user版本的基礎上開放了 root 許可權和 debug 許可權。
- eng:代表 engineer,開發工程師的版本,擁有最大的許可權(root等),具有額外除錯工具的開發配置。
如果沒有谷歌手機裝置,可以選擇 arm 或者 x86,我選擇了 aosp_x86-eng,編譯完後執行模擬器看看,因此這裡選擇序號 26。
開始編譯
通過 make 指令進行程式碼編譯:
make -j8複製程式碼
其中 -jN 參數列示處理並行任務,通常使用的任務數 N 介於編譯時所用計算機上硬體執行緒數的 1-2 倍之間。
檢視計算機上的核心數:
cat /proc/cpuinfo | grep processorprocessor : 0processor : 1processor : 2processor : 3複製程式碼
可看到建立的虛擬機器 CPU 核心共有 4 個,那麼要實現最快的編譯速度,可以使用介於 make -j4 到 make -j8 之間的命令。
不出意外,當看到:#### build completed successfully (03:55:24 (hh:mm:ss)) ####
就整編成功了。
執行模擬器
整編完,網上很多都是說直接執行命令:emulator
,但是我報以下錯誤了:
emulator: WARNING: Couldn't find crash service executable /media/ubuntu/disk/Project/AOSP9/prebuilts/android-emulator/linux-x86_64/emulator64-crash-serviceemulator: WARNING: system partition size adjusted to match image file (1080 MB >
800 MB)queryCoreProfileSupport: swap interval not foundfailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablegetGLES2ExtensionString: Could not make GLES 2.x context current!複製程式碼
第一個警告不管,第二個警告可以 emulator 加引數 -partition-size 2048
解決,也可以不管,最後一個折騰了很久,可以加引數-gpu off
,完整執行模擬器的命令:emulator -gpu off -partition-size 2048
,這時應該又會報:
emulator: WARNING: Couldn't find crash service executable /media/ubuntu/disk/Project/AOSP9/prebuilts/android-emulator/linux-x86_64/emulator64-crash-serviceemulator: WARNING: system partition size adjusted to match image file (1338 MB >
800 MB)emulator: ERROR: Running multiple emulators with the same AVD is an experimental feature.Please use -read-only flag to enable this feature.複製程式碼
只能重啟一下才能解決。
如果編譯完成後啟動模擬器時卡在黑屏,可以嘗試編譯其他的!
emulator 還有很多引數,可以用 emulator -help
檢視,引數如下:
-sysdir <
dir>
為模擬器在<
dir>
目錄中搜尋系統硬碟映象-system <
file>
為模擬器從<
file>
檔案中讀取初始化系統映象-datadir <
dir>
設定使用者資料寫入的目錄-kernel <
file>
為模擬器設定使用指定的模擬器核心-ramdisk <
file>
設定記憶體RAM 映象檔案(預設為<
system>
/ramdisk.img)-image <
file>
廢棄,使用-system <
file>
替代-init-data <
file>
設定初始化資料映象(預設為<
system>
/userdata.img)-initdata <
file>
和"-init-data <
file>
"使用方法一致-data <
file>
設定資料映象(預設為<
datadir>
/userdata-qemu.img)-partition-size <
size>
system/data 分割槽容量大小(MB)-cache <
file>
設定模擬器快取分割槽映象(預設為零時檔案)-no-cache 禁用快取分割槽-nocache 與"-no-cache"使用方法相同-sdcard <
file>
指定模擬器SDCard 映象檔案(預設為<
system>
/sdcard.img)-wipe-data 清除並重置使用者資料映象(從initdata 拷貝)-avd <
name>
指定模擬器使用Android 虛擬裝置-skindir <
dir>
設定模擬器皮膚在<
dir>
目錄中搜尋皮膚(預設為<
system>
/skins 目錄)-skin <
name>
選擇使用給定的皮膚-no-skin 不適用任何模擬器皮膚-noskin 使用方法與"-no-skin"相同-memory <
size>
物理RAM 記憶體大小(MB)-netspeed <
speed>
設定最大網路下載、上傳速度-netdelay <
delay>
網路時延模擬-netfast 禁用網路形態-tarce <
name>
程式碼配置可用-show-kernel 顯示核心資訊-shell 在當前終端中使用根Shell 命令-no-jni Dalvik 執行時禁用JNI 檢測-nojni 使用方法與"-no-jni"相同-logcat <
tag>
輸出給定tag 的Logcat 資訊-no-audio 禁用音訊支援-noaudio 與"-no-audio"用法相同-audio <
backend>
使用指定的音訊backend-audio-in <
backend>
使用指定的輸入音訊backend-audoi-out <
backend>
使用指定的輸出音訊backend-raw-keys 禁用Unicode 鍵盤翻轉圖-radio 重定向無線模式介面到個性化裝置-port <
port>
設定控制檯使用的TCP 埠-ports <
consoleport>
,<
adbport>
設定控制檯使用的TCP 埠和ADB 除錯橋使用的TCP 埠-onion <
image>
在螢幕上層使用覆蓋PNG 圖片-onion-alpha <
%age>
指定上層皮膚半透明度-onion-rotation 0|1|2|3 指定上層皮膚旋轉-scale <
scale>
調節模擬器視窗尺寸(三種:1.0-3.0、dpi、auto)-dpi-device <
dpi>
設定裝置的resolution (dpi 單位) (預設165)-http-proxy <
proxy>
通過一個HTTP 或HTTPS 代理來建立TCP 連線-timezone <
timezone>
使用給定的時區,而不是主機預設的-dns-server <
server>
在模擬系統上使用給定的DNS 服務-cpu-delay <
cpudelay>
調節CUP 模擬-no-boot-anim 禁用動畫來快速啟動-no-window 禁用圖形化視窗顯示-version 顯示模擬器版本號-report-console <
socket>
向遠端socket 報告控制檯埠-gps <
device>
重定向GPS 導航到個性化裝置-keyset <
name>
指定按鍵設定檔名-shell-serial <
device>
根shell 的個性化裝置-old-system 支援舊版本(pre 1.4)系統映象-tcpdump <
file>
把網路資料包捕獲到檔案中-bootchart <
timeout>
bootcharting 可用-qemu args.... 向qemu 傳遞引數-qemu -h 顯示qemu 幫助-verbose 和"-debug-init"相同-debug <
tags>
可用、禁用除錯資訊-debug-<
tag>
使指定的除錯資訊可用-debug-no-<
tag>
禁用指定的除錯資訊-help 列印出該幫助文件-help-<
option>
列印出指定option 的幫助文件-help-disk-images 關於硬碟映象幫助-help-keys 支援按鈕捆綁(手機快捷鍵)-help-debug-tags 顯示出-debug <
tag>
命令中的tag 可選值-help-char-devices 個性化裝置說明-help-environment 環境變數-help-keyset-file 指定按鍵繫結設定檔案-help-virtula-device 虛擬裝置管理複製程式碼
補充
模擬器執行需要四個檔案,分別是:
- Linux Kernel
- system.img
- userdata.img
- ramdisk.img
上面我 lunch 命令時選擇的是 aosp_x86-eng,因此 linux 預設使用的 AOSP/prebuilds/qemu-kernel/x86/kernel-qemu 下的 kernel-qemu,而其他檔案則是使用的 AOSP/out/target/product/generic_x86 目錄下的 system.img、userdata.img、ramdisk.img。
單編
單編就是編譯某個模組,比如 Setting,會在 out 目錄對應的產品有 Settings.apk,例如:out/target/product/generic_x86/system/priv-app/Settings/Settings.apk,這是可以直接安裝的。
1、source build/envsetup.sh
2、lunch
3、選擇單編版本序號
4、編譯
4.1、mmm
mmm packages/apps/Settings/複製程式碼
編譯指定目錄下的模組,但不編譯它所依賴的其它模組。
4.2、mm
先進入目錄:
cd packages/apps/Settings/複製程式碼
再編譯
mm複製程式碼
編譯當前目錄下的模組,它和 mmm 一樣,不編譯依賴模組。
4.3、mma
編譯當前目錄下的模組及其依賴項。
4.4、mmma [module_path]
編譯指定路徑下所有模組,且包含依賴
4.5、make
make: 不帶任何引數則是編譯整個系統
make MediaProvider複製程式碼
單個模組編譯,會把該模組及其依賴的其他模組一起編譯,會搜尋整個原始碼來定位 MediaProvider 模組所使用的 Android.mk 檔案,還要判斷該模組依賴的其他模組是否有修改。
make snod
如果我們修改程式碼,想看效果,怎麼辦?
1、可以在編譯完成後,藉助 adb install -r apk路徑
直接將生成的 apk 檔案安裝到裝置上。
2、可以編譯好完成後,再使用make snod
,重新生成 system.img,再執行模擬器也可。
公眾號
我的公眾號:吳小龍同學,歡迎交流~