『BATcoder』 作了多年安卓還沒編譯過源碼?一個視頻帶你玩轉!

本文首發於微信公衆號「劉望舒」html

這是BATcoder的第五篇,BATcoder是Android進階三部曲的番外篇,會對Android進階三部曲的內容進行拓展和升級,會以視頻的形式分享給你們。至於爲啥叫BATcoder,這是由於我但願你們看了個人技術視頻能進入本身中意的大廠。前端

視頻版本

更多細節和內容見視頻:android

B站地址: www.bilibili.com/video/BV1VU…git

獨立博客地址: liuwangshu.cn/batcoder/ao…面試

前言

咱們順利的將AOSP下載了下來後,不少時候咱們不只僅須要去查看源碼,還有如下的幾個需求:docker

  • 1.定製Android系統
  • 2.將最新版本的Android系統刷入到本身的Android設備中
  • 3.將整個系統源碼導入到Android Studio中
  • 4.動態調試Android系統源碼

爲了實現這些需求,就須要咱們去編譯系統源碼。其中第三條和第四條也能夠不用編譯源碼來實現,第三條只要有對應Android源碼版本的android.iml 和 android.ipr 兩個文件就能夠將源碼導入到Android Studio中,第四條動態調試系統源碼不必定非要導入整個系統源碼進行調試。關於第三條和第四條的具體內容,我會在之後的內容中進行講解。ubuntu

1.編譯系統概述

瞭解如下一些概念,會對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的概念之間的聯繫爲:

VZRxYQ.png

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就是彙編語言。

2.編譯源碼的方式

Androd系統源碼編譯有不少種方式,主要有如下幾種:

  • 在Linux中直接進行系統源碼編譯(Android官方支持)
  • 在Mac OS中直接進行系統源碼編譯(Android官方支持)
  • 使用Docker編譯,支持Mac OS和Windows

其中須要注意的是,Docker的最低支持版本爲Windows7,建議用Windows10環境下使用Docker,由於在Windows7中還須要藉助Docker Toolbox和VirtualBox中的容器進行通訊,效率相對低些。 考慮到大多數人的設備和上手難易程度,本爲講解在Linux中直接進行系統源碼編譯。

3.準備編譯環境

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
複製代碼

4.源碼整編

整編就是編譯整個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 指的是編譯類型,有如下三種:

  • user:用來正式發佈到市場的版本,權限受限,如沒有 root 權限,不能 dedug,adb默認處於停用狀態。
  • userdebug:在user版本的基礎上開放了 root 權限和 debug 權限,adb默認處於啓用狀態。通常用於調試真機。
  • eng:開發工程師的版本,擁有最大的權限(root等),具備額外調試工具的開發配置。通常用於模擬器。

若是你沒有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
複製代碼

若是不出意外就會啓動模擬器,若是出現報錯,網上也有不少的解決方案。

5.源碼單編

好比咱們要編譯系統的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。

此外還有如下命令能夠進行單編:

  • mmm:編譯指定目錄下的模塊,不編譯它所依賴的其它模塊。
  • mma:編譯當前目錄下的模塊及其依賴項。
  • mmma:編譯指定路徑下全部模塊,而且包含依賴。

若是你修改了源碼,想查看生成的APK文件,有兩種方式:

  1. 經過adb push或者adb install 來安裝APK。
  2. 使用make snod命令,從新生成 system.img,運行模擬器查看。

更多細節和內容見視頻:

B站地址: www.bilibili.com/video/BV1VU…

獨立博客地址: liuwangshu.cn/batcoder/ao…

做者簡介:劉望舒,騰訊雲最具價值專家,著有暢銷書《Android進階之光》《Android進階解密》《Android進階指北》,蟬聯四屆電子工業出版社年度優秀做者,前華爲面試官,現大廠技術負責人,谷歌開發者社區特邀講師。

也歡迎你們關注個人公號「劉望舒」,會分享大前端、Java相關的技術。

6K75Eq.jpg

相關文章
相關標籤/搜索