【发布时间】:2020-01-19 03:01:16
【问题描述】:
我有一个配置为动态功能模块的统一项目。这可以按需安装。但是当我运行它时,应用程序崩溃并出现以下错误:
调用了 JNI FatalError:无法加载库:/data/app/com.example.app-8fx1RRZrQ34BcwXf8ajjqZ==/lib/arm64/libunity.so [dlopen 失败:未找到库“libunity.so”]
Unity项目的目标activity包括SplitCompat.install(this);
它的 gradle 看起来像:
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
mavenCentral()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
allprojects {
repositories {
mavenCentral()
google()
jcenter()
flatDir {
dirs 'libs'
}
}
}
apply plugin: 'com.android.dynamic-feature'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
android {
compileSdkVersion rootProject.compileSdk
buildToolsVersion rootProject.buildTools
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion rootProject.minSdk
targetSdkVersion rootProject.targetSdk
versionCode rootProject.versionCode
versionName rootProject.versionName
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = ['.unity3d', '.ress', '.resource', '.obb']
}
flavorDimensions "default"
productFlavors {
staging {
dimension "default"
}
production {
dimension "default"
}
develop {
dimension "default"
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
buildTypes {
debug {
minifyEnabled false
useProguard false
jniDebuggable true
}
release {
minifyEnabled false
useProguard false
}
}
packagingOptions {
doNotStrip '*/armeabi-v7a/*.so'
doNotStrip '*/arm64-v8a/*.so'
// doNotStrip '*/x86/*.so'
}
}
dependencies {
implementation project(':app')
}
虽然app模块的gradle有:
bundle {
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// dynamic feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = false
}
abi {
// This property is set to true by default.
enableSplit = true
}
}
我什至尝试通过在 gradle.properties 文件中设置 android.bundle.enableUncompressedNativeLibs = false 来禁用 .so 压缩,但确切的错误仍然存在。
在 aab 中看到的功能模块的内部。 .so 库存在:
我该如何解决这个问题?
更新 1 -
我上面描述的问题发生在第一次从 Play 商店安装 aab 时。请注意,我能够成功安装功能模块,并且仅当我尝试运行它时才会出现错误。但是,当我在同一安装中推送增量更新时,功能模块能够以某种方式完美运行,并且能够找到必要的 .so 文件。我已经多次尝试这些步骤以验证观察结果。
【问题讨论】:
-
你有库 libunity.so not found 记住 apk 只是一个 zip 文件,所以 解压缩 它并检查 ibunity.so 是否在 /lib/arm64/
-
IC 我建议你阅读aab 并尝试bundletool
-
您描述的问题的常见原因是:proguard,手动库丢失/在错误的位置(路径),需要 gradle-lib- 复制(路径)...解决您的问题,付出一些努力在,什么去哪里,文件布局(目录树)查看我的答案here,向您展示一种方法
-
可能是一个简单的修复但没有足够的信息,请在 “而且它的 gradle 看起来像:” 哪个? 1 个文件 2 个文件 ?它们在哪里(相对路径)。 “虽然 app 模块的 gradle 有:”.请明确点。可能的修复:proguard、lib 路径...
-
嗨@JonGoodwin,我知道apks 和aabs 本质上是压缩包。我更新了我的查询并附上了动态功能内部的屏幕截图。我还使用 bundletool 提取了 apk,我可以看到生成了 .so 库。我上面分享的gradle文件内容分别属于unityProj.gradle和app.gradle(不是根级别的,这里用处不大)。
标签: android android-studio unity3d google-play android-app-bundle