本机依赖项不会在 flutter 插件中复制到它们的目的地

native dependencies don't get copied to their destination in flutter plugin

我正在创建一个使用本机库的 Flutter 插件。我面临的问题是,我添加的本机依赖项没有被复制到 Android 的 context.nativeLibraryDir。以下是我的配置。

这是我的 android 插件文件夹(不是示例应用程序)的文件结构。

在我的插件的 build.gradle 中,我有以下内容。我也试过研究后添加jni.srcDirs = [],但它也没有用。

sourceSets {
    main {
       jniLibs.srcDirs += 'src/main/jniLibs'
       java.srcDirs += 'src/main/kotlin'
    }
}

我认为以上所有内容都是正确的,因为以下是我构建的 APK(示例应用程序的),它具有库。

但是在安装示例应用程序后(在 Android x86 模拟器上,也在 arm64 设备上测试),当我尝试执行本机库时它崩溃了,我想将它们用作可执行文件(它有效在一个独立的 android 项目中,现在我只是复制了插件中的库和一些代码)

我发现的有趣的事情是,flutter 的 libflutter.so 也没有被复制,我想这是正常功能所必需的。如果没有 libflutter.so,应用程序应该会崩溃,但它不会。

我也尝试过将 ndk.abiFilters 添加到示例应用程序的 build.gradle 但没有成功。

只是偶然发现了同样的问题,并在我的案例中找到了以下解决方案(带有本机库的 Flutter 插件):

android/src/main/AndroidManifest.xml

...
<application
  android:extractNativeLibs="true"
  ...
>
...

详情:

自 Android 6.0 系统库可以未压缩地存储在 APK 中,而不必提取并存储在其他地方 (https://medium.com/androiddevelopers/smallerapk-part-8-native-libraries-open-from-apk-fc22713861ff)。通过 (Java):

支持在 APK 中加载系统库
static { System.loadLibrary(..); }

参见 https://developer.android.com/reference/java/lang/System#loadLibrary(java.lang.String)

如果需要提取 Flutter 插件的系统库(例如,因为您不能只在 System.loadLibrary 上构建),可以在插件的 Manifest 应用程序元素中使用 android:extractNativeLibs="true"https://developer.android.com/guide/topics/manifest/application-element).

需要注意的重要一点是,DSL 的实现方式 (https://developer.android.com/studio/releases/gradle-plugin?buildsystem=ndk-build#compress-native-libs-dsl) 不适用于我的情况(Flutter 插件)。