Android:So库适配简单总结

前言

日常开发我们经常会使用到第三库,涉及到底层的语音,视频等都需要添加so库。
而so库的体积一般来说非常的大,不搞清楚随意添加会导致apk体积暴增。
本文只做一个简单的学习总结。强烈建议阅读文章:
为何大厂APP如微信、支付宝等只适配了armeabi-v7a/armeabi?

CPU架构

Android目前支持以下7种ABIs(Application Binary Interface的缩写,即应用二进制接口):

mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a
CPU架构描述市场占有
arm64-v8a第8代ARM,64位目前主流版本
armeabi-v7a第7代ARM,32位一些老旧手机
armeabi第5代ARM,32位,NDK r17不再支持极少,可忽略
x86_64/X86intel,64位/32位,可兼容arm的so库1%以下
mips64/mipsNDK r17不再支持极少用于手机,可以忽略

x86_64/X86:架构的手机都会包含由Intel提供的称为Houdini的指令集动态转码工具实现对arm.so的兼容,再考虑x86 1%以下的市场占有率,x86 相关的两个 .so 也是可以忽略的。

如何选择?

我们来看一下大厂App如何选择so库:

Appcpu
微信arm64-v8a
支付宝armeabi
QQarmeabi
手机淘宝armeabi-v7a

值得一提的是,这4大App都只适配了一种Cpu架构。

上面这些APP只适配了一种CPU架构,比如只适配了armeabi-v7a,那如果APP装在其他架构的手机上,如arm64-v8a上,会崩溃吗?

答案是不会的。
因为armeabi-v7a和arm64-v8a会向下兼容:
只适配armeabi的APP可以跑在armeabi,x86,x86_64,armewabi-v7a,arm64-v8上
只适配armeabi-v7a可以运行在armeabi-v7a和arm64-v8a
只适配arm64-v8a 可以运行在arm64-v8a上

当然这会损失一些性能。见下图,你就明白了:
在这里插入图片描述

适配方案

综合上面市场占有及大厂适配方案来看,我们只需要适配arm架构即可,即armeabi,armewabi-v7a,arm64-v8三选一。

1.方案一:只适配armeabi
优点:基本上适配了全部CPU架构(除了淘汰的mips和mips_64)
缺点:性能低,相当于在绝大多数手机上都是需要辅助ABI或动态转码来兼容
2.方案二:只适配armeabi-v7a
同理方案一,只是又筛掉了一部分老旧设备,在性能和兼容二者中比较平衡
3.方案三: 只适配arm64-v8
优点: 性能最佳
缺点:只能运行在arm64-v8上,要放弃部分老旧设备用户

Google Play 从2019年8月开始,就强制APP适配arm64-v8a,以慢慢淘汰32位的armeabi-v7a。
所以全面适配arm64-v8是迟早的事,因此新项目建议提前适配arm64-v8。

如果我们既不想放弃旧设备用户,也要保证性能,就只能牺牲apk的体积为代价:

ndk {
            abiFilters "armeabi", "arm64-v8a"
        }

使用abiFilters,就能指定app打中包含哪些Cpu架构的so库,不指定的则被忽略。

注意事项

需要注意的是,虽然ABI加载So会向下兼容。但是如果你的App同时存在两种架构如:"armeabi", "arm64-v8a"。  
那么不同Cpu架构的手机便只会加载对应的SO库不再向下兼容。
比如a.so存在armeabi中,不存在arm64-v8a中。那么arm64-v8a手机加载a.so库时,便会崩溃。  
因此需要每个So库同时添加到每种架构中。
armeabi-v7a与armeabi都适用于32位CPU架构,因此理论上他们的So库时完全通用的,
即如果你的项目只适配了armeabi架构,但是第三方框架只提供了armeabi-v7a的So库,也是可以直接用的。
但是arm64-v8a是64位的,所以无法通用。
一些没人维护的第三方库,年久失修,可能没有arm64-v8a架构的So库。
我们这个时候就要考虑是否适配arm64-v8a架构,或者使用其他库代替。  

后记–性能+兼容能否兼得?

除了适配所有全部CPU架构外,就特么不能性能和兼容同时兼得吗?其实Google早有考虑。

可以实现的那就是 abi split,分包,实现也很简单,在gradle 中添加如下配置:

 android {
      ...
      splits {

        // Configures multiple APKs based on ABI.
        abi {

          // Enables building multiple APKs per ABI.
          enable true

          // By default all ABIs are included, so use reset() and include to specify that we only
          // want APKs for x86 and x86_64.

          // Resets the list of ABIs that Gradle should create APKs for to none.
          reset()

          // Specifies a list of ABIs that Gradle should create APKs for.
          include "x86", "x86_64", "arm64-v8a", "armeabi", "armeabi-v7a"

          // Specifies that we do not want to also generate a universal APK that includes all ABIs.
          universalApk false
        }
      }
    }

就能为每个CPU架构单独打一个APK,该apk中就只包含一个架构。

这样,又能保证性能,又能不额外增加APK的大小,同时又又很完美的兼容,因为可以为所有架构都单独打一个包,一举多得。

Google Play 支持上传多个不同平台的APK,这样,就能根据不同的CPU架构,下载不同的包。

但是,很遗憾,国内的应用商店目前还不支持!因此看看就好 23333

参考

https://mp.weixin.qq.com/s/jnZpgaRFQT5ULk9tHWMAGg

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android屏幕适配是指在开发Android应用时,考虑到不同屏幕尺寸、屏幕分辨率和像素密度的问题,以保证应用在各种Android设备上都能正常显示和运行。由于Android设备存在多种尺寸和分辨率,不同设备上同样的元素可能会呈现不同的效果,因此屏幕适配工作变得越来越重要。 为了进行屏幕适配,开发人员需要考虑以下几个方面: 1. 使用适当的尺寸单位:在Android开发中,可以使用不同的尺寸单位来适配不同的屏幕。常用的尺寸单位包括dp(density-independent pixels)和sp(scaled pixels)。使用dp作为尺寸单位可以使得元素在不同像素密度的设备上显示一致。 2. 使用限定符进行适配Android提供了多种限定符,如smallestWidth限定符,可以根据设备的最小宽度来进行适配。通过添加少量的dimens.xml文件,可以实现对不同屏幕尺寸的适配。 3. 使用可伸缩的布局:为了适配不同屏幕尺寸,可以使用可伸缩的布局,并使用权重属性来控制元素的大小和位置。这样可以确保在不同屏幕上元素的布局能够自适应调整。 4. 使用多布局文件:根据不同的屏幕尺寸和分辨率,可以使用不同的布局文件来适配不同的设备。通过在res目录中创建不同的布局文件夹,可以实现对不同屏幕的适配总结来说,Android屏幕适配是为了确保应用在不同的Android设备上都能够正常显示和运行,需要考虑到屏幕尺寸、屏幕分辨率和像素密度等因素。通过使用适当的尺寸单位、限定符、可伸缩的布局和多布局文件等方法,可以实现对不同屏幕的适配。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android屏幕尺寸适配常见方案smallestWidth](https://blog.csdn.net/cat_is_so_cute/article/details/124458433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【Android】之屏幕适配](https://blog.csdn.net/yang553566463/article/details/127029556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值