我们正在尝试通过使用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成为问题。
答案 0 :(得分:0)
经过一番摸索,我们发现答案很简单(尽管有点怪异):API 21-25仿真器映像无法识别架构,除非它包含看起来像有效库的文件,在这种情况下,这意味着拥有一个“ lib”前缀。将零字节存根的文件名从stub.so
更改为libstub.so
可以解决此问题。
我相信这是由于sonames周围的约定,但我不完全理解为什么某些模拟器版本比其他版本更严格。
如果您可以提供更多详细信息,请发表评论/编辑!