音視頻開發之旅(57) -如何方便的查看AndroidNative源碼

目錄

  1. 背景
  2. Android源碼下載
  3. 源碼編譯及遇到的問題
  4. 使用CLion 導入
  5. 資料
  6. 收穫

一、背景

對Framework層的瞭解學習是我們進階的一個重要階段。通過 AS 查看 Framework 代碼體驗非常好,無論是索引還是界面都讓人很滿意,但是當你跟蹤代碼,發現進入 native 邏輯時,就會發現 Android Studio 對 native 代碼的支持非常不好,不能索引不支持符號搜索不能跳轉等。

網頁上可以通過cs.android.com 或者 http://androidxref.com/ 比較方便的查看源碼。但是還是不夠,因爲我們如果想系統的追蹤分析流程,往往會需要跳來跳去,有時候還會加些註釋。這時候網頁端的就不太方便。如果能在本地端方便的實現上述功能,可定是一個比較高效率而有愉悅的事情。

Source Insight可以比較方便的進行跳轉,但是隻是在window支持(雖然Mac上可以通過Parallels 方便的安裝window環境;Ubuntu上也可以win的方式使用Source Insight但是總是不太方便)。

那麼有沒有其他的工具或者方式,比較方便的查看native代碼吶?

可以通過CLion導入,但是需要有對應的cmakelist,這就需要對下載源碼,然後進行編譯,然後再用CLion導入。下面我們來看下具體的實踐。

二、Android源碼下載

查看官方文檔
主要分爲3步,

  1. 下載安裝repo 啓動器
  2. 下載mainfest
  3. 開始sync下載: repo sync -c -j8
    其中第2步配置manifest時需要注意,如果直接使用epo init -u https://android.googlesource.com/platform/manifest -b master 因爲網絡原因會比較難下載成功。 我們可以使用清華的鏡像來配置 `repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b master
    即將 https://android.googlesource.com/ 全部使用 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/ 代替即可

清華大學-Android 鏡像使用幫助

還有一點需要注意,如果沒有特殊的要求,可以根據需要下載對應的分支,比如上面第2步中配置的是 master分支,這樣只會同步master最新分支,保證代碼的最新和下載的量比較小比較快。

如果是linux系統就可以直接進入編譯階段。但是如果是mac上如果只是按照上面的操作進入編譯,就會遇到問題。我們在編譯階段來一起看下,怎麼處理。

三、源碼編譯及遇到的問題

3.1 配置和編譯命令

  1. 編譯前配置下生成cmakelist文件這樣後面纔可以使用CLion導入
export SOONG_GEN_CMAKEFILES=1
export SOONG_GEN_CMAKEFILES_DEBUG=1
  1. 然後執行envsetup.sh腳本 進行配置
. envsetup.sh
  1. 再執行 choosecombo ,這個命令用阿里選擇編譯目標,比如硬件平臺、開發者還是使用者等,一般默認配置就好。

  2. 最後開始make。 make -j8

Android平臺提供了三個命令用於編譯,它們分別是make、mmm和mm
make 用於編譯整個系統,時間比較長,
make xxx:用於編譯某個模塊,比如編譯framework。 make framework即可
mmm xxx:用於編譯指定目錄下的模塊,不會編譯它依賴的模塊
mm xxx: 該命令和mmm差不多,區別在於它會先cd到xxx目錄然後在編譯。

在具體的編譯中遇到了很多問題,彙總如下。

3.2 編譯中遇到的問題

問題1: Mac make時報如下錯誤

% make -j16 frameworks

19:44:38 You are building on a case-insensitive filesystem.
19:44:38 Please move your source tree to a case-sensitive filesystem.
19:44:38 ************************************************************
19:44:38 Case-insensitive filesystems not supported
#### failed to build some targets (1 seconds) ####

這個問題就是上面提到的,如果是linux系統可以直接編譯,但是如果是mac系統編譯就會遇到這個問題。
問題的原因是

在默認安裝過程中,Mac OS 會在一個保留大小寫但不區分大小寫的文件系統中運行。Git 並不支持此類文件系統,而且此類文件系統會導致某些 Git 命令(例如 git status)的行爲出現異常
參考: https://source.android.com/source/initializing#setting-up-a-mac-os-x-build-environmentMove Android source into case-sensitive image

那麼該如何解決吶?

上面鏈接給出的建議始終在區分大小寫的文件系統中對 AOSP 源文件進行操作
有了適當的文件系統,在新型 Mac OS 環境中編譯 master 分支就會變得非常簡單

但是我代碼已經下載好了。。。。,

所以只能在創建下區分大小寫的文件系統,然後把代碼copy過去。

Mac上建立區分大小的文件系統

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

然後進行掛載

hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android;

對應的detach命令如下:

hdiutil detach /Volumes/android;

如果以後需要更大的存儲卷,還可以使用以下命令來調整稀疏映像的大小:

hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

需要注意的時,:如果系統創建的是 .dmg.sparseimage 文件,請將 ~/android.dmg 替換成 ~/android.dmg.sparseimage。

解決方案來源:Building Android O with a Mac

問題2 : copy過去之後不再報上面的錯誤了,但是出現如下錯誤

