Framework學習之下載AOSP源碼編譯詳解
一.準備工作
Android 官方聲明 AOSP 歷來是在 Ubuntu LTS 版本中進行開發(fā)和測試。所以為了避免任何其他不必要的麻煩,請使用 Ubuntu 及其他基于 Ubuntu 的發(fā)行版
最低環(huán)境要求:
- Ubuntu 14.04+
- JDK1.8+
- python3
- GNU make
- git
二.下載Aosp源碼
1.安裝GIT
首先需要安裝Git,因為源碼是用Git管理的。
接下來創(chuàng)建一個bin文件夾,并加入到PATH中,有點像Windows的環(huán)境變量。
2.安裝Python環(huán)境
3.安裝repo及配置
repo 是一個python 腳本(所以我們上面要配置Python環(huán)境),因為Android源碼包含數(shù)百個git庫,簡化幫助管理git Android版本庫的工具。
(1)安裝curl下載的庫:
(2)下載repo并設置可以運行權限。
(3)添加下載源
google 的AOSP 的話,因為FQ和數(shù)據(jù)量太大,且需要需要翻墻影響速度,因此優(yōu)先考慮國內的鏡像(本文使用的是清華的源)。
4.初始化及同步源碼
(1)創(chuàng)建文件夾
創(chuàng)建一個AOSP文件夾,cdd到文件夾里面去待會兒需要把源碼下載到這里:
(2)初始化Aosp倉庫
(3)初始化并指定版本
AOSP對應關系查看地址: 對應關系
(4)開始同步源碼
因為Android的源碼越來越大,repo sync失敗的概率也越來越高。所以我們可以避開使用repo sync的方式,而采用下載預下載包的方式來實現(xiàn)下載源碼
5.預下載包的方式
1. 下載預下載包
2. 解壓預下載包
3. 查看分支
4. 在aosp目錄選擇需要同步的版本
5.防止下載源碼執(zhí)行腳本卡死
通過自定義Shell腳本啟動源碼下載可以有效防止,同步源碼時腳本被卡死的問題。
(1)在AOSP文件夾中新建down.sh文件
(2)執(zhí)行down.sh文件
sh down.sh
三.AOSP源碼目錄結構
- abi Application Binary Interface 應用程序二進制接口,abi相信同學們在SO庫調用上遇到過,如果不支持該平臺的話就說不ABI不支持
- art Android Runtime 安卓運行時。這個會提前把字節(jié)碼編譯成二進制機器碼保存起來,執(zhí)行的時候加載速度比較快。Dalvik虛擬機則是在加載以后再去編譯的,所以速度上ART會比Dalvik快一點。犧牲空間來贏取時間
- bionic 基礎庫,Android系統(tǒng)與Linux內核的橋梁。Bionic 音標為 bī??nik,翻譯為"仿生"
- bootable 系統(tǒng)啟動引導相關程序
- build 用于構建Android系統(tǒng)的工具,也就是用于編譯Android系統(tǒng)的
- cts Compatibility Test Suite 兼容性測試
- dalvik dalvik虛擬機,用于解析執(zhí)行dex文件的虛擬機
- developers 開發(fā)者目錄
- developerment 開發(fā)目錄,比如說應用,application就在里面了,apps
- devices 設備相關的配置信息,什么索尼、HTC、自己的產品,就可以定義在這個目錄下了
- docs 文檔
- external 開源模組相關文件
- frameworks 系統(tǒng)架構,Android的核心了
- hardware hal層代碼,硬件抽象層
- libcore 核心庫
- libnativehelper native幫助庫,實現(xiàn)JNI的相關文件
- ndk native development kit
- out 輸出目錄,編譯以后生成的目錄,相關的產出就在這里了
- packages 應用程序包。一些系統(tǒng)的應用就在這里了,比如說藍牙,Launcher,相機,撥號之類的。
- pdk Plug-in Development Kit (PDK) is designed to help you build your own pattern projects
- platform_testing 平臺測試
- prebuilts x86/arm架構下預編譯的文件
- sdk software development kit
- system 底層系統(tǒng)文件
- toolchain 工具鏈
- tools 工具文件
- Makefile mk文件,用于控制編譯
四.AOSP源碼整編
編譯AOSP源碼需要配置好JAVA環(huán)境.
1.安裝Java編譯環(huán)境
2.進入AOSP文件夾,進行編譯
(1)初始化編譯環(huán)境
(2)刪除上一次編譯的結果,初次編譯可以不需要這一步
(3)選擇與設備對應的編譯版本
選擇與設備對應的編譯版本.如:編譯開發(fā)工程師的版本lunch aosp_x86-eng,可以方便debug
編譯版本選擇
如果lunch命令沒有加對應的編譯版本則會有以下信息輸出:
這里需要選擇編譯目標的格式(選擇前面的序號,按回車即可),編譯目標的格式組成為BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD為aosp_arm,BUILDTYPE為eng。 其中BUILD表示編譯出的鏡像可以運行在什么環(huán)境,aosp代表Android開源項目,arm表示系統(tǒng)是運行在arm架構的處理器上;
BUILDTYPE 指的是編譯類型,有以下三種:
- user:用來正式發(fā)布到市場的版本,權限受限,如沒有 root 權限,不能 dedug,adb默認處于停用狀態(tài)。
- userdebug:在user版本的基礎上開放了 root 權限和 debug 權限,adb默認處于啟用狀態(tài)。一般用于調試真機。
- eng:開發(fā)工程師的版本,擁有最大的權限(root等),具有額外調試工具的開發(fā)配置。一般用于模擬器。
- 如果你沒有Nexus設備,只想編譯完后運行在模擬器查看,那么BUILD可以選擇aosp_x86,BUILDTYPE選擇eng。
(4)開始編譯
j后面數(shù)字幾就是多少線程,最多不超過你的cpu總線程,
編譯成功會顯示如下:
會在源碼跟目錄out/target/product/angler目錄下生成鏡像文件:
- system.img:系統(tǒng)鏡像
- ramdisk.img:根文件系統(tǒng)鏡像
- userdata.img:用戶數(shù)據(jù)鏡像
- recovery.img:recovery鏡像
- boot.img:啟動鏡像
- vendor.img:驅動鏡像
最終會在 out/target/product/generic_x86/目錄生成了三個重要的鏡像文件: system.img、userdata.img、ramdisk.img。大概介紹著三個鏡像文件:
- system.img:系統(tǒng)鏡像,里面包含了Android系統(tǒng)主要的目錄和文件,通過init.c進行解析并mount掛載到/system目錄下。
- userdata.img:用戶鏡像,是Android系統(tǒng)中存放用戶數(shù)據(jù)的,通過init.c進行解析并mount掛載到/data目錄下。
- ramdisk.img:根文件系統(tǒng)鏡像,包含一些啟動Android系統(tǒng)的重要文件,比如init.rc。
3.編譯錯誤解決
(1)缺少libncurses.so.5
報錯信息:
解決方式:
(2)缺少M4
報錯信息:
解決方式:
(3)去除所有本地化設置
報錯信息:
解決方法:
(4)xmllint的問題
報錯信息:
解決方案:
(5)編譯內存不足
報錯信息
解決方案:
五.運行模擬器
啟動模擬器
在編譯完成之后,就可以通過以下命令運行Android虛擬機了,由于之前已經(jīng)執(zhí)行過source和lunch命令了,可以直接運行:
就會啟動模擬器
六.AOSP源碼編譯某個單獨的模塊
上面的編譯我們都是對整個Android系統(tǒng)進行編譯的.如果我們要編譯系統(tǒng)的Settings應用模塊,這就屬于源碼單編某一個模塊.
在AOSP根目錄執(zhí)行:
進入Settings的目錄:
通過mm編譯當前目錄下的模塊,不編譯依賴模塊。
mm
編譯成功后會有提示生成文件的存放路徑。除了Settings.odex文件,還會在out/target/product/generic_x86/system/priv-app/Settings目錄下生成Settings.apk。
此外還有以下命令可以進行單編:
- mmm:編譯指定目錄下的模塊,不編譯它所依賴的其它模塊。
- mma:編譯當前目錄下的模塊及其依賴項。
- mmma:編譯指定路徑下所有模塊,并且包含依賴。
如果對系統(tǒng)模塊的源碼進行修改,查看生成的APK文件,有兩種方式:
- 通過adb push或者adb install 來安裝APK。
- 使用make snod命令,重新生成 system.img,運行模擬器查看