本文首發於微信公衆號「劉望舒」html
這是BATcoder的第五篇,BATcoder是Android進階三部曲的番外篇,會對Android進階三部曲的內容進行拓展和升級,會以視頻的形式分享給你們。至於爲啥叫BATcoder,這是由於我但願你們看了個人技術視頻能進入本身中意的大廠。前端
更多細節和內容見視頻:android
B站地址: www.bilibili.com/video/BV1VU…git
獨立博客地址: liuwangshu.cn/batcoder/ao…面試
咱們順利的將AOSP下載了下來後,不少時候咱們不只僅須要去查看源碼,還有如下的幾個需求:docker
爲了實現這些需求,就須要咱們去編譯系統源碼。其中第三條和第四條也能夠不用編譯源碼來實現,第三條只要有對應Android源碼版本的android.iml 和 android.ipr 兩個文件就能夠將源碼導入到Android Studio中,第四條動態調試系統源碼不必定非要導入整個系統源碼進行調試。關於第三條和第四條的具體內容,我會在之後的內容中進行講解。ubuntu
瞭解如下一些概念,會對Android編譯系統有大概的瞭解。緩存
Makefile安全
Android平臺的編譯系統,其實就是用Makefile寫出來的一個獨立項目。它定義了編譯的規則,實現了「自動化編譯」,不只把分散在數百個Git庫中的代碼整合起來、統一編譯, 並且還把產物分門別類地輸出到一個目錄,打包成手機ROM,還能夠生成應用開發時所使用的SDK、NDK等。 所以,採用Makefile編寫的編譯系統,也能夠稱爲Makefile編譯系統。微信
Android.mk Makefile編譯系統的一部分,Android.mk是android編譯環境下的一種特殊的「makefile」文件, 它是通過了android編譯系統處理的。Android.mk中定義了一個模塊的必要參數,使模塊隨着平臺編譯。通俗來說就是告訴編譯系統,以什麼樣的規則編譯你的源代碼,並生成對應的目標文件。
Ninja
Ninja是一個致力於速度的小型編譯系統,若是把其餘的編譯系統看做高級語言,那麼Ninja 目標就是彙編。使用Ninja 主要目的就是由於其編譯速度快。
Soong
Soong是谷歌用來替代此前的Makefile編譯系統的替代品,負責解析Android.bp文件,並將之轉換爲Ninja文件
Blueprint
Blueprint用來解析Android.bp文件翻譯成Ninja語法文件。
kati
kati是谷歌專門爲了Android而開發的一個小項目,基於Golang和C++。 目的是把Android中的Makefile,轉換成Ninja文件。
Android.bp
Android.bp,是用來替換Android.mk的配置文件。
Android.mk、Ninja、Soong、Blueprint、kati、Android.bp的概念之間的聯繫爲:
Blueprint負責解析Android.bp文件內容,Blueprint相似一個處理相關語法的庫文件,Soong則是定義具體如何處理相應的語法以及命令實現。通俗來說就是Soong藉助於Blueprint定義的Android.bp語法,完成Android.bp的解析,最終轉換成Ninja文件。 Makefile文件會經過kati轉換爲Ninja文件。 隨着Android工程愈來愈大,採用Makefile的編譯系統花費的時間也愈來愈長,所以谷歌在Android 7.0開始引入了Ninja來編譯系統,相對於Makefile來講Ninja在大的項目管理中速度和並行方面有突出的優點。 Makefile默認文件名爲Makefile或makefile,也經常使用.make或.mk做爲文件後綴。 Ninja的默認文件名是build.ninja,其它文件以.ninja爲後綴。Makefile與Ninja的區別在於, Makefile是設計來給開發編寫的,而Ninja設計出來是給其它程序生成的。若是Makefile是Java語言,那麼Ninja就是彙編語言。
Androd系統源碼編譯有不少種方式,主要有如下幾種:
其中須要注意的是,Docker的最低支持版本爲Windows7,建議用Windows10環境下使用Docker,由於在Windows7中還須要藉助Docker Toolbox和VirtualBox中的容器進行通訊,效率相對低些。 考慮到大多數人的設備和上手難易程度,本爲講解在Linux中直接進行系統源碼編譯。
1.設置處理器數量
在沒有運行Ubuntu的時候,在VirtualBox裏選擇設置-->系統-->處理器選項,設置處理器數量,建議設置比較大一些,這裏設置的是6。 若是不可以設置,請檢查是否開啓虛擬化技術。不一樣的電腦開啓的方式也不一樣,好比我此前惠普暗影精靈4的臺式機,在開機時連續按F10就會進入BIOS,在安全->系統安全性->虛擬化技術選項設置啓用便可。 如今的暗影精靈6臺式機,則是在BIOS的配置選項裏開啓虛擬化技術選項。
2.安裝 jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
複製代碼
3.使用 ubuntu 14+,須要安裝如下依賴包:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
複製代碼
整編就是編譯整個Android 源碼,整編主要有三個步驟,下面分別就行介紹。
1.初始化環境
在AOSP的根目錄,輸入以下的命令:
source build/envsetup.sh
make clobber
複製代碼
使用 build目錄中的envsetup.sh 腳本初始化環境,這個腳本會引入其餘的執行腳本。make clobber用於清除緩存。
2. 選擇編譯目標
輸入命令:
lunch
複製代碼
lunch命令是envsetup.sh裏定義的一個命令,用來讓用戶選擇編譯目標。 會有如下信息輸出:
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. aosp_car_arm-userdebug
8. aosp_car_arm64-userdebug
9. aosp_car_x86-userdebug
10. aosp_car_x86_64-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. m_e_mips64-eng
14. m_e_mips-userdebug
15. mini_emulator_x86_64-userdebug
16. mini_emulator_x86-userdebug
17. uml-userdebug
18. aosp_cf_x86_auto-userdebug
19. aosp_cf_x86_phone-userdebug
20. aosp_cf_x86_tablet-userdebug
21. aosp_cf_x86_tablet_3g-userdebug
22. aosp_cf_x86_tv-userdebug
23. aosp_cf_x86_wear-userdebug
24. aosp_cf_x86_64_auto-userdebug
25. aosp_cf_x86_64_phone-userdebug
26. aosp_cf_x86_64_tablet-userdebug
27. aosp_cf_x86_64_tablet_3g-userdebug
28. aosp_cf_x86_64_tv-userdebug
29. aosp_cf_x86_64_wear-userdebug
30. cf_x86_auto-userdebug
31. cf_x86_phone-userdebug
32. cf_x86_tablet-userdebug
33. cf_x86_tablet_3g-userdebug
34. cf_x86_tv-userdebug
35. cf_x86_wear-userdebug
36. cf_x86_64_auto-userdebug
37. cf_x86_64_phone-userdebug
38. cf_x86_64_tablet-userdebug
39. cf_x86_64_tablet_3g-userdebug
40. cf_x86_64_tv-userdebug
41. cf_x86_64_wear-userdebug
42. aosp_marlin-userdebug
43. aosp_marlin_svelte-userdebug
44. aosp_sailfish-userdebug
45. aosp_walleye-userdebug
46. aosp_walleye_test-userdebug
47. aosp_taimen-userdebug
48. hikey-userdebug
49. hikey64_only-userdebug
50. hikey960-userdebug
Which would you like? [aosp_arm-eng]
複製代碼
意思就是要你選擇編譯目標的格式,編譯目標的格式組成爲BUILD-BUILDTYPE,好比aosp_arm-eng
的BUILD爲aosp_arm,BUILDTYPE爲eng。
其中BUILD表示編譯出的鏡像能夠運行在什麼環境,aosp表明Android開源項目,arm表示系統是運行在arm架構的處理器上。 更多參考官方文檔。 BUILDTYPE 指的是編譯類型,有如下三種:
若是你沒有Nexus /ˈneksəs/ 設備,只想編譯完後運行在模擬器查看,那麼BUILD能夠選擇aosp_x86
,BUILDTYPE選擇eng,Which would you like? [aosp_arm-eng]
後面直接輸入對應序號5就能夠。
也能夠直接指定編譯的目標:
lunch aosp_x86-eng
複製代碼
或者(不一樣的系統版本,序號的對應會有差異,建議不要直接用序號)
lunch 5
複製代碼
3. 開始編譯
經過-jN參數來設置編譯的並行任務數,以提升編譯速度,在此前個人CPU核心數爲6,這裏N值最好選在6到12之間,這裏咱們設置6個並行任務進行編譯:
make -j6
複製代碼
整編成功後會打印相似以下內容:
因爲採用的是虛擬機整編,編譯速度會慢一些,這裏花費了2小時46分鐘. 最終會在 out/target/product/generic_x86/目錄生成了三個重要的鏡像文件: system.img、userdata.img、ramdisk.img。大概介紹着三個鏡像文件: system.img:系統鏡像,裏面包含了Android系統主要的目錄和文件,經過init.c進行解析並mount掛載到/system目錄下。 userdata.img:用戶鏡像,是Android系統中存放用戶數據的,經過init.c進行解析並mount掛載到/data目錄下。 ramdisk.img:根文件系統鏡像,包含一些啓動Android系統的重要文件,好比init.rc。
運行模擬器
在編譯完成以後,就能夠經過如下命令運行Android虛擬機了,命令以下:
source build/envsetup.sh
lunch aosp_x86-eng
emulator
複製代碼
若是是在編譯完後運行虛擬機,因爲以前已經執行過source和lunch命令了,能夠直接運行:
emulator
複製代碼
若是不出意外就會啓動模擬器,若是出現報錯,網上也有不少的解決方案。
好比咱們要編譯系統的Settings應用模塊, 在AOSP根目錄執行:
source build/envsetup.sh
lunch aosp_x86-eng
複製代碼
進入Settings的目錄:
cd packages/apps/Settings
複製代碼
mm編譯當前目錄下的模塊,不編譯依賴模塊。
mm
複製代碼
編譯成功後會有提示生成文件的存放路徑。
除了Settings.odex文件,還會在out/target/product/generic_x86/system/priv-app/Settings目錄下生成Settings.apk。
此外還有如下命令能夠進行單編:
若是你修改了源碼,想查看生成的APK文件,有兩種方式:
更多細節和內容見視頻:
B站地址: www.bilibili.com/video/BV1VU…
獨立博客地址: liuwangshu.cn/batcoder/ao…
做者簡介:劉望舒,騰訊雲最具價值專家,著有暢銷書《Android進階之光》《Android進階解密》《Android進階指北》,蟬聯四屆電子工業出版社年度優秀做者,前華爲面試官,現大廠技術負責人,谷歌開發者社區特邀講師。
也歡迎你們關注個人公號「劉望舒」,會分享大前端、Java相關的技術。