error: external/kotlinx.atomicfu/Android.bp:13:1: module "external_kotlinx.atomicfu_license": glob: stat /Volumes/android/androidsource/external/kotlinx.atomicfu/NOTICE: no such file or directory
error: external/kotlinx.coroutines/Android.bp:24:1: module "external_kotlinx.coroutines_license": module source path "external/kotlinx.coroutines/LICENSE" does not exist
20:50:19 soong bootstrap failed with: exit status 1
ninja: build stopped: subcommand failed.

#### failed to build some targets (16 seconds) ####

在網上搜了下也有人遇到同樣的問題但是沒有解決方案。。。

我的處理方案是 修改bp腳本,把上面的NOTICE和LICENSE依賴給去掉,然後就編譯過去了。

問題3: 提示文件描述超過了上限(具體錯誤信息忘記保存了)

# set the number of open files to be 1024
ulimit -S -n 1024
設置文件描述符數量上限
在 Mac OS 中,可同時打開的文件描述符的默認數量上限太低,在高度並行的編譯流程中,可能會超出此上限。

要提高此上限,請將下列行添加到 ~/.bash_profile 中:

調大了文件描述符數量,同時 把並行的線程從16減4(這個是關鍵),不報上面的錯誤了,但是又有如下錯誤

問題4: ninja: build stopped: subcommand failed

error: bionic/libc/Android.bp:1860:1: module "libc_llndk_headers" variant "android_recovery_arm_armv7-a-neon": glob failed: &fs.PathError{Op:"fcntl", Path:"/Volumes/android/androidsource/bionic/libc/kernel/uapi/asm-arm", Err:0x18}
21:17:37 soong bootstrap failed with: exit status 1
ninja: build stopped: subcommand failed.

---》重新運行了了 make -j4 framework, 上嗎的編譯又通過了,不知道爲什麼。
本來還想在降低併發的線程數量到2. make -j2

經過15分鐘左右終於編譯完成。哈哈哈

#### build completed successfully (14:16 (mm:ss)) ####

此時可以在/Volumes/android/androidsource/out/development/ide/clion/frameworks 路徑下看到各個子文件夾下都有CMakeLists.txt生成,但是卻是分散在各個子文件夾下面的。
編譯出來的是各個模塊單獨的CMakeLists.txt,一個CMakeLists.txt表示一個CLion工程,所以不能直接導入全部的工程。
那該怎麼辦吶?
可以新建一個總的/Volumes/android/androidsource/out/development/ide/clion/frameworks/CMakeLists.txt然後可以先add一個工程,導入到CLion後再add其他工程

當導入時,有些cmakelist找不到。懷疑時沒有全編譯引起的?於是索性 make -j4來個全編譯
下面是全編譯遇到的問題

問題5: fatal error: 'linux/netfilter/xt_DSCP.h'

external/iptables/include/linux/netfilter_ipv4/ipt_ECN.h:13:10: fatal error: 'linux/netfilter/xt_DSCP.h' file not found
#include <linux/netfilter/xt_DSCP.h>
1 error generated.
09:04:41 ninja failed with: exit status 1
#### failed to build some targets (01:34:26 (hh:mm:ss)) ####

Building Android O with a Mac這裏找了個解決方案

---> In this case create a symbolic name xt_dscp.h for the original file xt_DSCP.h with the following command lines:

cd external/iptables/extensions/../include/linux/netfilter
ln -s xt_dscp.h xt_DSCP.h

按照上面的修改,但是沒什麼用還是報相應的錯誤
於是手動的找到對應的文件,external/iptables/include/linux/netfilter/xt_dscp.h -->對其進行重命名爲xt_DSCP.h,解決掉這個問題。

問題6: 漫長的編譯過程 出現了main.go:171:9: undefined: syscall.Sysinfo

build/soong/cmd/multiproduct_kati/main.go:170:11: undefined: syscall.Sysinfo_t
build/soong/cmd/multiproduct_kati/main.go:171:9: undefined: syscall.Sysinfo
10:27:57 ninja failed with: exit status 1

網上搜了下也沒有找到相關的解決方案。於是找對對應的文件,把修改相關的代碼(把對應的代碼註釋掉),繼續編譯

經過上述折騰終於編譯完了,哈哈哈。

[100% 19269/19269] Target vbmeta image: out/target/product

#### build completed successfully  ####

四、使用CLion 導入

具體步驟如下

  1. 打開CLion
  2. 選擇「New CMake Project from Sources」
  3. 指定包含 CMakeLists.txt 的目錄out/development/ide/clion
  4. 選擇「Open Existing Project」
    然後就可以很愉快的進行Android Native源碼的跳轉查看。

其中在 androidsource/out/development/ide/clion/CMakeLists.txt如下(目前主要是看 av相關的代碼,所有隻加了相關的子路徑)


五、資料

  1. 搭建編譯環境
  2. https://source.android.com/source/initializing#setting-up-a-mac-os-x-build-environment
  3. Move Android source into case-sensitive image
  4. 清華大學 android source 鏡像站
  5. http://blog.hanschen.site/2019/10/11/aosp-native-ide/
  6. 自己動手調試Android源碼
  7. Android Opensource Project build error FAILED: out/soong/build.ninja
  8. CLion調試Android 11 Native代碼
  9. AOSP Native代碼導入IDE(CLion)

六、收穫

  1. 源碼的下載、編譯以及通過CLion導入方便的查看Native源碼
  2. 解決編譯中遇到的各種問題

感謝你的閱讀
下一篇我們分析學習H264的編碼技術之幀內預測,歡迎關注公衆號“音視頻開發之旅”,一起學習成長。
歡迎交流

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