想成爲一位合格的Android程序員或者一位Android高級工程師是十分有必要知道Android的框架層的工做原理,要知道其工做原理那麼就須要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的確定是本身親手下載編譯。爲何要閱讀Android源代碼? 第一,面試加分項。第二,知其原理寫出的代碼差不到那裏。第三,學習深度。正所謂,知其然知其因此然。下面記錄我基於7.1.1系統源碼下載到刷機的過程。javascript
注:從Android官網上是否有支持該手機的系統源代碼和驅動程序。html
若是 Ubuntu >= 15.04,則能夠運行如下命令進行安裝OpenJDK,這裏使用的是OpenJDK. 以前準備使用Ubuntu LTS 14.04版本編譯,可是安裝OpenJDK有點麻煩因此放棄使用Ubuntu LTS 14.04。java
sudo apt-get update
sudo apt-get install openjdk-8-jdk
若是你不是編譯Android 7.1.1系統源碼,那麼能夠參考圖中的Android版本所對應的JDK版本進行安裝。 linux
我這裏下載的Google官方的AOSP, 下載官方的須要***而且保證你的網絡穩定。具體在清華大學開源軟件鏡像站的AOSP,能夠參考這裏的設置here。android
1 . 確保主目錄下有一個 bin/ 目錄,而且該目錄包含在路徑中:nginx
$ mkdir ~/bin $ PATH=~/bin:$PATH
2 . 下載 Repo 工具,並確保它可執行:git
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
安裝 Repo 後,設置您的客戶端以訪問 Android 源代碼代碼庫: 1 . 建立一個空目錄來存放您的工做文件。程序員
$ mkdir AndroidSource // AndroidSource這個是我本身命名存放源代碼的目錄名稱 $ cd AndroidSource
$ git config --global user.name "Your Name" $ git config --global user.email "you@example.com"
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57
初始化成功後,客戶端目錄中如今應包含一個 .repo 目錄,清單等文件將保存在該目錄下。github
而後將 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 是一種 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-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的內核線程數來設置。
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
解決方法:
1. sudo apt-get install bison 2. sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
編譯的時候遇到的坑遠遠不止以上的問題,有些沒有記錄下來。。。
編譯失敗後,我都是從新手動刪掉out目錄,以免出現更多的問題,而後從新運行上面的>設置環境步驟。
首先,保證已經unlock解鎖 能夠正常刷機。具體怎麼解鎖Google一下。刷機前,請備份好我的重要的資料,刷機會將全部資料都會清空。 而後,連上電腦。 接着,在源碼根目錄下(就是下載源代碼的目錄)執行下面命令:
$ adb reboot bootloader //進入bootloader模式 $ fastboot -w flashall //使用fastboot進行刷機
在這裏整一個過程就結束了,可是這只是閱讀源代碼的一個新開始!接然的還有如何將AOSP導入到Android Studio進行閱讀以及調試和如何閱讀。雖然這個過程辛苦,可是這是值得的,一塊兒加油努力學習~~
更多編譯錯誤連接:https://ichrisking.github.io/2017/08/25/rom7.0-build/