Android 当可调试标志为 false 时缺少“*.so”库(独立于 build-variant)

Android '*.so' libraries missing when debuggable flag is false (independent of build-variant)

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

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

debuggable 标志设置为 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
   }
}

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

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

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

我的图书馆名称如下:

更改前:

mpeg.so
lib_arch.so

更改后:

lib_mpeg.so
lib_arch.so

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

我发现最相关的 documentation reference 是:

Note: If your module's name already starts with lib, the build system does not prepend an additional lib prefix; it takes the module name as-is, and adds the .so extension. So a source file originally called, for example, libfoo.c still produces a shared-object file called libfoo.so. This behavior is to support libraries that the Android platform sources generate from Android.mk files; the names of all such libraries start with lib.

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