一、安卓CPU架构梳理

Android 目前共支持7种CPU架构:

mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a

  • armeabi:第5代ARM处理器,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢。它能运行在除了mips和mips64的设备上,但在非 armeabi设备上运行性能还是有所损耗;
  • armeabi-v7a:第7代32位ARM处理器,支持硬件浮点运算(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构)
  • arm64-v8a:第8代、64位ARM处理器(支持 armeabi-v7a、armeabi 和 arm64-v8a)
  • X86:电脑、平板CPU架构,因此手机模拟器也通常为X86,设备兼容X86、armeabi
  • x86_64:电脑、平板CPU架构,设备兼容X86_64、X86、armeabi
  • mips、mips64:基本没见过

他们关系用表格表示如下:

Platform32-bit libraries64-bit libraries所属公司
ARMarmeabi-v7aarm64-v8a英国ARM
x86x86x86_64美国Intel
mipsmipsmips64美国MIPS

二、单ABI适配方案

ABI:英文Application Binary Interface的缩写,也就是应用二进制接口。不同的CPU 与指令集的每种组合都有 定义的 ABI (应用程序二进制接口),一段程序只有遵循这个接口规范才能在该 CPU 上运行。

目前手机市场上,x86 / x86_64/armeabi/mips / mips6 的架构,基本可以不不考虑了,它们的占有量应很少很少了,arm64-v8a作为最新一代架构,应该是目前的主流,armeabi-v7a只存在少部分老旧手机。

因此我们主要针对armeabi适配,如果你没有模拟器的适配需求的话。

2.1、只适配armeabi

优点:基本上适配了全部CPU架构(除了淘汰的mips和mips_64)
缺点:性能低,相当于在绝大多数手机上都是需要辅助ABI或动态转码来兼容

2.2、只适配 armeabi-v7a

优点:兼容性强,支持armeabi-v7a和arm64-v8a,包体积小、性能也相对较强(支持硬件浮点),属于前几年主流适配方案

缺点:无法发挥现在64位机器的性能,64位机器需要向下兼容到32位

2.3、只适配 arm64-v8

优点:性能最佳,包体积小
缺点:兼容性差,只能运行在arm64-v8的64位机器上

三、应用商店64位APP上架适配

目前64位适配方案:armeabi-v7a、arm64-v8。用一张图表示整个查找过程

image-20220127202810611

方案一:同时适配armeabi-v7a、arm64-v8

这是目前使用比较多的适配方案,我们在app -> Gradle的ndk abiFilters中配置即可

优点:兼容性强、性能高,支持64位,省事(只打一个包)

缺点:打包时需要把"armeabi-v7a", "arm64-v8a"下两份so库合到一个包,包体积较大

评价:目前适配64位懒人做法

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

方案二:armeabi-v7a、arm64-v8分开打包

这种也是目前比较主流的适配方案,我们在app -> Gradle的split分包中配置即可

优点:兼容性强、性能高,支持64位,包体积小(目前各大应用市场已经提供32位;64位的包分开上传)

缺点:应用分发时稍微麻烦,需要同时上传32位、64位。

评价:这种是未来的趋势

android {
		...
    splits {
        abi {
            reset()
            enable true
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "arm64-v8a"
        }
    }
    ...
}

四、android studio配置梳理

4.1、ndk abiFilters

用于配置一个包打多个CPU架构的

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

4.2、Android split分包

用于配置分包

  • enable: 是否启用ABI拆分机制

  • reset():重置ABI列表为只空字符串,一半和include、exclude一起使用,如果要用必须在- - include和exclude前面

  • include:指明要包含哪些ABI,目前使用最多的伪64位处理器的arm64-v8a,其次才是- armeabi-v7a

  • exclude:默认包含下所有ABI,可以移除一些ABI

  • universalApk:是否打包一个通用版本,包含所有的ABI,默认值为 false

splits {
    abi {
        reset()
        enable true
        universalApk false  // If true, also generate a universal APK
        include "armeabi-v7a", "arm64-v8a"
    }
}

可以根据配置不同打出多个包

image-20220127202810611

4.3、ndk abiFilters && Android split分包区别

根据需求配置,一般不能同时配置(或者enable置为false),会编译报错

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