Android 64 位架构适配指南手把手教学

背景

2019年8月1号,在 Google Play上发布应用必须支持64位架构,紧接着 小米应用商店、OPPO 应用商店、vivo 应用商店、腾讯应用宝和百度手机助手等五大应用商店宣布,为更好提升 App 性能体验并降低功耗,五方将共同推进国内安卓生态对 64 位架构的升级支持。
在这里插入图片描述
具体的时间表:

  • 2021年12月底,现有和新发布的应用、游戏,需要上传包含 64 位包体的 APK 包。也就是说所有上传的应用都应该包含 64 位代码的版本,不再接受仅有 32 位版本的应用上传。

  • 2022年8月底,对于支持 64 位的硬件系统,将只接收 64 位版本的 APK 包。也就是如果到时用户手中的硬件设备支持 64 位系统的话,那么将只运行 64 位版本的应用。

  • 2023年底,硬件将仅支持 64 位APK,32 位应用无法在终端上运行。

现状

Platform32-bit libraries folder64-bit libraries folder
ARMlib/armeabi-v7alib/arm64-v8a
x86lib/x86lib/x86_64

目前手机 cpu 架构是 armeabi 、 armeabi-v7a 、 arm64-v8a 、 x86 、 x86_64 ,但是目前手机基本上都是 arm 架构,x86 架构的手机基本上没有,基本上是平板,可以忽略。了解更多 Android ABI 知识

armeabi是十年前的手机CPU架构,基本上没有了。

armeabi-v7a的CPU架构是32位。

arm64-v8a的CPU架构是64位。

所以目前需要考虑的 armeabi-v7aarm64-v8a 这两款就可以了, 之前开发者在打包的时候,为了包大小的考虑,常常指定打包的时候,只指定 armeabi-v7a 架构的 so 包,这样包大小可以小很多,尤其是 so 库多的应用。

ndk {
	abiFilters "armeabi-v7a"
}

在项目的 gradle 中配置 ndk 就可以,64 位的手机会自适应 32 位的应用,这样可以完美的兼容市面上99.9%的手机,这样包大小也会小很多 但是这样 64 位处理器的性能就无法完美的发挥出来,那么应用 64 位有哪些好处呢?

由于一些软件功能越来越多,安装包的体积、运行时需要消耗的运行内存越来越大,32 位应用的局限性越来越突出。而 64 位系统,可以在单个线程里使用超过 4 GB 的运行内存,当处理一些大型软件、或者进行高像素图像、视频处理的时候,就更能够发挥手机硬件的优势。比如一些大型游戏、网络视频直播、高画质影音播放等等。而且 64 位系统相比 32 位系统,会带来至少 20% 以上效率的提升。

打入 64 位的 so 包必然导致包大小增大很多,导致用户下载体验差,目前 Google paly 支持上传 32 位和 64 位的两个 apk,这样用户可以根据手机 cpu 架构动态的下载那个 apk

国内市场暂不支持,但是这个是趋势,之后必然要上这个功能的,我们在开发的时候,暂时还需要支持armeabi-v7aarm64-v8a两个架构,包大小也会增大很多。

App 需要适配吗

App 需要适配吗?一个原则:如果你的 app 用了 C 库,native 代码,so 文件,就需要去适配。不光是你的代码,而且关注你引用的第三方库;对于 java 或 kotlin 代码则不需要关注。

查看 apk 的架构

点击打出来的 apk 包,就会出现在目前的 apk 架构
在这里插入图片描述
查看 Android 手机的 CPU 架构
Win + R 然后输入 cmd
执行:

adb shell  
cat  /proc/cpuinfo

在这里插入图片描述
CPU architecture:7 表示arm-v7,8表示arm-v8

处理方案

小米应用商店支持 64 位架构适配指南

vivo 应用商店 64 位架构适配指南

oppo 应用商店 64 位架构适配指南

若要确定应用是否包含 64 位库,最简单的方法就是检查 APK 文件的结构。在构建时,APK 会与应用所需的所有原生库打包在一起。原生库会根据 ABI 存储在不同的文件夹中。您的应用不一定要支持所有 64 位架构,但对于支持的每种原生 32 位架构,应用都必须包含相应的 64 位架构。

对于 ARM 架构, 32 位库位于 armeabi-v7a 中。对应的 64 位库则位于 arm64-v8a 中。
对于 x86 架构, 32 位库位于 x86 中,64 位库则位于 x86_64 中。

着手修改

我们根据小米应用商店支持 64 位架构适配指南修改我们的应用:

1、将 arm64-v8a 和/或 x86_64(视您要支持的架构而定)添加到应用的build.gradle文件中即可,我这里支持 armeabi-v7aarm64-v8a

android {
    defaultConfig {
        ......
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a"
        }
    }
}

2、修改 jniLibs 里的 so 文件

因为上边我支持了 armeabi-v7aarm64-v8a 两种架构,所以在 jniLibs 中新建 armeabi-v7aarm64-v8a两个文件夹,在第三方库的官网找到对应架构的 .so 文件放进去。
在这里插入图片描述
例如,因为我之前的项目只支持了 armeabi 架构,所以之前只有一个 armeabi 文件夹,我可以打开这个文件夹看一下用到的哪些第三方的库,到第三方官网找到对应架构的文件。最后把 armeabi 文件夹删了就行了。

例如 libbd 开头的这四个,是百度语音需要的 so 包
在这里插入图片描述
所以我们去百度语音官网,下载离线语音SDK,把 armeabi-v7aarm64-v8a 这两个文件夹里的内容放到我们项目里即可。
在这里插入图片描述
其他的 .so库都这样操作

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值