Android系統源碼閱讀(1):編譯

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

這個圖應該時時回顧一下。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章