Android系統源碼的整編和單編


# Android系統源碼的整編和單編

文章作者: 劉望舒

文章鏈接: http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html

前言

很多時候我們不僅僅需要去查看源碼,還有以下的幾個需求:

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

為了實現這些需求,就需要我們去編譯系統源碼。

Androd系統源碼編譯方式有很多種,主要有以下幾種:

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

其中需要注意的是,Docker的最低支持版本為Windows7,建議用Windows10環境下使用Docker,因為在Windows7種還需要借助Docker Toolbox和VirtualBox中的容器進行通信,效率相對低些。
考慮到大多數人的設備和上手難易程度,本為講解在Linux中直接進行系統源碼編譯,如果你的系統不是Ubuntu,可以查看VirtualBox 安裝 Ubuntu這篇文章。

編譯系統概述

了解以下一些概念,會對Android編譯系統有大概的了解。

Makefile

Android平台的編譯系統,其實就是用Makefile寫出來的一個獨立項目。它定義了編譯的規則,實現了“自動化編譯”,不僅把分散在數百個Git庫中的代碼整合起來、統一編譯, 而且還把產物分門別類地輸出到一個目錄,打包成手機ROM,還可以生成應用開發時所使用的SDK、NDK等。

因此,采用Makefile編寫的編譯系統,也可以稱為Makefile編譯系統。

Android.mk

Makefile編譯系統的一部分,定義了一個模塊的必要參數,使模塊隨着平台編譯。通俗來講就是告訴編譯系統,以什么樣的規則編譯你的源代碼,並生成對應的目標文件。

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

准備編譯環境

安裝 jdk8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

使用 ubuntu 14+,需要安裝以下依賴包:

sudo apt-get install -y 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

(針對虛擬機)設置處理器數量

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

源碼整編

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

初始化環境

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

source build/envsetup.sh
# 編譯前刪除build文件夾A
make clobber

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

選擇編譯目標

輸入命令:

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

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

開始編譯
通過-jN參數來設置編譯的並行任務數,以提高編譯速度,在此前我的CPU核心數為6,這里N值最好選在6到12之間,這里我們設置6個並行任務進行編譯:

make -j6

整編成功后會打印類似如下內容:
img

由於采用的是虛擬機整編,編譯速度會慢一些,這里花費了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

如果不出意外就會啟動模擬器,如果出現報錯,網上也有很多的解決方案。

源碼單編

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

source build/envsetup.sh
lunch 5

進入Settings的目錄:

cd packages/apps/Settings

mm編譯當前目錄下的模塊,不編譯依賴模塊。

mm

編譯成功后會有提示生成文件的存放路徑。

img

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM