Android Studio 上的 NDK 一直在不断重建,需要很长时间

NDK on Android Studio keeps rebuilding all the time, takes forever

提问人:SirKnigget 提问时间:9/23/2019 更新时间:3/25/2020 访问量:1149

问:

我有一个大型 Android Studio 项目,它有一个单独的模块,其中包含本机代码。 本机构建是使用 CMake 定义的,包括一堆 C++ 代码的源文件。

我注意到,自从最近的更新(可能是 Android Studio 3.5)以来,NDK 一直在重建所有内容。 它可能发生在 Java 代码的微小更改、项目中不相关模块的切换风格、递增版本代码等。

这是一个主要问题,因为它可以无缘无故地一次浪费 10 分钟。 我找不到一种合理的方法来分析 Android Studio 中的 NDK 构建,并检查导致重建的原因或花费这么长时间的原因。

不幸的是,该项目的构建文件太大,无法在此处附加。有什么需要注意的事情吗?

安卓 android-ndk android-gradle-plugin android-studio-3.0 android-build

评论


答:

0赞 Alex Cohn 9/24/2019 #1

通常,拆分 AS 项目有助于使 C++ 部分(可能与其 Java 包装器一起)成为一个单独的(库)模块。希望这个模块会更稳定,对应用程序版本代码的增量不敏感。

这样的模块不应该定义很多风格,但要仔细匹配其他模块的风格。有时,即使禁用此类库的“调试”变体也是有意义的。NDK 团队努力更好地处理调试与发布版本的切换,但这仍然很棘手。

但是,如果在这些改进之后,对项目的微不足道的更改仍然会导致大规模的重建,我建议考虑 ccache。

评论

0赞 SirKnigget 9/25/2019
如前所述,NDK 部分位于一个单独的模块中。尽管如此,在单独的 NDK 模块的“调试”和“发布”之间切换不应该触发完全重建,这有什么意义呢?
0赞 Alex Cohn 9/25/2019
一些无辜的更改可能会导致 AS 重新同步 C++。这是你所经历的吗?另一个错误功能是 AS 可以决定重新索引 C++(用于 IDE 集成),这实际上可能需要很长时间。
0赞 SirKnigget 9/25/2019
是的,我经常无缘无故地经历完全重建(本机模块绝对没有变化)。
0赞 Alex Cohn 9/25/2019
我的问题是关于重新同步和重新索引的。你看到它们发生得太频繁了吗?还是时间太长?
0赞 SirKnigget 9/26/2019
你会如何检查?我没有看到提到重新同步或重新索引。只看到 :nativemodule:externalNativeBuildNormalDebug 任务一直在运行并需要几分钟。
1赞 Bram 10/5/2019 #2

对于使用 cmake 生成的 C/C++ 代码,请确保将 cmake 指向可以保存其对象文件和二进制输出的目录。

假设您在顶级 CMakeLists 中依赖于 Game.txt如下所示:

# dependency: Game
set ( game_src_DIR ../Game )
add_subdirectory( ${game_src_DIR} ${CMAKE_CURRENT_BINARY_DIR}/game )

然后,要add_subdirectory的第二个参数指定了 AndroidStudio 保存对象文件的位置。

debug 和 release 对象文件将位于不同的子目录中,每个依赖项也是如此,因此切换 debug/release 不会发生冲突。

1赞 Alexandre Clement 3/25/2020 #3

这似乎是 Android Studio 3.4 的行为回归,并已在 Android Studio 4.1 Canary 4 中得到修复。发行说明在这里

评论

0赞 igagis 3/18/2021
对我的情况没有帮助