【问题标题】:Android Gradle avoid CMake project unnecessary rebuildAndroid Gradle 避免 CMake 项目不必要的重建
【发布时间】:2017-10-11 20:29:27
【问题描述】:

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

./app/.externalNativeBuild/cmake/prodDebug/armeabi/libs/mylib/libmylib.a
./app/.externalNativeBuild/cmake/devDebug/armeabi/libs/mylib/libmylib.a

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

add_subdirectory("libs/mylib" "${CMAKE_CURRENT_SOURCE_DIR}/libs/mylib/output")

现在每个风味都共享 mylib 库的相同输出目录,但是这一次库在切换风味时一直在重建。当使用没有 Gradle 的普通 CMake 时,一切都按预期工作。从 Android Studio / Gradle 编译时,有什么方法可以修复不必要的重建?

编辑1: 顺便说一句,即使风味没有指定任何 C++ 标志等,也会完成重建 - 本质上它们是相同的,只是不同的应用程序/版本名称:

    dev {
        applicationIdSuffix ".dev"
        versionNameSuffix "-dev"
    }
    prod {
        applicationIdSuffix ".prod"
        versionNameSuffix "-prod"
    }

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

【问题讨论】:

  • 听起来像一个错误。您向 Android Studio 团队报告了吗?
  • 是的,它在这里:issuetracker.google.com/issues/38290773。但谷歌没有帮助。
  • 我们解决这个问题的方法是预先构建 C++ 代码并在 aar 中,然后将其链接到项目中。基本上把它分成两个项目。
  • 嗯,我做了类似的事情。但是对于当前版本,我认为它已经修复了。

标签: android c++ gradle android-ndk cmake


【解决方案1】:

我通过将 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)

如此处所述:

https://stackoverflow.com/a/24305849/408877

【讨论】:

    【解决方案2】:

    您不能在当前工作目录之外指定binary_dir,请尝试更改以下行

    add_subdirectory("libs/mylib" "${CMAKE_CURRENT_SOURCE_DIR}/libs/mylib/output")
    

    add_subdirectory("libs/mylib" my-bin-dir)
    

    这将通知正确的文件状态,例如是否需要重新编译,到 CMake 构建工具。

    【讨论】:

    • 这没有帮助。输出文件夹现在是: ./app/.externalNativeBuild/cmake/devDebug/x86/my-bin-dir 和 ./app/.externalNativeBuild/cmake/prodDebug/x86/my-bin-dir 所以当我更改库中的源时具有不依赖于风味(产品/开发)的代码,当我运行.实际上,我有不止 2 种口味和不止一个库。
    • 哎呀,听到这个消息很惊讶。但这对我的项目很有效,每次我同步项目时,只会构建选定的构建变体。
    • 这对我来说可能也是如此。但对我来说,问题是有些文件对所有风格都是通用的,当它们发生变化时,它们会为所有风格重新构建。
    【解决方案3】:

    使用 ccache。

    可以在 CMakeLists.txt 中配置

    我在本文底部解释:

    https://medium.com/swlh/cross-platform-mobile-and-web-development-with-c-explained-8fb5fb916d35

    这样你就可以避免 Android studio 的 bug 并且总体上可以节省时间。

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2011-04-03
      • 2021-11-02
      相关资源
      最近更新 更多