Android gradle 实验性插件路线图
Android gradle experimental plugin roadmap
我们 company 正在开发 Android SDK,其中包含 Java 和本机部分。我们以 AAR 格式打包 SDK,其中包含所有资源、java 类 和本机位。根据 AAR 规范,本机库应放在 AAR 包内的 jni 文件夹中。由于当前 gradle 插件不支持高级 NDK 用例,并且我们有一个非常成熟的 Android.mk 文件,该文件经过 3 年的发展,我们通过调用自定义 shell 脚本来准备 AAR gradle 任务。此 shell 脚本使用 ndk-build 命令构建 NDK,运行此脚本的任务被作为 javaCompile 任务的依赖项(我们的代码有多种风格,每种风格都有自己的规则对于从定义文件预加载然后作为命令行参数提供给 ndk-build 的 NDK。
最后,当一切都编译好后,我们有一个复制任务,它将本机库复制到 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 build 具有相同的功能奇偶校验(加上对来自 Android Studio 的 C++ 编辑的免费支持,这是当前配置不可能,因此我们依赖 different editor 作为 JNI 粘合代码)。
我没有路线图,但如果您遵循依赖关系,您会看到 Android 实验性插件仍处于实验性状态,因为 new Gradle object model 仍处于实验性状态。我希望 Android Studio 插件在底层 Gradle 代码稳定之前不会稳定。
就是说:尽管语法差异令人沮丧,但它们通常很容易应用。更重要的是,实验性插件 确实 提供了相当不错的调试支持。它不使用 gdb(默认情况下使用 lldb)并且不依赖于 jniDebuggable 标志。事实上,您正在寻找这些使我认为您对 ndk-gdb 的工作原理了解很多,并且可能已经构建了您自己的依赖于这些知识的系统。您是否尝试过在 Android Studio 中简单地按下 "Debug" 按钮?如果您的 C++ 代码在您的主项目中,它应该可以正常工作。 (不幸的是,在库项目中设置断点似乎有一些问题。)
我们 company 正在开发 Android SDK,其中包含 Java 和本机部分。我们以 AAR 格式打包 SDK,其中包含所有资源、java 类 和本机位。根据 AAR 规范,本机库应放在 AAR 包内的 jni 文件夹中。由于当前 gradle 插件不支持高级 NDK 用例,并且我们有一个非常成熟的 Android.mk 文件,该文件经过 3 年的发展,我们通过调用自定义 shell 脚本来准备 AAR gradle 任务。此 shell 脚本使用 ndk-build 命令构建 NDK,运行此脚本的任务被作为 javaCompile 任务的依赖项(我们的代码有多种风格,每种风格都有自己的规则对于从定义文件预加载然后作为命令行参数提供给 ndk-build 的 NDK。
最后,当一切都编译好后,我们有一个复制任务,它将本机库复制到 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 build 具有相同的功能奇偶校验(加上对来自 Android Studio 的 C++ 编辑的免费支持,这是当前配置不可能,因此我们依赖 different editor 作为 JNI 粘合代码)。
我没有路线图,但如果您遵循依赖关系,您会看到 Android 实验性插件仍处于实验性状态,因为 new Gradle object model 仍处于实验性状态。我希望 Android Studio 插件在底层 Gradle 代码稳定之前不会稳定。
就是说:尽管语法差异令人沮丧,但它们通常很容易应用。更重要的是,实验性插件 确实 提供了相当不错的调试支持。它不使用 gdb(默认情况下使用 lldb)并且不依赖于 jniDebuggable 标志。事实上,您正在寻找这些使我认为您对 ndk-gdb 的工作原理了解很多,并且可能已经构建了您自己的依赖于这些知识的系统。您是否尝试过在 Android Studio 中简单地按下 "Debug" 按钮?如果您的 C++ 代码在您的主项目中,它应该可以正常工作。 (不幸的是,在库项目中设置断点似乎有一些问题。)