教程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 里打开哪个模块呢?
target_link_libraries¶
这里我们依然以 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 所在的目录。
找到之后,回到 主CMakeLists.txt ,打开如下:
是不是很简单。
温馨提示¶
因为 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-首次配置 中使用的是软链接方案,你按照如上配置打开后,依然跳转不了。
那你就应该检查你要查看的模块是否被软链接过来,如果没有请自行软链接即可。