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!