针对具有零字节存根的特定API版本的模拟器出现INSTALL_FAILED_NO_MATCHING_ABIS错误

时间:2019-06-10 12:47:07

标签: android android-ndk android-emulator android-build

我们正在尝试通过使用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仿真器上安装该应用程序。深入研究发现,我们可以使用x86映像为API 26+在模拟器上安装该应用程序,但在API 21-25上安装却失败,并显示INSTALL_FAILED_NO_MATCHING_ABIS

在API 21-25上是否有任何理由不能将零字节存根用于解决此问题?

编辑:经过进一步的测试,看来安装确实适用于API 16-19,只有21-25成为问题。

1 个答案:

答案 0 :(得分:0)

经过一番摸索,我们发现答案很简单(尽管有点怪异):API 21-25仿真器映像无法识别架构,除非它包含看起来像有效库的文件,在这种情况下,这意味着拥有一个“ lib”前缀。将零字节存根的文件名从stub.so更改为libstub.so可以解决此问题。

我相信这是由于sonames周围的约定,但我不完全理解为什么某些模拟器版本比其他版本更严格。

如果您可以提供更多详细信息,请发表评论/编辑!