「Do.016」AS不用編譯,閱讀Android原始碼
首發公眾號:Android程式設計師日記 作者:賢榆的榆 如果你覺得有幫助歡迎關注、讚賞、轉發 閱讀時間:2616字 6分鐘
寫在前面
很早就像自己搭一個Android原始碼閱讀環境,折騰了幾次無果,就擱置了。最近有點閒暇時間,再加上也覺得是時候更深刻的認識Android系統了,所以再折騰了一次,沒想到成功了,而且是用AndroidStudio閱讀,還是那個熟悉的介面,還是那個熟悉的快捷鍵,哈哈,你也試試?
首先呢,之前有研究過用AndroidStudio閱讀原始碼的,應該都知道,如果想用AS閱讀Android原始碼差不多分這樣四個步驟
- Step 1: 下載原始碼
- Step 2: 編譯原始碼
- Step 3: 用AS匯入原始碼
- Step 4: 閱讀原始碼
嘗試過的朋友就知道,編譯原始碼這個步驟應該是一個比較讓人難過的過程。可能你的編譯花的時間比你下載還長。不過在嘗試了很多次之後,我也完美的搭好了AS閱讀原始碼的環境。下面我就告訴大家如何做到不用編譯就能匯入AS閱讀Android原始碼。
Android原始碼閱讀環境搭建
1、下載初始化原始碼庫
AOSP(Android Open Source Project)初始化包下載地址: 將該網址複製到瀏覽器即可下載,迅雷好像不能使用,至少我的沒用。另外需要注意的是,下載的過程中,不要合上電腦。我都下載了18g就因為合了一下電腦,結果就要從頭再來了。
2、下載repo工具
差不多下載最新的初始化包,你需要好幾個小時,網速不好,甚至要10幾個小時。那麼在這個過程中我就可以把後面同步和檢出程式碼需要的的repo工具安裝一下,在命令列中執行如下程式碼,(我的是mac,win的話,大家可以google一下對應的教程,應該會有很多)
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
3、同步並檢出原始碼專案
下載完成以後會得到一個37g的以aosp-latest命名的tar檔案,然後將其解壓可以看到裡面有一個.repo
Command+Shift+ .
)
接下來使用命令列進入到解壓的根目錄然後執行repo sync
,然後就可以同步到最新的分支,並檢出其master分支。
當然你也可以不同步直接使用 repo sync -l
來檢出repo裡面的原始碼專案。
檢出後的效果是這樣的:
4、關鍵一步——放入編譯檔案
其實之所以需要編譯,這個和我們的Android專案是一個道理,我們從github上拉下來的開源Android專案也是沒有.iml等配置檔案的,需要我們自己再編譯一邊,才能讓這個專案裡的個檔案在AS關聯起來。
那麼在這裡之所以不用編譯,不是真的無需編譯。而是有一位簡書ID是difcareer的小夥伴已經幫我們把各個版本需要的AS配置檔案已經編譯好,我們只需要將它下載下來放到專案的根目錄就ok了。 as配置檔案git地址:
注:
如果你忘了自己原始碼檢出的版本可以通過如下方式檢視:
根據目錄’/build/core/version_defaults.mk’ 開啟version_defaults.mk檔案,然後找到PLATFORM_SDK_VERSION
這個關鍵字的值,就可以在下表中找出相應的版本。
如果是28 當然就是Android 9.0了
5、將原始碼專案匯入到AS
準備工作已經做完了下面就可以像匯入一個Android專案一樣匯入AOSP目錄了。進入AOSP目錄選擇被識別出來的.ipr
檔案,然後點選open即可。
這裡有兩個個問題需要注意一下:
-
第一次匯入的時候,可能你看到的只有那幾個剛才放入的配置檔案,而看不到其他的目錄,這個時候需要點選
File->Invalidate Cashes/Restart...
,讓AS重新啟動編譯一下專案。 這個編譯的狀態差不多會持續10幾分鐘。然後將右邊檔案目錄切換到Project模式下: -
如果出現迴圈執行任務
Scanning file to index....
不動 解決辦法如下(Open module setting --> Modules --> 找到gen資料夾 --> 選擇Resources
)
6、好了匯入成功
那麼接下來我們就可以自由的翱遊在Android原始碼的海洋了,讓我們來看一下吧!
最後,要感謝一下「程式碼GG之家」的明哥,8年Android手機開發的老大哥。在原始碼閱讀環境搭建和原始碼閱讀方式與技巧上都給我很大的幫助。這裡我把明哥在星球裡的回答貼出來分享一下: 另外,我也強烈推薦明哥的「Android答疑解惑」星球。**畢竟,成長的道路上,我們需要弄清的不是距離起點有多遠,而是距離下一個終點有多近。**我相信明哥會是那個讓能夠告訴你離終點有多近的人。