Android架构用法?

时间:2015-10-20 04:42:15

标签: android android-ndk arm

我有一些相当大的应用程序二进制大小的本机库。我查看了APK splitting,但维护和QAing多个APK并不是我想做的事情。

所以我想使用ndk.abiFilters Gradle属性在我的发布版本中排除未使用的架构。 (调试版本我想单独留下,以便我可以在x86上运行HAXM加速仿真器。)

我想在我的发布版本中只有armeabi-v7a和arm64-v8a,但我不确定是否值得担心我正在放弃的其他架构的市场份额。经过大量的回顾,我找不到任何ARMv6(armeabi),MIPS,x86或x86_64的市场份额参考。我的直觉告诉我,后三者几乎不存在,但我不确定ARMv6。

我发现this link on a forum有一系列使用各种架构的手机。某处有更可靠的东西吗?也许有%的用户与Android版本的信息中心类似?

如果我只为armeabi-v7a和arm64-v8a(或armeabi,armeabi-v7a和arm64-v8a)构建我的原生库,我可能会错过任何其他内容?

4 个答案:

答案 0 :(得分:36)

首先,如果你担心二进制大小,你真的不需要arm64-v8a,所有这些设备都可以正常运行armeabi-v7a二进制文件。只有当你真的需要填补它的最后一个额外性能时,它才有可能是值得的。

armeabi和ARMv6;从Android 4.4(2013年10月)开始,Android本身不再正式支持它 - 从Android 4.0开始它应该不太常见(从该版本开始,AOSP源需要修改仍然为ARMv6构建)。所以在实践中,如果你不支持低于4.4的版本,你可以放弃那个没有任何重大损失。

另外,对于x86;这些设备中的许多设备都具有令人惊讶的臂式二进制仿真功能,所以那些可以使用armeabi-v7a版本管理也很好。

答案 1 :(得分:29)

使用app bundles时,包含其他体系结构将不再对二进制文件大小产生任何影响,因为在这种情况下,Google Play将仅为每个设备提供适用于该特定设备的二进制文件。不仅如此,应用程序更新也将更小更快。

保留项目的先前信息仍未使用应用程序包:

  • 不幸的是,Android Dashboard虽然有用,却不提供架构信息,也不提供Google Analytics。

  • Unity statistics过去常常提供statistics per architecture and CPU features。但请注意,这些不是一般统计数据,而是仅涵盖Unity应用程序/游戏的用户。这些信息似乎不再在公共链接中提供,因此我已将这些直接链接替换为archive.org中的最新快照。

答案 2 :(得分:7)

我在使用Mapbox时遇到了这个问题,发现这个article很有用。

基于底部图片,您只需要 armeabi-v7a x86 ,并基于Jose Gómez答案,我只需添加 armeabi-v7a >并且完全没有问题。

因此将此行添加到您的app.gradle

android {
 defaultConfig {
        //other configs
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

如果您仍然担心2%-3%的人使用x86架构,例如 ASUS ZenFone lenovo 手机,则必须在{{1} }

app.gradle

enter image description here

答案 3 :(得分:3)

当我阅读@mstorsjo答案时,我有点困惑如何仅真正使用一个(或两个)本机库,即使它非常简单明了。因此,我将在此处给出一个示例和更多解释(基于我的进一步研究)。

对于每种受支持的体系结构,我们必须在jniLibs文件夹中创建一个特定的文件夹,然后将.so文件拖放到该文件夹​​中。例如,为了支持 armeabi-v7a (32位)和 arm64-v8a (64位):

|--app
|--|--src
|--|--|--main 
|--|--|--|--jniLibs 
|--|--|--|--|--armeabi-v7a 
|--|--|--|--|--|--.so Files 
|--|--|--|--|--arm64-v8a 
|--|--|--|--|--|--.so Files 

使用 armeabi-v7a ,您支持90%以上的可用设备,但由于它是32位体系结构,因此在64位设备上运行它会导致性能下降(20-30%) {1}。对于每种特定情况,通过将ABI指定为过滤器,可以很方便地检查受支持设备的实际数量,这可以在Google Play控制台的“发行管理”>“设备目录”部分中完成。

注意

如果不为所有体系结构添加二进制文件,则必须注意以下几点:

如果您的应用程序包含其他任何本机库,则必须确保它们也只有相同版本。这是由于Android要求所有加载的本机库都针对同一架构而构建。例如,如果第一个加载的本机库是 armeabi-v7a ,则Android将在所有System.loadLibrary( armeabi-v7a 库中查找 ONLY )之后致电。如果找不到确切的体系结构,则会抛出java.lang.UnsatisfiedLinkError异常。 {1}

我遇到了这个问题,因为我的某些依赖项使用本机库,因此无法再加载 armeabi-v7a