android - 可调试标志为假时缺少 Android '*.so' 库(独立于构建变体)
问题描述
我们正在尝试为我们的 android 项目使用一些“.so”预建库。它们是:
mpeg.so
&lib_arch.so
当 gradle 的debuggable
标志为 true 时,我们的 '.so' 文件在 '.apk' 文件中可见(使用 ApkAnalyzer 确认),并且在/data/app/<package-name>-jekswbj/lib
安装应用程序时它们也可以在文件夹中使用。
当debuggable
flag 设置为 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 中的文件夹中,如下图所示。
因此,mpeg.so
文件在debuggable
为真时找到,但在debuggable
为假时丢失。是什么导致了这个问题?如果您需要,我可以提供更多信息。
解决方案
对我来说,解决方案是在所有.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
推荐阅读
- node.js - node.js http请求连接被拒绝错误
- datetime - 颤动-我当地时间的 DateTime.now() 不一样
- php - public 或 protected 替换 var
- java - Hibernate OGM 不会在没有事务的情况下保留实体
- mysql - 为什么我必须使用子查询来选择最高薪水的 ID?
- javascript - 如何将函数作为道具传递给 2 个嵌套/子组件?
- c# - WPF,如何使用 MVVM 模式触发 ListBox.ScrollIntoView?
- javascript - Javascript undefined 不是对象异步/等待问题
- c# - 如果在 UDPClient(发送方)之前实例化,UDPClient(侦听器)将无法工作的奇怪行为
- html - 单击链接时如何切换复选框?