1. ABI 定义

Android 设备的 CPU 类型 通常称为 ABIs,看下Google老大哥是怎么介绍的ABI的,翻译官方文档:

同 Android 手机使用不同的 CPU,因此支持不同的指令集
CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)
ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互
您必须为应用要使用的每个 CPU 架构指定 ABI

早期的 Android 系统几乎只支持 ARMv5CPU 架构,你知道现在它支持多少种吗?7 种!

Android 系统目前支持以下七种不同的 CPU 架构:

  • armeabi/ARMv5
    第5代、第6代的ARM处理器,早期的手机用的比较多

  • ARMv7 (从2010年起)
    第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它

  • MIPS (从2012年起)
    arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一

  • x86
    从2011年起, 平板、模拟器用得比较多

  • x86_64
    从2014年起, 64位的平板

  • MIPS64

每一种都关联着一个相应的 ABI. 应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

ABI 和支持的指令集:

2. 不同 CPU 架构对 APK 性能的影响

看完 Google 文档,就明白了:不同的 CPU 支持不同的指令集。当我们需要我们 APP 支持尽可能多的不同 CPU 的时候,只需要将不同版本的 .so 文件放置在不同的目录下,APK 安装运行的时候会根据自己需要而自己选取。

但是这样却带来一个问题,APK文件较大,影响用户下载。

那我们是否可以只放置一些呢?必然可以!

我们继续看 Google 是怎么说的:

  • 为实现最佳性能,应直接针对主要 ABI 进行编译。例如,基于 ARMv5TE 的典型设备只会定义主要 ABI:armeabi
  • 相反,基于 ARMv7 的典型设备将主要 ABI 定义为 armeabi-v7a,而将辅助 ABIarmeabi,因为它可以运行为每个 ABI 生成的应用原生二进制文件
  • 许多基于 x86 的设备也可行 armeabi-v7aarmeabi NDK 二进制文件
  • 对于这些设备,主要 ABI 将是 x86,辅助 ABIarmeabi-v7a
  • 基于 MIPS 的典型设备只定义主要 ABImips
  • 安装应用时,软件包管理器服务将扫描APK,查找以下形式的任何共享库:
    lib//lib.so
  • 如果未找到,并且您已定义辅助 ABI,该服务将扫描以下形式的共享库:
    lib//lib.so
  • 找到所需的库时,软件包管理器会将它们复制到应用的 data 目录 (data/data//lib/) 下的/lib/lib.so

3. .so 文件相关及一些建议

具体可以惨开博客: 《与 .so 有关的一个长年大坑 》

.so库又是什么鬼? NDK 编译出来的动态链接库

一些重要的加密算法或者核心协议一般都用c写然后给java调用。这样可以避免反编译后查看到应用的源码。

so库又该如何存放?

  • 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
  • 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹

.so文件时有一条简单却并不知名的重要法则

你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件

4. ABI 兼容性

  • armeabi-v7a :armeabi-v7a向下兼容 armeabi
  • arm64-v8a : 能兼容 armeabi-v7a 和 armeabi
  • x86_64 : 兼容 x86
  • mips64 : 兼容 mips

5. 分析主流 app Apk 所用的 ABI

  • 仅有 armeabi: 微博,今日头条,淘宝,QQ,微信
  • armeabiarmeabi-v7a: UC 浏览器,Facebook、Twitter
  • armeabiarmeabi-v7aarmeabi-x86:优酷,哔哩哔哩动画。
  • 7种类型全有:知乎

6. 各版本使用情况分析

  • mips / mips64: 极少用于手机可以忽略
  • x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
  • armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
  • armeabi-v7a: ARM v7 目前主流版本
  • arm64-v8a: 64位支持

ARMv8 是一套不错的指令集,它既支持64位程序,也向下兼容现有32位程序。所以你不用担心兼容性问题。

7. 参考链接:

https://blog.csdn.net/u012400885/article/details/52923765
重点: https://blog.csdn.net/ouyang_peng/article/details/51168072?utm_source=blogxgwz2

更多相关文章

  1. Android(安卓)Studio 翻译插件Translation和strings.xml多语言文
  2. Linux 下使用命令行开发 Android(安卓)应用程序~~玩玩还行
  3. Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及
  4. 在Android中调用WebService .
  5. react-native-vector-icons使用
  6. Android(安卓)在一个APP内打开另一个APP
  7. Android使用矢量图(SVG, VectorDrawable)实践篇
  8. 三星给中国电信定制的支持Android(安卓)2.0新机i899
  9. 完美解决 Android(安卓)studio 检测不到 genymotion模拟器设备!!

随机推荐

  1. 安卓视频通讯与监控系统完全版本正式发布
  2. cordova的android notify消息通知插件
  3. android studio无法在可视化页面预览布局
  4. android的sdk源码下载地址及关连方法
  5. Android Build System详解
  6. 应用程序基础(Application Fundamentals)
  7. Android 中使用MIC(麦克风)录音
  8. Android官方培训课程中文版(v0.9.7)
  9. android中类似于gif 实现图片的动画效果
  10. Android 闪屏页 全屏设置方法