跳转至

教程007-c++跳转

根settings.gradle

教程002-设计思路 我们提到了 根settings.gradle 其实是加载 scripts/settings 中配置的子模块。

apply from: "${rootDir}/scripts/func.gradle"  

//配置文件存在,则加载;文件中配置具体的模块  
applyConfig('scripts/settings/aosp.gradle')  
//applyConfig('scripts/settings/aosp-cmake.gradle')  
applyConfig('scripts/settings/aosp-system-server.gradle')  
applyConfig('scripts/settings/car.gradle')  
//applyConfig('scripts/settings/cts.gradle')
applyConfig('ext/scripts/settings/ext.gradle')

从这里可以看到,默认是注释掉 scripts/settings/aosp-cmake.gradle ,所以要使用 native 相关模块,解注释这行代码即可。

【重要】6.x 版本问题

在 aosp-cmake/build.gradle 中有这么一个判断:

// 这个模块是一个c/c++模块,
// 目前不知道怎么在 java-library 中引用 CmakeLists.txt
// 所以判断是 idea 则加载 java-library
// 否则加载 android-library
if (rootProject.ext.isRunningInIDEA) {
    apply from: "${rootDir}/scripts/java-build.gradle"
} else {
    apply from: "${rootDir}/scripts/android-build.gradle"
}

之前发现过一个bug,在 Mac、Linux 平台 isRunningInIDEA 的值是正确的,但是在 Win 下这个值是错误的。 如果发现 C++ 代码没加载出来,要注意下 scripts/core.gradle 打印出来的 isRunningInIDEA 是否为 false :

// 如果是 idea 打开这个工程,默认是打开 Java 模块(非Android模块)
isRunningInIDEA = getIdea()
isRunningInAndroidStudio = getAndroidStudio()
logger.warn("Running on idea = " + isRunningInIDEA + ", Android Studio = " + isRunningInAndroidStudio)

主CMakeLists.txt

在 aosp-cmake/CMakeLists.txt 中配置很多 subdirectory ,考虑到很多模块大家都不会用;所以我默认打开了一些 subdirectory 。

大家可以根据自己的需求了打开自己想要看的模块,比如你是做 OTA 升级模块,也就是 update_engine 相关的,可以打开:

add_subdirectory_safe(system/update_engine)  
add_subdirectory_safe(system/update_engine/liburing_cpp)  
add_subdirectory_safe(system/update_engine/stable)

如果你打开 update_engine 之后,发现在 update_engine 里有依赖 bootloader,此时跳转不了 bootloader 相关代码。

这时就需要你再打开应用的模块了,那如何确认要在 主CMakeLists.txt 里打开哪个模块呢?

这里我们依然以 update_engine 模块为例。

查看 aosp-cmake/system/update_engine 目录下 CMakeLists.txt 中的 target_link_libraries,发现有依赖 libbootloader_message

看到这里我们依然不知道要在 主CMakeLists.txt 打开哪个subdirectory,不着急。所以还得查找 library 所在的目录。

projects.json

文件 aosp-cmake/projects.json 配置了 library 对应的目录。

所以我们前面一步查找到 update_engine 模块中依赖 libbootloader_message 库,就可以在 projects.json 中找到 libbootloader_message 所在的目录。

"libbootloader_message": "bootable/recovery/bootloader_message",

找到之后,回到 主CMakeLists.txt ,打开如下:

add_subdirectory_safe(bootable/recovery/bootloader_message)

是不是很简单。

温馨提示

因为 CMake 语法的原因,target_link_libraries 依赖的库名不能包含 @ ,所以如果你在 target_link_libraries 中看到有 - ,再到 projects.json 查找其所在的目录,请自行把 @ 换成 -

比如,aosp-cmake/system/update_engine/CMakeLists.txt 中依赖:android.hardware.boot-1.2 ,你到 aosp-cmake/projects.json 中直接搜索 android.hardware.boot-1.2 是搜不到的,要换成 android.hardware.boot@1.2

再次提示

如果你在 教程001-首次配置 中使用的是软链接方案,你按照如上配置打开后,依然跳转不了。

那你就应该检查你要查看的模块是否被软链接过来,如果没有请自行软链接即可。

评论