使用应用程序包时,<1% 的用户会收到 UnsatisfiedLinkError
Using an app bundle I get UnsatisfiedLinkError for <1% of users
我正在尝试使用新的 Android App Bundle。
我 运行 在我的设备上进行了一些本地测试,一切正常。然而,一旦部署到生产环境,我开始看到一些这样的错误:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xyz/base.apk"],nativeLibraryDirectories=[/data/app/xyz/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libsqlite3x.so"
java.lang.Runtime.loadLibrary (Runtime.java)
java.lang.System.loadLibrary (System.java)
io.requery.android.database.sqlite.SQLiteDatabase.<clinit> (SQLiteDatabase.java:86)
io.requery.android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:241)
io.requery.android.database.sqlite.SQLiteOpenHelper.getReadableDatabase (SQLiteOpenHelper.java:199)
...
错误指出我正在使用的库 (requery/sqlite-android) 找不到它需要的 .so 文件。
这看起来很奇怪,因为我检查了 bundletool,并且在每个 APK 中都有文件 .so。
错误发生在两台设备上:Samsung Galaxy Note 7 和
TECNO-J8,运行宁 Android 6 和 5 分别。
根据 Play 商店的说法,错误发生在通过 Google Play 安装的应用程序上,因此我怀疑该错误与 APK 旁加载有关。
生成的 APK 包包括以下架构的拆分:
- splits\base-armeabi_v7a.apk
- splits\base-mips.apk
- splits\base-arm64_v8a.apk
- splits\base-x86_64.apk
- splits\base-x86.apk
你有什么提示吗?
即使安装是从 Play 报告的,但在使用 adb 时很容易伪造此信息(由于某些我还不太了解的原因,一些用户已经学会了这样做)。这些崩溃很可能来自侧载,尽管出现了配置拆分,但侧载没有安装。
此问题可能与 https://issuetracker.google.com/issues/127691101
有关
它发生在用户将应用程序移动到 SD 卡的 LG 或旧三星设备的某些设备上。
解决此问题的一种方法是使用 Relinker 库加载您的本机库,而不是直接调用 System.load 方法。
https://github.com/KeepSafe/ReLinker
另一种方法是阻止应用程序移动到 SD 卡或在 gradle.properties 文件中保留 android.bundle.enableUncompressedNativeLibs=false。
@见https://developer.android.com/guide/app-bundle/configure-base#disable_config_apks
disable bundle api split 可以修复这个bug。
将其添加到您的 build.gradle 文件
bundle {
abi {
// This property is set to true by default.
enableSplit = false
}
}
我正在尝试使用新的 Android App Bundle。
我 运行 在我的设备上进行了一些本地测试,一切正常。然而,一旦部署到生产环境,我开始看到一些这样的错误:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xyz/base.apk"],nativeLibraryDirectories=[/data/app/xyz/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libsqlite3x.so"
java.lang.Runtime.loadLibrary (Runtime.java)
java.lang.System.loadLibrary (System.java)
io.requery.android.database.sqlite.SQLiteDatabase.<clinit> (SQLiteDatabase.java:86)
io.requery.android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:241)
io.requery.android.database.sqlite.SQLiteOpenHelper.getReadableDatabase (SQLiteOpenHelper.java:199)
...
错误指出我正在使用的库 (requery/sqlite-android) 找不到它需要的 .so 文件。 这看起来很奇怪,因为我检查了 bundletool,并且在每个 APK 中都有文件 .so。
错误发生在两台设备上:Samsung Galaxy Note 7 和 TECNO-J8,运行宁 Android 6 和 5 分别。
根据 Play 商店的说法,错误发生在通过 Google Play 安装的应用程序上,因此我怀疑该错误与 APK 旁加载有关。
生成的 APK 包包括以下架构的拆分:
- splits\base-armeabi_v7a.apk
- splits\base-mips.apk
- splits\base-arm64_v8a.apk
- splits\base-x86_64.apk
- splits\base-x86.apk
你有什么提示吗?
即使安装是从 Play 报告的,但在使用 adb 时很容易伪造此信息(由于某些我还不太了解的原因,一些用户已经学会了这样做)。这些崩溃很可能来自侧载,尽管出现了配置拆分,但侧载没有安装。
此问题可能与 https://issuetracker.google.com/issues/127691101
有关它发生在用户将应用程序移动到 SD 卡的 LG 或旧三星设备的某些设备上。
解决此问题的一种方法是使用 Relinker 库加载您的本机库,而不是直接调用 System.load 方法。
https://github.com/KeepSafe/ReLinker
另一种方法是阻止应用程序移动到 SD 卡或在 gradle.properties 文件中保留 android.bundle.enableUncompressedNativeLibs=false。
@见https://developer.android.com/guide/app-bundle/configure-base#disable_config_apks
disable bundle api split 可以修复这个bug。 将其添加到您的 build.gradle 文件
bundle {
abi {
// This property is set to true by default.
enableSplit = false
}
}