Android Gradle避免CMake项目不必要的重建

joz*_*ols 12 c++ android cmake gradle android-ndk

我有多种口味的Android Gradle + CMake(NDK)项目.在切换到之前未构建的flavor之后,子项目中的C++源文件/库被不必要地重建.这是一种预期的输出文件夹是特定于风味的,并且在第一次构建时不存在:

./app/.externalNativeBuild/cmake/prodDebug/armeabi/libs/mylib/libmylib.a
./app/.externalNativeBuild/cmake/devDebug/armeabi/libs/mylib/libmylib.a
Run Code Online (Sandbox Code Playgroud)

但是我有许多口味和大型库要构建,并且不想重建不依赖于风味的C++库 - 在构建时,每个风格都应该有相同的库.我试图通过指定不同的输出目录来解决这个问题,因此它不依赖于味道:

add_subdirectory("libs/mylib" "${CMAKE_CURRENT_SOURCE_DIR}/libs/mylib/output")
Run Code Online (Sandbox Code Playgroud)

现在每个flavor都共享mylib库的相同输出目录,但是这个时间库在切换flavor时会一直重建.使用没有Gradle的普通CMake时,所有工作都按预期工作.从Android Studio/Gradle编译时有没有办法修复不必要的重建?

EDIT1:顺便说一句,即使版本没有指定任何C++标志等,重建也完成了 - 基本上它们只是不同的应用程序/版本名称:

    dev {
        applicationIdSuffix ".dev"
        versionNameSuffix "-dev"
    }
    prod {
        applicationIdSuffix ".prod"
        versionNameSuffix "-prod"
    }
Run Code Online (Sandbox Code Playgroud)

编辑2:还有另一个重建问题.当更改任何CMakeLists.txt(也是子项目)时,它会触发树的整个重建 - 所有父项目,子项目(甚至是不相关的项目)都会被重建.目前,这是使用Gradle/Android Studio构建NDK项目的一个障碍.

Pau*_*cum 0

我通过将 CCache 添加到我的 CMakeLists.txt 解决了这个问题:

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
Run Code Online (Sandbox Code Playgroud)

正如这里所描述的:

/sf/answers/1701409461/