【发布时间】:2015-12-03 22:47:51
【问题描述】:
在我们的company,我们正在开发一个包含 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 并准备好在生产版本中使用?我们希望提前计划从调用 ndk-build 从 shellscript 迁移到具有相同功能奇偶性的 gradle-only NDK 构建(加上对 Android Studio 的 C++ 编辑的免费支持,这在当前配置下是不可能的,所以我们依赖 different editor用于 JNI 胶水代码)。
【问题讨论】:
-
“有谁知道这个插件什么时候会达到稳定的 API 并准备好在生产构建中使用?” -- 最多,Android 工具团队会这样做。他们不太可能在这里对此发表评论,其他任何人充其量只能提供意见。
-
我在他们的网站上找不到任何此类信息。我们想知道大概的发布日期来计划我们的迁移。如果他们没有使用 gradle 插件 v1.5.0 破坏自定义 JNI 构建,我不会问这个问题。
-
这并不能使您的问题适合本网站。请阅读站点文档以了解 on topic 是什么。
-
设置
android.sourceSets.main { jniLibs.srcDir 'path/to/your/libs_folder/' }来打包您的原生库,而不是复制任务。虽然这不能回答您关于路线图的问题,但这仍应解决您当前的问题。 -
ph0b,我已经尝试过了,但它不起作用,因为 jniLibs.srcDir 不能为每个风味构建类型组合设置(您只能为风味设置它)。对于每种风味和构建类型组合,我们需要不同的原生构建。据我了解,这可以通过 gradle 实验插件实现。
标签: android c++ android-ndk android-gradle-plugin gradle-experimental