[Android'* .so'库,当可调试标志为false(与构建变量无关)时丢失)

问题描述 投票:0回答:1

我们正在尝试为我们的android项目使用一些'.so'预建库。这些是:mpeg.solib_arch.so

当gradle的debuggable标志为true时,我们的'.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存储在<module-name>/libs/<abi-name>文件夹中。但是,它们出现在jniLibs文件夹中,如下图Android Studio中的图像。

jniLibs folder

因此,当mpeg.so为true时将找到debuggable文件,但是当debuggable为false时将丢失该文件。是什么导致此问题?如果您需要,我可以提供更多信息。

android gradle shared-libraries build.gradle abi
1个回答
0
投票

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

我的库名称如下:

更改前:

mpeg.so
lib_arch.so

更改后:

lib_mpeg.so
lib_arch.so

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

我发现的最相关的documentation reference是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.