Android armeabi\arm64\x86 不同CPU架构打包配置

2,445 阅读4分钟

谷歌规定:自 2019 年 8 月 1 日起,在 Google Play 上发布的应用必须支持 64 位架构。 64 位 CPU 能够为您的用户提供更快、更丰富的体验。如何查看自己的设备和应用是32位还是64位。

一、查看自己的设备CPU架构类型

手机开启USB调试后,连上电脑,在Windows CMD窗口中输入命令:

1、adb devices

查看设备是否连接上

2、adb shell getprop ro.product.cpu.abi

查看手机的CPU架构类型

总结一下,现在市面上常见的CPU架构类型如下:

1、armeabi-v7a: 第7代及以上的 32位ARM 处理器

2、arm64-v8a: ****第8代、64位ARM处理器

3、armeabi: ****第5代、第6代的32位ARM处理器,早期的手机在使用,现在基本很少了。

4、x86: Intel 32位处理器,在平板、模拟器用得比较多。

5、x86_64: Intel 64位处理器,在平板、模拟器用得比较多。

如何查看应用安装包是32位还是64位

查看应用文件中是否包含相应的库文件即可。对于 ARM 架构,32 位库位于 armeabi-v7a 中。 对应的 64 位库则位于 arm64-v8a 中。

对于 x86 架构,32 位库位于 x86 中,64 位库则位于 x86_64 中。

使用Android studio 打开应用包

查看 lib 文件夹,您可以在其中找到“.so”文件。如果在您的应用中找不到任何“.so”文件,则说明该应用已支持 64 位架构,您无需采取进一步措施。如果您看到 armeabi-v7ax86,则说明您有 32 位库。

如果您看到 32 位和 64 位的库均已打包到软件包中,则可以跳至在 64 位硬件上测试应用

通过解压缩 APK 查找原生库

APK 文件的结构类似于 ZIP 文件,可以像 ZIP 文件一样解压缩。只需要把apk文件后缀改成zip,然后直接解压,再搜索文件夹内是否存在 armeabi-v7a 库和 arm64-v8a 库即可。

基于向下兼容的原则,64位手机是支持32位和64位应用的。而只支持64位的应用是没有办法在32位手机上面运行的。由于谷歌规定新的应用必须支持64位,所以你的应用可以支持32位也可以不支持,如果你们的应用只支持64位,那么在32位手机上面就无法安装了

如何配置打包不同的so库

在 build.gradle 构建脚本中 , 配置 ndk 编译的动态库 CPU 架构类型 ;

在 " android / defaultConfig / ndk " 层级下 , 配置 abiFilters 选项 , 为其配置需要打包的 动态库 CPU 架构 ;

如果按照 abiFilters “armeabi-v7a”, “arm64-v8a”, “x86”, “x86_64” 配置 , 则打包时会将四种 CPU 架构的动态库都配置到 APK 中 ;

动态库打包配置 :

android {
    defaultConfig {
        //打包后的应用大小, 可以选择性打包一些库
        ndk{
            // 打包生成的ARM 指令集的动态库
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
    }
}

打包时 , 如果当前工程资源中 , 有 4 种全架构的动态库 , 系统会将这四个动态库都打包到 APK 安装包中 ;

事实上 , 绝大部分应用都不需要配置全架构的动态库 , 市面上的 x86 手机几乎绝迹 , 另外 “arm64-v8a” 架构的 CPU 可以向下兼容 “armeabi-v7a” 架构的动态库 ;

因此 , 这里只提供 “armeabi-v7a” 架构的动态库即可 , 市面上大部分应用也是这么干的 ; ( 即使是微信也只支持 armeabi 这一个架构 )

注意 : 如果要在电脑上的 Android 模拟器上运行动态库 , 需要支持 “x86” 架构 , 大部分 PC 上的 Android 模拟器都是 x86 架构的 ;

优化打包so库

只支持 “armeabi-v7a” 指令集架构的动态库打包配置 :

android {
    defaultConfig {
        ndk{
            // 只支持 “armeabi-v7a” 指令集架构的动态库打包配置 
            abiFilters "armeabi-v7a"
        }
    }
}

打包后apk的大小体积上的减少。