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架构/支持ABI | armeabi | armeabi-v7a | arm64-v8a | x86 | x86_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
Android NDK调试出错Unknown Application ABI, Unable to detect application ABI's的解决方式