將AOSP原始碼匯入到Android Studio進行檢視
阿新 • • 發佈:2021-02-21
## 生成iml和ipr檔案
```shell
source build/envsetup.sh
lunch aosp_x86-eng # 或者直接輸入lunch,然後選擇對應的target
make idegen
development/tools/idegen/idegen.sh
```
說明:
1. 執行`source build/envsetup.sh`和`./build/envsetup.sh`是一樣的。
2. 可以直接執行`lunch aosp_x86-eng`直接根據傳入引數進行構建,也可以輸入`lunch`根據提示進行選擇。
3. 執行完`lunch`命令後直接執行`make idegen`即可,有些教程說需要先執行`make`命令,這是不需要的,我們只需要構建`idegen`模組,不需要構建所有模組。後者要花費很長時間,而且對機器效能要求很高。
4. 命令執行過程中有些提示選項,如果沒有報錯導致中斷,可以暫時忽略。
5. 有的教程說使用`mmm development/tools/idegen/`代替`make idegen`,如果你仔細瞭解AOSP構建系統,會清楚他們的功能是類似的。
6. 執行`development/tools/idegen/idegen.sh`,可能會提示許可權相關問題,如果沒有中斷程式可以暫時忽略,有的教程建議增加`sudo`字首提升命令執行許可權,這裡不推薦,因為之前如果`source build/envsetup.sh`是以普通使用者執行的,所有的構建環境都是以普通使用者為前提的,提升許可權可能會導致問題,比如`java: 未找到命令`
7. 以上命令成功執行後會在根目錄生成`android.iml`/`android.ipr`,兩個檔案。
## 將程式碼匯入到Android Studio
絕大部分人的AOSP原始碼是放置到遠端Linux機器上的,如果本地機和遠端機間網路頻寬很高,可以直接通過Samba伺服器在本地機中訪問遠端機的AOSP原始碼。網路不是很好可以選擇在本地機上進行一個目錄,然後把`android.iml`/`android.ipr`以及需要檢視的AOSP原始碼目錄同步到該目錄中,同步方式有很多,比如FTP/rsync等。
如果使用rsync進行同步,可以參考以下命令:
```shell
rsync -az --progress --delete --exclude=".git" ${USER_NAME}@${IP}:/${REMOTE_DIR} ${LOCAL_DIR} # REMOTE_DIR->LOCAL_DIR
rsync -az --progress --delete --exclude=".git" ${LOCAL_DIR} ${USER_NAME}@${IP}:/${REMOTE_DIR} # LOCAL_DIR->REMOTE_DIR
```
如果使用FTP命令,由於檔案數目較多,直接下載或者上傳目錄耗時比較長,可以考慮使用`tar`將需要的檔案和目錄打包,然後再進行同步。
我選擇的是把`android.iml`/`android.ipr`以及`frameworks`目錄同步到本地。開啟Android Studio,`Open an Existed Project`,選擇`android.ipr`,匯入時間根據機器效能以及原始碼規模相關,可能比較長。
* `android.iml`檔案中有目錄的配置,如果開啟整個工程非常慢,可以把裡面無關的目錄刪除或者改到excludeFolder中。
* 如果程式碼跳轉到jar包的反編譯檔案中而不是匯入的原始碼中,可以`File->Project Structure->Project Settings->Moudules->Dependencies`,把`Module source`調整到最頂端(Alt+Up)。
* Android Studio預設只能開啟10個程式碼檔案,且檔案開啟多了以後顯示不開的檔案還會被隱藏,需要點選最右邊的箭頭才能檢視。而最致命的是,如果不小心修改了某個檔案,在標籤頁上,不會有任何的提示。`File->Settings->Editor->General->Editor Tabs`根據自己的習慣進行配置。
* Android Studio只支援Java程式碼,C++程式碼只有最基礎的著色功能。
* 如果想要支援斷點除錯,按照如下步驟操作:
* `File->Project Structure->Project Settings->Project->Project SDK`,選擇`Android API .. Platform`
* `Run->Edit Configurations->Add New Configuration->Android App`,然後直接儲存。
* 此時可以使用Attach To Process進行除錯。除錯要注意原始碼和手機版本匹配。service相關程式碼需要attach到system_process程序。
## 另一種利用Android Studio檢視AOSP原始碼的方式
還有另一種不需要`android.iml`/`android.ipr`就可以檢視AOSP原始碼的方式:
1. 使用Android Studio建立一個簡單的demo工程,確保編譯通過。
2. 在`app/build.gradle`檔案的`android`節點下增加如下配置,其中路徑是自己想檢視的AOSP原始碼路徑,可以是本地路徑也可以是遠端路徑:
```gradle
sourceSets {
main.java.srcDirs += 'D:\\Code\\sync\\android-11.0.0_r27\\frameworks\\base\\services\\core\\java'
main.resources.srcDirs += 'D:\\Code\\sync\\android-11.0.0_r27\\frameworks\\base\\core\\res\\res'
}
```
當然這種方式如果在自己想要檢視的路徑比較多時,自己手工配置路徑會比較麻煩。
## 參考資料
* Android Studio匯入整個Android系統原始碼:
* 使用Android Studio匯入Android系統原始碼:
* AndroidStudio工程匯入部分Android原始碼: