首页 > 解决方案 > 可调试标志为假时缺少 Android '*.so' 库(独立于构建变体)

问题描述

我们正在尝试为我们的 android 项目使用一些“.so”预建库。它们是: mpeg.so&lib_arch.so

当 gradle 的debuggable标志为 true 时,我们的 '.so' 文件在 '.apk' 文件中可见(使用 ApkAnalyzer 确认),并且在/data/app/<package-name>-jekswbj/lib安装应用程序时它们也可以在文件夹中使用。

debuggableflag 设置为 false 时,我们的 '.so' 文件在 '.apk' 文件中可见(使用 ApkAnalyzer 确认)。但是,mpeg.so安装应用程序时不会存储在设备上。只lib_arch.so找到。

以下是我build.gradle文件中的片段

// buildTypes: debug {}
debug {
   debuggable false
   minifyEnabled false
   ext.enableCrashlytics = false

   proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

// splits: abi
splits {
    abi {
        enable true
        reset()
        include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a'
        universalApk true
   }
}

<module-name>/libs/<abi-name>我们的“.so”文件根据它们的 abi(s)存储在文件夹中。但是,它们出现jniLibs在 Android Studio 中的文件夹中,如下图所示。

jniLibs 文件夹

因此,mpeg.so文件在debuggable为真时找到,但在debuggable为假时丢失。是什么导致了这个问题?如果您需要,我可以提供更多信息。

标签: androidgradleshared-librariesbuild.gradleabi

解决方案


对我来说,解决方案是在所有.so库前面加上关键字lib_。是的,没错。

我的图书馆名称如下:

变更前:

mpeg.so
lib_arch.so

更改后:

lib_mpeg.so
lib_arch.so

而且,现在,我能够在 apk 和安装目录中找到它们。

我发现的最相关的文档参考是:

注意:如果您的模块名称已经以 lib 开头,则构建系统不会在前面添加额外的 lib 前缀;它按原样采用模块名称,并添加 .so 扩展名。因此,最初名为 libfoo.c 的源文件仍会生成名为 libfoo.so 的共享对象文件。此行为是为了支持 Android 平台源从 Android.mk 文件生成的库;所有此类库的名称都以 lib 开头。

而且,我什至没有使用 ndk 或android.mk


推荐阅读