Android NDK和ABI简介

Posted 程序员-吴彦祖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK和ABI简介相关的知识,希望对你有一定的参考价值。

NDK

NDK,Nactive Develop kit 本地开发工具集

  • 允许android应用程序使用C和C++代码的一套工具集。
  • 包含了android上的一些库和编译C 和C++代码的脚本。
  • 能够使用NDK工具将C和C++代码编译成.so文件,然后在Java中使用。

为什么需要使用原生代码(C或C++)?

  • 效率,C或C++的运营效率要比Java高,对于需要密集计算的功能使用原生代码更合适。
  • 安全,C或C++编译后的.so文件相比于java代码难以反编译查看源码,对于一些加密算法或保密性较高的代码,使用原生代码更安全。
  • 平台可移植,在平台之间移植其应用。

JNI

  • JNI英文全拼:Java Native Interface,是Java和C或C++组件之间的通信接口。通过JNI可以使得Java与C/C++接口交互。即可以在Java中调用C/C++代码,也可以在C/C++中调用Java代码。
  • JAVA自身及支持,非Android原创。
  • 简单来说就是JAVA与C/C++相互调用的规范。

ABI

不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。

  • android中对应的ABI目录支持:armeabi 、armeabi-v7a、arm64-v8a、x86、x86_64、mips和mips64。(后面这两基本没见过)

  • CPU架构

    • 早期Android只支持ARMv5的CPU架构。
    • 目前支持7中CPU架构:ARMv5,ARMv7(2010年),x86(2011年),MIPS(2012年),ARMv8(2014年)MIPS64和x86_64(2014年),每一种架构都有一个对应的ABI。
  • ABI

    • 应用程序二进制接口(Application Binary Interface)
    • 定义了二进制文件(.so)如何运行在系统平台上,从指令集、内存对齐到可用函数库。
  • 通常一个设备不仅支持一种ABI,通常两种:主ABI和辅ABI

    • getprop ro.product.cpu.abilist可用查看设备支持的ABI列表
    • 对于支持多种ABI的设备,如果apk支持多种ABI,apk安装时系统会首先从主ABI目录中找到对应的.so文件,如果不存在主ABI目录,会从辅ABI目录中寻找。
CPU架构/支持ABIarmeabiarmeabi-v7aarm64-v8ax86x86_64
ARMv5支持(优先)
ARMv7支持支持(优先)
ARMv8支持支持支持(优先)
x86支持支持支持(优先)
x86_64支持支持支持(优先)

查看设备CPU架构与ABI

  • 查看cpu架构
    • cat proc/cpuinfo
  • 查看支持的ABI
    • getprop ro.product.cpu.abi
    • getprop ro.product.cpu.abilist
  • 强制安装特定ABI
    • adb install --abi armeabi-v7a

.so文件

  • C/C++语言通过NDK编译之后的动态代码库。
  • 应该尽可能为每个ABI提供优化过的.so文件,来获取更好的性能。
  • Android stidio中应该放到jniLibs/ABI目录中,也可以通过build.gradle中的jniLibs.srcDir指定目录。
  • 为减少APK体积,通常只保留armeabi和armeabi-v7a(绝大多数android设备都支持)。
  • 每个ABI目录中的.so文件数据应该保持一致,即使一个.so文件只提供了其中一种版本的文件,也应该将其拷贝到应用的其他ABI目录下(应尽量避免这种情况,为每个支持的ABI提供对应的.so文件)。
  • 同上一条,ARMv8支持armeabi和armeabi-v7a代码,但是运行arm64-v8a性能要好得多。

适配方式

  • 只适配armeabi,基本兼容了全部机型。缺点是性能低,大部分设置都需要使用辅ABI。
  • 只适配armeabi-v7a,除一些老设备(智能电视开发慎用,机型大多比较老,配置低),兼容绝大部分新设备型号。
  • 只适配arm64-v8a,还能运行在ARMv8 CPU设备上,但是可以获取更好的性能。

通常用armeabi + armeabi-v7a的适配方案,可以很好的兼顾性能与APK包大小问题。当然在不需要考虑APK包大小的情况下,全部适配是最好的。

针对指定ABI构建APK

android 
    defaultConfig 
        ndk 
            abiFilters 'arm64-v8a', 'x86_64'
        
    
 

APK打包时,只打包指定的ABI的.so文件。

第三方库中存在.so文件问题

需要特别注意的是:当第三方库中存在.so库文件时,第三方库适配的ABI要与我们项目自身适配的ABI目录保持一致,也就是说打包后的APK的所有ABI目录中.so文件数量必须保持一致。

文末

我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。

需要的直接点击文末小卡片可以领取哦我免费分享给你,以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持,需要的自己领取)

Android学习PDF+架构视频+面试文档+源码笔记

部分资料一览:

  • 330页PDF Android学习核心笔记(内含8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT大厂面试题(有解析)

领取地址:

点击下方卡片免费领取

以上是关于Android NDK和ABI简介的主要内容,如果未能解决你的问题,请参考以下文章

平台 android NDK 不支持 ABI [armeabi, mips]

android ndk cmake Invalid Android ABI

NDK SO 库开发与使用中的 ABI 构架选择

android JNI开发

Android NDK调试出错Unknown Application ABI, Unable to detect application ABI's的解决方式

在 ABI 的 NDK 工具链文件夹中找不到工具链,前缀为:mips64el-linux-android 如何修复?