INSTALL_FAILED_NO_MATCHING_ABIS 具有零字节存根的特定 API 版本的模拟器错误
INSTALL_FAILED_NO_MATCHING_ABIS error with Emulator for specific API versions with zero byte stubs
我们正在尝试通过使用 packagingOptions
排除一些应用程序不受欢迎的架构的本机库来减小我们正在构建的 APK 的大小 - 我们很高兴该应用程序不适用于这些:
packagingOptions {
exclude 'lib/x86/lib.so'
exclude 'lib/x86_64/lib.so'
}
当然,我们不想导致应用程序无法安装(因为缺少架构的 INSTALL_FAILED_NO_MATCHING_ABIS
)所以我们包含了一个零字节存根的 AAR。 AAR 的内容如下所示:
$ jar tf stubs.aar
jni/
jni/armeabi-v7a/
jni/armeabi-v7a/stub.so
jni/x86/
jni/x86/stub.so
jni/arm64-v8a/
jni/arm64-v8a/stub.so
jni/armeabi/
jni/armeabi/stub.so
jni/x86_64/
jni/x86_64/stub.so
但是,我们发现虽然此解决方案大部分都按预期工作,但我们仍然无法在具有 x86 映像的标准 Android SDK 模拟器上安装该应用程序。更深入地研究,我们发现我们可以使用 API 26+ 的 x86 图像在模拟器上安装应用程序,但是在 API 21-25 上安装失败并显示 INSTALL_FAILED_NO_MATCHING_ABIS
。
在 API 21-25 日,零字节存根不能解决此问题有什么原因吗?
编辑:经过进一步测试,安装似乎确实适用于 API 16-19,只有 21-25 是问题所在。
经过一番尝试,我们发现答案很简单(虽然有点奇怪):API 21-25 模拟器图像无法识别架构,除非它包含看起来像有效库的文件并且在这种情况意味着有一个 "lib" 前缀。将零字节存根的文件名从 stub.so
更改为 libstub.so
解决了问题。
我相信这是因为 sonames 周围的约定,但不完全理解为什么某些模拟器版本比其他版本更严格。
如果您能提供更多详细信息,请comment/edit!
我们正在尝试通过使用 packagingOptions
排除一些应用程序不受欢迎的架构的本机库来减小我们正在构建的 APK 的大小 - 我们很高兴该应用程序不适用于这些:
packagingOptions {
exclude 'lib/x86/lib.so'
exclude 'lib/x86_64/lib.so'
}
当然,我们不想导致应用程序无法安装(因为缺少架构的 INSTALL_FAILED_NO_MATCHING_ABIS
)所以我们包含了一个零字节存根的 AAR。 AAR 的内容如下所示:
$ jar tf stubs.aar
jni/
jni/armeabi-v7a/
jni/armeabi-v7a/stub.so
jni/x86/
jni/x86/stub.so
jni/arm64-v8a/
jni/arm64-v8a/stub.so
jni/armeabi/
jni/armeabi/stub.so
jni/x86_64/
jni/x86_64/stub.so
但是,我们发现虽然此解决方案大部分都按预期工作,但我们仍然无法在具有 x86 映像的标准 Android SDK 模拟器上安装该应用程序。更深入地研究,我们发现我们可以使用 API 26+ 的 x86 图像在模拟器上安装应用程序,但是在 API 21-25 上安装失败并显示 INSTALL_FAILED_NO_MATCHING_ABIS
。
在 API 21-25 日,零字节存根不能解决此问题有什么原因吗?
编辑:经过进一步测试,安装似乎确实适用于 API 16-19,只有 21-25 是问题所在。
经过一番尝试,我们发现答案很简单(虽然有点奇怪):API 21-25 模拟器图像无法识别架构,除非它包含看起来像有效库的文件并且在这种情况意味着有一个 "lib" 前缀。将零字节存根的文件名从 stub.so
更改为 libstub.so
解决了问题。
我相信这是因为 sonames 周围的约定,但不完全理解为什么某些模拟器版本比其他版本更严格。
如果您能提供更多详细信息,请comment/edit!