5

在我们公司我们正在开发一个包含 Java 和原生部分的 Android SDK。我们以 AAR 格式打包 SDK,其中包含所有资源、Java 类和本机位。根据 AAR 规范,本机库应放在 AAR 包内的 jni 文件夹中。由于当前的 gradle 插件不支持高级 NDK 用例,并且由于我们有一个非常成熟的 Android.mk 文件,该文件已经发展了 3 年以上,因此我们通过从 gradle 任务调用自定义 shell 脚本来准备 AAR。此 shell 脚本使用 ndk-build 命令构建 NDK,运行此脚本的任务作为 javaCompile 任务的依赖项放置(我们的代码有多种风格,每种风格都有自己的 NDK 规则,这些规则是从定义文件中预加载的然后作为命令行参数提供给 ndk-build)。

最后,当所有内容都编译完成后,我们有一个 Copy 任务,它将本机库复制到 build/intermediates/bundles 内的 jni 文件夹(最终被压缩到 AAR 中的文件夹)。在我们更新项目以使用 gradle 插件 v1.5.0 之前,这一直正常工作。

在 v1.5.0 中,插件中引入了称为 Transform API 的东西。尽管我们不使用它,但此转换步骤在任务transformNative_libsWithSyncJniLibsForFlavorNameBuildTypeName中对本地库进行了一些转换,这发生在我们已经将库复制到 jni 文件夹并导致删除 jni 文件夹中的所有数据之后的某个地方。这最终导致 AAR 不包含本机库,并在需要本机方法时立即崩溃。

我们通过使用来解决这个问题project.tasks[taskName]来获取该任务并确保它在我们将我们的库复制到 jni 文件夹之前发生。

然而,这个问题已经开始让我们担心 gradle-experimental 插件(目前唯一支持 NDK 的)是否以及何时会退出实验阶段并成为构建 NDK 代码的标准。

我们对该实验性插件进行了一些试验,除了不同的语法(为什么???)它不支持调试本机代码作为库模块的一部分(gdb 文件未打包到 AAR 中,并且 jniDebuggable 标志不再存在)。

有谁知道这个插件什么时候会达到稳定的 API 并准备好在生产版本中使用?我们希望提前计划从 shellscript 调用 ndk-build 到具有相同功能奇偶性的 gradle-only NDK 构建的迁移(加上对 Android Studio 的 C++ 编辑的免费支持,这在当前配置下是不可能的,因此我们依赖不同的编辑器JNI 胶水代码)。

4

1 回答 1

2

我没有路线图,但如果您遵循依赖项,您会发现 Android 实验性插件仍然是实验性的,因为新的 Gradle 对象模型仍然是实验性的。我希望在底层 Gradle 代码稳定之前,Android Studio 插件不会稳定。

也就是说:尽管语法差异令人沮丧,但它们通常很容易应用。更重要的是,实验插件确实提供了相当好的调试支持。它不使用 gdb(默认使用 lldb),也不依赖 jniDebuggable 标志。您正在寻找这些的事实使我认为您对 ndk-gdb 的工作原理非常了解,并且可能已经构建了自己的依赖于这些知识的系统。您是否尝试过简单地按下 Android Studio 中的“调试”按钮?如果您的 C++ 代码在您的主项目中,它应该可以正常工作。(不幸的是,在库项目中设置断点似乎有一些问题。)

于 2016-04-11T15:02:33.617 回答