Android系統源碼閱讀(1):編譯
該系列只記錄閱讀代碼時遇到的問題和心得體會,具體代碼講解可以參考老羅的《Android系統源代碼情景分析》,我就不班門弄斧了。我編譯的AOSP版本:6.0.1_r50。
1. 編譯過程
參考官方,注意細節。
編譯版本6.0.1_r50
。
1.1 下載第三方二進制文件
如果想要將編譯好的img刷入物理設備,而不是虛擬機,一定要先下載好這些二進制文件,放在AOSP的根目錄下。
二進制文件下載。下載完畢後並解壓後,會有sh文件生成;運行sh文件,會在AOSP目錄下生成vendor/
文件夾,必要的文件會放在裏面。然後再執行編譯。
1.2 編譯
先清理一下舊的生成文件,個人認爲很有必要。
make clobber
然後設置環境變量:
$ source build/envsetup.sh
# 或者
$ . build/envsetup.sh
設置java 環境變量,這裏根據你的AOSP選擇java版本,設置適當的java路徑:
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
$ export PATH=$JAVA_HOME/bin:$PATH
設置緩存區域,根據自己情況設置:
export USE_CCACHE=1
export CCACHE_DIR=/home/tianchi/Project/.ccache
prebuilts/misc/linux-x86/ccache/ccache -M 50G
選擇需要編譯的目標:
$ launch
#選擇你想要編譯的版本
開始編譯,設置編譯時用到的內核數目,這裏寫4:
$ make -j4
稍等幾個小時,呵呵,奇蹟就會發生。生成的結果位於out/target/product/flo/
,flo
是我Nexus 7的型號,和launch時選擇的版本相同。
2. 刷入真機
將編譯好的img文件刷入設備比較容易,關鍵點在於前面步驟:下載了第三方包,選擇了正確的編譯版本。
重啓設備進入fastboot模式,使用命令,這裏刷入的Nexus7:
$ fastboot -p flo flashall
3. 啓動emulator問題
想要在虛擬機裏跑起來,需要在launch
步驟中選擇正確的虛擬機版本,默認第一個。
相關工具emulator和kernel-qemu默認放置目錄已經不在out/host/linux-xxx/bin
,已經遷移到prebuilts/android-emulator/linux-x86_64/emulator
和/prebuilts/qemu-kernel/x86_64/kernel-qemu
等相對應的位置。
常用的啓動命令:
prebuilts/android-emulator/linux-x86_64/emulator -kernel ./prebuilts/qemu-k ernel/x86_64/kernel-qemu -sysdir out/target/product/generic/ -system system.img -data userdata.img -ramdisk ramdisk.img
該命令啓動會出現各種各樣的問題,例如:
qemu: could not load initrd 'ramdisk.img'
雖然有人已經給出了相關解決方案,比如去掉-ramdisk ramdisk.img
,或者修改chmod -R 777 out/target/product/generic/
來增加權限,或者修改/prebuilts/qemu-k ernel/x86_64/kernel-qemu
爲合適的系統版本。這些解決方法有的不太有效,總之不是很優美,其實官方已經提供了一個啓動emulator的省心方法:
# 首先加入基本的環境變量
$ source build/envsetup.sh
# 選擇需要啓動的版本,這裏因爲我編譯的1,所以一定要選擇1.
$ lunch
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_deb-userdebug
8. aosp_flo-userdebug
9. full_fugu-userdebug
10. aosp_fugu-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. mini_emulator_mips-userdebug
14. mini_emulator_x86_64-userdebug
15. mini_emulator_x86-userdebug
16. aosp_flounder-userdebug
17. aosp_angler-userdebug
18. aosp_bullhead-userdebug
19. aosp_hammerhead-userdebug
20. aosp_hammerhead_fp-userdebug
21. aosp_shamu-userdebug
# 啓動emulator
$ emulator
4. 在Android Studio中閱讀源碼
Android工程師很地道,考慮到了如何方便的將項目導入AndroidStudio。在編譯完成,環境變量配置好的前提下,進行下面步驟。
4.1 生成idegen
編譯idegen:
$ mmm development/tools/idegen
運行idegen:
$ development/tools/idegen/idegen.sh
然後,你就回在AOSP目錄下發現`android.ipr`等文件。
4.2 導入
打開AndroidStudio,選擇導入已有的項目,選擇android.ipr。這裏需要導入一段時間。
導入後會發現錯誤百出。首先打開Project Structure,選擇`SDKs`添加一個SDK,我這裏需要1.7:
清理ClassPath下的所有jar包,然後保存。
選擇Project
,選擇Project SDK爲新建的SDK,Project language level也設置爲對應的等級。
選擇Modules
,在Dependencies
標籤下,刪除jar 依賴,最後如下:
然後在Modules
下,Sources
標籤下,選擇out/target/common/R
文件,選擇右鍵Source。
這裏一般情況下,會因爲R文件過大,導致依然報錯。這時需要修改AndroidStudio應用目錄下Android_Studio/bin/idea.properties
文件,找到filesize,將參數修改大一些。
idea.max.intellisense.filesize=5000
Android stack
這個圖應該時時回顧一下。