如何順滑地查看 Android Native 代碼

1. 簡介

使用 Android Studio 查看 Android Framework 代碼體驗非常好,無論是索引還是界面都讓人很滿意,但是當你跟蹤代碼,發現進入 native 邏輯時,就會發現 Android Studio 對 native 代碼的支持非常不好,不能索引不支持符號搜索不能跳轉等,這些讓人非常抓狂。那麼如何能在 IDE 愉快地查看 native 代碼呢?在 Windows 上,Source Insight 的表現也很好,但苦於只有 Windows 平臺支持且界面不好,經過一番折騰,還真是找到了方法,下面我們將一步一步打造絲滑的 native 代碼閱讀環境。

先看一下效果:

2019-10-11-15-02-40.gif

2. CMake

能讓 IDE 正確地建立索引,我們需要讓 IDE 能正確地知道源文件、頭文件、宏定義等各種數據,慶幸的是,我們發現 AOSP 在編譯過程中,可以幫我們生成這些數據,詳見:http://androidxref.com/9.0.0_r3/xref/build/soong/docs/clion.md

通過文檔我們可知,只需要按照以下步驟完成一次編譯,即可自動生成各模塊對應的 CMake 文件。至於 Cmake 文件是什麼,這裏就不做贅述了,大家可以自行了解。

  1. 打開以下兩個開關,CMakeLists.txt 就會根據編譯環境自動生成
export SOONG_GEN_CMAKEFILES=1
export SOONG_GEN_CMAKEFILES_DEBUG=1
  1. 啓動編譯
make -j16

或者只編譯你需要的模塊

make frameworks/native/service/libs/ui

生成的文件存放在 out 目錄,比如剛剛編譯的 libui 模塊對應的路徑爲:

out/development/ide/clion/frameworks/native/libs/ui/libui-arm64-android/CMakeLists.txt
  1. 合併多個模塊

生成了 CMake 後,我們發現,CMake 文件是按模塊生成的。這樣的話,會導致 IDE 只能單獨導入一個模塊,而我們平時不可能只看一個模塊的代碼,如果把多個模塊都 include 進來呢?
我們可以在 out/development/ide/clion 路徑新建一個 CMakeLists.txt 文件,並添加一下內容:

# 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.6)
# 指定工程名,隨意
project(aosp)
# 把你需要的模塊通過 add_subdirectory 添加進來,注意子目錄必須也包含 CMakeLists.txt 文件
add_subdirectory(frameworks/native)
#add_subdirectory(frameworks/base/core/jni/libandroid_runtime-arm64-android)

這樣,我們就把多個模塊合併在一起了,用 IDE 去打開這個總的 CMake 文件即可

3. 導入 IDE

只要生成 CMake 文件後,剩下的事情就好辦了,現在能識別 CMake 工程的 IDE 非常多,大家可以根據個人喜好選擇,如:

  • CLion
  • Eclipse
  • Visual Studio

這裏以 CLion 爲例講一下如何導入

  1. 打開 CLion
  2. 選擇「New CMake Project from Sources」
  3. 指定包含 CMakeLists.txt 的目錄,如我們在上一個步驟中說的 out/development/ide/clion(這個目錄的 CMakeLists.txt 包含了多個模塊,還記得嗎?)
  4. 選擇「Open Existing Project」
  5. Enjoy your journey …

當然,CLion 也有一個缺點,收費!!如何能免費使用就看大家各顯神通了

4. 遇到的一些問題

  • 生成的 CMakeLists.txt 裏指定路徑可能會使用絕對路徑,如: set(ANDROID_ROOT /Volumes/AndroidSource/M1882_QOF7_base),這裏大家要注意,如果把 CMakeLists.txt 拷貝到別的工程使用,記得修正一下路徑
  • Mac 用戶留意,如果你的 CMakeLists.txt 是從 linux 平臺生成拷貝過來的,生成的 CMakeLists.txt 裏指定的 c++ 編譯器 set(CMAKE_CXX_COMPILER "${ANDROID_ROOT}/prebuilts/clang/host/linux-x86/clang-3977809/bin/clang++") 這裏指定的是 linux-x86 的編譯器,記得替換成 darwin-x86,如果對應目錄下沒有 clang++,那就從 AOSP 源碼拷一個吧
  • 如果 CMake 中列出的源文件在工程中找不到,會導致 CLion 停止索引,如果出現不一致的時候,移除 CMake 中源文件的聲明即可

如果使用遇到其他問題,歡迎聯繫告知,謝謝

5. 總結

所謂工欲善其事,必先利其器。通過這種方法建立的索引包含了 AOSP 所有模塊,最重要是它還會根據編譯環境,把相關 FLAGS 和宏都設置好。

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