Android AOSP基礎(三)Android系統源碼的整編和單編

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

關聯繫列
Android AOSP基礎系列
Android系統啓動系列
應用進程啓動系列
Android深刻四大組件系列
Android深刻理解Context系列
Android深刻理解JNI系列
Android解析WindowManager
Android解析WMS系列
Android解析AMS系列
Android包管理機制系列
Android輸入系統系列前端

前言

在上一篇文章Android AOSP基礎(二)AOSP 源碼下載 中,咱們順利的將AOSP下載了下來,不少時候咱們不只僅須要去查看源碼,還有如下的幾個需求:android

  • 動態調試Android系統源碼
  • 定製Android系統
  • 將最新版本的Android系統刷入到本身的Android設備中
  • 將系統源碼導入到Android Studio中

爲了實現這些需求,就須要咱們去編譯系統源碼。git

1.編譯系統概述

瞭解如下一些概念,會對Android編譯系統有大概的瞭解。
Makefile
Android平臺的編譯系統,其實就是用Makefile寫出來的一個獨立項目。它定義了編譯的規則,實現了「自動化編譯」,不只把分散在數百個Git庫中的代碼整合起來、統一編譯, 並且還把產物分門別類地輸出到一個目錄,打包成手機ROM,還能夠生成應用開發時所使用的SDK、NDK等。 所以,採用Makefile編寫的編譯系統,也能夠稱爲Makefile編譯系統。 Android.mk
Makefile編譯系統的一部分,定義了一個模塊的必要參數,使模塊隨着平臺編譯。通俗來說就是告訴編譯系統,以什麼樣的規則編譯你的源代碼,並生成對應的目標文件。程序員

Ninja
Ninja是一個致力於速度的小型編譯系統,若是把其餘的編譯系統看做高級語言,那麼Ninja 目標就是彙編。docker

Soong
Soong是谷歌用來替代此前的Makefile編譯系統的替代品,負責解析Android.bp文件,並將之轉換爲Ninja文件ubuntu

Blueprint
Blueprint用來解析Android.bp文件翻譯成Ninja語法文件。bash

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

2.編譯源碼的方式

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

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

其中須要注意的是,Docker的最低支持版本爲Windows7,建議用Windows10環境下使用Docker,由於在Windows7種還須要藉助Docker Toolbox和VirtualBox中的容器進行通訊,效率相對低些。 考慮到大多數人的設備和上手難易程度,本爲講解在Linux中直接進行系統源碼編譯,若是你的系統不是Ubuntu,能夠查看Android AOSP基礎(一)VirtualBox 安裝 Ubuntu這篇文章。

3.準備編譯環境

1.安裝 jdk8

sudo apt-get update
sudo apt-get install openjdk-8-jdk
複製代碼

2.使用 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
複製代碼

3.設置處理器數量 在設置-->系統-->處理器選項,設置處理器數量,建議選擇能設置的最大值,這裏設置的是6。

4.源碼整編

整編就是編譯整個Android 源碼,整編主要有三個步驟,下面分別就行介紹。

1.初始化環境

在AOSP的根目錄,輸入以下的命令:

source build/envsetup.sh
// 編譯前刪除build文件夾A
make clobber
複製代碼

使用 build目錄中的envsetup.sh 腳本初始化環境,這個腳本會引入其餘的執行腳本。

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設備,只想編譯完後運行在模擬器查看,那麼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 5
emulator
複製代碼

若是是在編譯完後運行虛擬機,因爲以前已經執行過source和lunch命令了,能夠直接運行:

emulator
複製代碼

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

5.源碼單編

好比咱們要編譯系統的Settings應用模塊, 在AOSP根目錄執行:

source build/envsetup.sh
lunch 5
複製代碼

進入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,運行模擬器查看。

感謝:
www.jianshu.com/p/f514a9312…
wuxiaolong.me/2018/07/25/…
blog.csdn.net/nwpushuai/a…
note.qidong.name/2017/08/and…
www.jianshu.com/p/80013a768…
note.qidong.name/2017/08/and…


分享大前端、Android、Java等技術,助力5萬程序員成長進階。

相關文章
相關標籤/搜索