【问题标题】:How to include versioned *.so file into apk using Gradle?如何使用 Gradle 将版本化的 *.so 文件包含到 apk 中?
【发布时间】:2017-08-06 09:52:36
【问题描述】:

我尝试使用一些预编译的本机库构建 android 应用程序: liba.solibb.so.1.2.3

库被放置在 jniLibs 子目录中。 构建APK文件后,只包含liba.so,没有libb.so.1.2.3

结果是可预测的。应用程序在启动时崩溃。

如何使用构建脚本将 jniLibs 中的所有文件包含到 APK 中?

【问题讨论】:

  • 你能解决你的问题吗?我也需要解决方案。

标签: android gradle shared-libraries apk native


【解决方案1】:

由于在Android Gradle plugin 中使用了本机库正则表达式^.+\\.so$,因此无法使用jniLibs 文件夹包含除.so 文件之外的任何内容。即使您以某种方式将库添加到 APK,Android 上的动态加载器也是 very limited,并且很可能无法加载它们。

最好的办法是通过重命名库并更改其内部soname链接之前完全删除版本。

【讨论】:

    【解决方案2】:

    不幸的是,我不再为 Android 开发,所以我无法测试这个,但我知道 Gradle,这可能对你有用。查看Android DSL docs,您也许可以更改jniLibs 文件夹上的过滤:

    android {
        sourceSets {
            main {
                jniLibs.filter.include("**/*")
            }
        }
    }
    

    让我知道这是否有效!

    【讨论】:

    • 我试过这个,它给出了一个错误:无法设置只读属性:过滤器类:com.android.build.gradle.internal.api.DefaultAndroidSourceDirectorySet
    • 你可以尝试设置整个 jniLibs 吗?如果我可以安装 Android SDK,我可能会在明天尝试测试它。但它会类似于 jniLibs { filter = '' srcDir = '' } 等(文档中的所有属性)。
    • 所以过滤器是一个PatternSet。我已经更新了我的答案。这可以编译(我用 Android 插件尝试过)但我无法部署应用程序,因为我没有任何 .so 可以尝试。
    • @kostashv 我想知道你是否找到了答案,这是一个有趣的问题;)
    • 我已经尝试了您更新答案中的代码。它可以编译,但版本化的 lib 仍未打包到 apk 中。我还尝试从 apk 中排除未版本化的库,但没有成功。
    【解决方案3】:

    只需在 app/src/main 中添加 jniLibs 文件夹,它就会在 apk 中包含 .so 文件。

    /app/src/main/armeabi/*.so 文件

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2012-08-05
      • 2021-02-14
      • 2016-09-19
      相关资源
      最近更新 更多