AOSP Native代码导入IDE(CLion)

AOSP可以很容易的导入到Android Studio,很舒服的跳转、调试,但是仅限于Java,Native代码连跳转都不行。

JB有一款C/C++的IDE CLion,很自然想到能不能导入到CLion呢?

1 编译

要让 IDE 正确地建立索引,我们需要让 IDE 能正确地知道源文件、头文件、宏定义等各种数据。

CLion是基于CMake的,AOSP的Soong可以生成CMakeLists.txt,build目录下有文档build/soong/docs/clion.md

// 打开开关,编译时生成CMakeLists.txt
export SOONG_GEN_CMAKEFILES=1
export SOONG_GEN_CMAKEFILES_DEBUG=1

// 全编译
make -j32
// 或者编译单独模块
make frameworks/native/service/libs/ui

// CMakeLists.txt会生成在
out/development/ide/clion/frameworks/native/libs/ui/libui-arm64-android/CMakeLists.txt

2 导入

合并模块

编译出来的是各个模块单独的CMakeLists.txt,一个CMakeLists.txt表示一个CLion工程,所以不能直接导入全部的工程。

可以新建一个总的out/development/ide/clion/CMakeLists.txt
导入CLion以后再编写这个文件可以享受IDE的补全功能,所以可以先add一个工程,导入到CLion后再add其他工程。

cmake_minimum_required(VERSION 3.6)
project(AOSP-Native)
// 添加子模块,导入了部分工程。工程很多,我是用到了再导入
add_subdirectory(frameworks/native)
add_subdirectory(art/dalvikvm/dalvikvm-arm64-android)
add_subdirectory(art/libdexfile/libdexfile-arm64-android)
add_subdirectory(art/runtime/libart-arm64-android)
add_subdirectory(bionic/libc/libc_bionic-arm64-android)
add_subdirectory(bionic/libc/libc_bionic_ndk-arm64-android)
add_subdirectory(bionic/libc/system_properties/libsystemproperties-arm64-android)
add_subdirectory(external/compiler-rt/lib/sanitizer_common/libsan-arm64-android)
add_subdirectory(frameworks/av/media/libaaudio/src/libaaudio-arm64-android)
add_subdirectory(frameworks/av/soundtrigger/libsoundtrigger-arm64-android)
add_subdirectory(frameworks/base/core/jni/libandroid_runtime-arm64-android)
add_subdirectory(frameworks/native/cmds/installd/installd-arm64-android)
add_subdirectory(frameworks/native/cmds/servicemanager/servicemanager-arm64-android)
add_subdirectory(frameworks/native/libs/binder/libbinder-arm64-android)
add_subdirectory(libcore/libjavacore-arm64-android)
add_subdirectory(libcore/libopenjdk-arm64-android)
add_subdirectory(libnativehelper/libnativehelper-arm64-android)
add_subdirectory(libnativehelper/libnativehelper_compat_libc++-arm64-android)
add_subdirectory(kernel/msm-4.4/unifdef-x86_64-linux_glibc)
// 内核的CMakeLists是自己写的,只导入了头文件,跳转还有问题
add_subdirectory(kernel/msm-4.4/kernel_custom)
add_subdirectory(system/core/base/libbase-arm64-android)
add_subdirectory(system/core/init/libinit-arm64-android)
add_subdirectory(system/core/libziparchive/libziparchive-arm64-android)
add_subdirectory(system/core/liblog/liblog-arm64-android)
add_subdirectory(system/core/libcutils/libcutils-arm64-android)
add_subdirectory(system/core/libutils/libutils-arm64-android)
add_subdirectory(system/core/libprocessgroup/libprocessgroup-arm64-android)
add_subdirectory(system/core/logcat/logcatd-arm64-android)
add_subdirectory(system/core/logcat/liblogcat-arm64-android)
add_subdirectory(system/core/logd/logd-arm64-android)
add_subdirectory(system/core/logd/liblogd-arm64-android)
add_subdirectory(system/core/lmkd/liblmkd_utils-arm64-android)
add_subdirectory(system/core/lmkd/lmkd-arm64-android)

导入

  • 打开CLion
  • 选择「New CMake Project from Sources」
  • 指定包含 CMakeLists.txt 的目录out/development/ide/clion
  • 选择「Open Existing Project」

下面是效果图,JNIEnv等都能直接跳转
AOSP Native代码导入IDE(CLion)_第1张图片

3 遇到的问题

  • audioflinger没有生成CMakeLists.txt?
    我用的9.0系统,audioflinger是mk编译,可能需要bp才能生成CMakeLists.txt

  • no such file or directory: 'external/compiler-rt/lib/cfi/cfi_blacklist.txt
    找不到这个文件,这里需要改成绝对路径

    // CMakeLists.txt文件开头的ANDROID_ROOT设置为绝对路径
    set(ANDROID_ROOT  /home/illusion/AOSP-Native)
    // 修改
    ${ANDROID_ROOT}/external/compiler-rt/lib/cfi/cfi_blacklist.txt
    

    改好后,在CMake窗口Reload CMake Project

你可能感兴趣的:(Android)