想成為一位合格的Android程式員或者一位Android高級工程師是十分有必要知道Android的框架層的工作原理,要知道其工作原理那麼就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯。為什麼要閱讀Android源代碼? 第一,面試加分項。第二, ...
想成為一位合格的Android程式員或者一位Android高級工程師是十分有必要知道Android的框架層的工作原理,要知道其工作原理那麼就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯。為什麼要閱讀Android源代碼? 第一,面試加分項。第二,知其原理寫出的代碼差不到那裡。第三,學習深度。正所謂,知其然知其所以然。下麵記錄我基於7.1.1系統源碼下載到刷機的過程。
基本概念
- AOSP : 就是Android Open Source Project也就是谷歌開放源代碼項目。 通過Google官方下載的源代碼也就是AOSP的代碼,是不包含Google開發的全家桶的應用。 ps: 這個作為一個Android程式員肯定要知道的一個專業詞,不然顯得你很Low,很不專業。
- Repo : Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git,換句話來說Repo是用來管理Git管理的每個倉庫。詳情定義請點擊here.
準備
- 編譯系統:UbuntuKylin 16.04 LTS。
- 手機:Nexus 6。
- 驅動:Nexus 6驅動。
- Android系統:Android 7.1.1。
註:從Android官網上是否有支持該手機的系統源代碼和驅動程式。
搭建編譯環境
1.安裝 JDK
如果 Ubuntu >= 15.04,則可以運行以下命令進行安裝OpenJDK,這裡使用的是OpenJDK. 之前準備使用Ubuntu LTS 14.04版本編譯,但是安裝OpenJDK有點麻煩所以放棄使用Ubuntu LTS 14.04。
sudo apt-get update sudo apt-get install openjdk-8-jdk
如果你不是編譯Android 7.1.1系統源碼,那麼可以參考圖中的Android版本所對應的JDK版本進行安裝。
2.主要軟體包
- Python : Python 2.6 - 2.7.
- Git : Git 1.7 或更高版本.
下載源代碼
我這裡下載的Google官方的AOSP, 下載官方的需要科學上網並且保證你的網路穩定。具體在清華大學開源軟體鏡像站的AOSP,可以參考這裡的設置here。
- 安裝 Repo
1 . 確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中:
$ mkdir ~/bin $ PATH=~/bin:$PATH
2 . 下載 Repo 工具,並確保它可執行:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
- 初始化 Repo 客戶端
安裝 Repo 後,設置您的客戶端以訪問 Android 源代碼代碼庫: 1 . 創建一個空目錄來存放您的工作文件。
$ mkdir AndroidSource // AndroidSource這個是我自己命名存放源代碼的目錄名稱 $ cd AndroidSource
- 使用您的真實姓名和電子郵件地址配置 Git。如果你設置了Git的配置則跳過這一步。
$ git config --global user.name "Your Name" $ git config --global user.email "[email protected]"
- 運行 repo init進行初始化。以下-b進行檢出相對應的分支,要查看分支列表,請參閱源代碼標記和編譯版本。
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57
初始化成功後,客戶端目錄中現在應包含一個 .repo 目錄,清單等文件將保存在該目錄下。
下載 Android 源代碼樹
然後將 Android 源代碼樹從預設清單中指定的代碼庫下載到工作目錄,運行以下命令:
$ repo sync
在下載的時候保證網路的穩定性,保證電腦設置了不休眠,可以晚上放著讓它下載。下載完大概30G左右。 下載源碼出現的問題不會太多,有問題的話大多數為網路的問題,真正出問題最多的是源代碼的編譯,那簡直就是惡夢。
準備編譯
下載專有二進位文件
我需要將編譯的源代碼刷到Nexus6,所以需要下載Nexus6的相對應的驅動。 具體找到系統版本對應手機型號相對應的驅動二進位文件可以在這裡找到here。
然後將這三個壓縮包下載後,解壓縮得到三個sh文件。 將這三個sh文件copy到Android編譯目錄下。
$ ./extract-broadcom-shamu.sh $ ./extract-moto-shamu.sh $ ./extract-qcom-shamu.sh
運行以上命令後會顯示聲明信息,一直按回車,當你看到以下信息就輸入:I ACCEPT就可以了。不要按得太快,很容易跳了輸入接受。。。。
Jack配置
Jack 是一種 Android 工具鏈,用於將 Java 源代碼編譯成 Android dex 位元組碼。要使用 Jack,您只需使用標準的 Makefile 命令來編譯源代碼樹或您的項目即可,無需進行任何其他操作。Android 8.1 是使用 Jack 的最後一個版本。
在 2017 年 3 月 14 日公告發佈之後,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的預設 Android 編譯工具鏈。
如果你編譯AOSP的master分支,以及Android O及以後版本,Android提供了禁用的支持。具體可以參考 here。
在編譯7.1.1源碼的時候,我並沒有查怎麼關閉Jack編譯。所以,需要檢查一下Jack-Server是否已經安裝以及啟動。
-
根據機器的RAM設置Jack-Server的VM大小,我機器是16G記憶體,所以設置8G左右VM。 修改prebuilts/sdk/tools/jack-admin 文件,找到變數JACK_SERVER_VM_ARGUMENTS位置在後面添加,添加參數 -Xmx8000M
-
進入prebuilts/sdk/tools 運行以下命令:
$ ./jack-admin start-server
- 如果提示沒有安裝的話,則運行以下命令,然後再次運行上面啟動jack-server的命令。
$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
保證Jack-Server服務啟動。不然在編譯的時候會遇到Jack-Server很多坑的。。。
設置環境
使用 envsetup.sh 腳本進行初始化環境。
$ source build/envsetup.sh
使用 lunch 選擇要編譯的目標。
$ lunch
運行以上命令後,會列出當前所有的Build Type,然後輸入23。這裡我選擇23. aosp_shamu-userdebug,這個Build Type是可以調試,所以建議你選擇userdebug。具體可以參考這裡的解析 here。
編譯代碼
make -j8 //-j8是並行的任務數,根據機器CPU的內核線程數來設置。
編譯過程遇到的問題
- 編譯百分比之0就報出來的錯誤,m4沒有安裝。
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -o/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll" flex-2.5.39:嚴重內部錯誤,exec of /usr/bin/m4 failed [ 0% 8/49773] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d --defines=/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o /home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy" [ 0% 8/49773] host C++: ijar <= build/tools/ijar/classfile.cc ninja: build stopped: subcommand failed. build/core/ninja.mk:151: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper] Error 1
解決方法:
sudo apt-get install m4
- 編譯百分之一的時候報的錯誤,bison 沒有安裝。
解決方法:
1. sudo apt-get install bison 2. sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
- 其中編譯過程有Jack-Server也報的問題,有沒有安裝,沒有啟動的問題,那時候急著解決問題,所以沒有相對應的截圖。所以我在上面也寫保證Jack-Server先安裝啟動,不然在後面的編譯7.1.1源碼會報錯。在編譯的過程中,我的機器暫時沒有報Jack-Server記憶體不足的錯誤。如果你使用虛擬機進行編譯時,記憶體至少要8G,不然會報記憶體不足的編譯錯誤。
編譯的時候遇到的坑遠遠不止以上的問題,有些沒有記錄下來。。。
編譯失敗後,我都是重新手動刪掉out目錄,以避免出現更多的問題,然後重新運行上面的>設置環境步驟。
- 經過幾天的努力與堅持,終於編譯成功了,激動~~
使用 fastboot 刷機
首先,保證已經unlock解鎖 可以正常刷機。具體怎麼解鎖Google一下。刷機前,請備份好個人重要的資料,刷機會將所有資料都會清空。 然後,連上電腦。 接著,在源碼根目錄下(就是下載源代碼的目錄)執行下麵命令:
End
在這裡整一個過程就結束了,但是這隻是閱讀源代碼的一個新開始!接然的還有如何將AOSP導入到Android Studio進行閱讀以及調試和如何閱讀。雖然這個過程辛苦,但是這是值得的,一起加油努力學習~~
更多編譯錯誤鏈接:https://ichrisking.github.io/2017/08/25/rom7.0-build/