【音视频】Android NDK 与.so库适配

一、名词解析

名词全称核心说明
Android NDKNative Development Kit在SDK基础上增加“原生”开发能力,支持使用C/C++编写代码,用于开发需要调用底层能力的模块(如音视频、加密算法等)
.so库Shared Object即共享库,由NDK编译生成的动态链接库,是底层功能(如音视频处理、核心算法)的载体,体积通常较大,对APK体积影响显著
ABIApplication Binary Interface应用二进制接口,是一套规范,定义了二进制文件(如.so库)如何在特定CPU架构和操作系统上运行的规则
EABIEmbedded Application Binary Interface嵌入式应用二进制接口,是ARM架构对ABI规范的优化实现(2005年推出),PowerPC架构也有对应的EABI实现

在这里插入图片描述

在这里插入图片描述

二、32位与64位CPU区别

32位和64位的本质是CPU通用寄存器(GPRs)的数据宽度,直接决定了CPU一次能处理的数据量、操作系统能力及软件兼容性,具体区别如下:

对比维度32位CPU/操作系统64位CPU/操作系统
寄存器宽度32bit,一次可处理32位数据64bit,一次可处理64位数据
设计初衷面向普通用户,运行日常软件(如QQ、浏览器)面向高性能需求场景(如机械设计、3D动画、视频编辑),需大量内存和浮点运算
软件兼容性仅支持32位应用兼容32位应用(过渡需求),原生支持64位应用
内存控制实际可识别内存上限约3.5GB实际可支持内存上限达128GB(甚至更高)

三、Android支持的CPU架构与市场占比

Android系统目前支持7种ABI,但多数架构因市场占比极低已被淘汰(如MIPS系列),实际开发中仅需关注ARM架构系列。

CPU架构核心描述市场占比兼容性说明
arm64-v8a第8代ARM架构,64位目前主流(占比最高)仅支持自身架构;可兼容运行armeabi-v7a、armeabi的32位应用(但会损失性能)
armeabi-v7a第7代ARM架构,32位少量老旧设备(2011年起大规模使用)支持自身架构;可兼容运行armeabi应用(损失性能);无法在arm64-v8a外的其他架构运行
armeabi第5代ARM架构,32位极少(可忽略)NDK r17版本后不再支持;可在armeabi、x86、x86_64、armeabi-v7a、arm64-v8a架构上运行
x86 / x86_64Intel架构,32位/64位1%以下包含Intel的Houdini指令集转码工具,可兼容ARM架构的.so库;因占比极低,通常无需适配
mips / mips64MIPS架构,32位/64位几乎为0(手机端极少使用)NDK r17版本后不再支持,可完全忽略

四、大厂APP的.so库适配方案参考

主流大厂APP通常仅适配单一架构以平衡体积与兼容性,具体方案如下:

APP名称适配的CPU架构核心考量
微信arm64-v8a优先保证性能,面向主流设备
支付宝armeabi最大化兼容性(覆盖绝大多数老旧设备)
QQarmeabi同支付宝,优先兼容老旧设备
手机淘宝armeabi-v7a平衡性能与兼容性(淘汰极老旧设备)

五、.so库适配的3种方案

实际开发中需根据产品定位(如是否放弃老旧设备、是否追求性能)选择适配方案,三种方案的优缺点对比如下:

方案一:只适配 armeabi

  • 优点:兼容性最强,可覆盖几乎所有非淘汰架构(除mips/mips64)
  • 缺点:性能最低,绝大多数设备(如arm64-v8a、armeabi-v7a)需通过辅助ABI或动态转码兼容,存在性能损耗
  • 适用场景:面向下沉市场,需覆盖大量老旧设备的应用(如工具类、低性能需求APP)

方案二:只适配 armeabi-v7a

  • 优点:平衡性能与兼容性,淘汰极老旧的armeabi设备,性能优于armeabi方案
  • 缺点:无法覆盖arm64-v8a设备的原生性能,仍需兼容运行
  • 适用场景:对性能有一定要求,但仍需覆盖部分老旧设备的应用(如电商、社交类APP)

方案三:只适配 arm64-v8a

  • 优点:性能最佳,原生支持64位设备,符合Google未来规划
  • 缺点:兼容性最差,仅支持arm64-v8a架构,需放弃所有32位设备(armeabi、armeabi-v7a)用户
  • 适用场景:新启动项目、对性能要求极高的应用(如音视频、游戏类APP);需符合Google Play强制要求(2019年8月起强制适配arm64-v8a)

六、.so库适配关键注意事项

  1. 禁止混合架构使用
    要么为所有架构提供对应的.so库,要么只适配单一架构。若同时存在多种架构(如armeabi和arm64-v8a),但某.so库仅存在于其中一个架构目录,会导致该架构设备加载.so库崩溃。

  2. 32位架构.so库通用性
    armeabi与armeabi-v7a同属32位架构,二者.so库可通用(如项目适配armeabi,但第三方库仅提供armeabi-v7a的.so库,可直接使用);但arm64-v8a(64位)与32位架构.so库完全不通用

  3. 老旧第三方库的处理
    部分无人维护的第三方库可能没有arm64-v8a架构的.so库,此时需二选一:①放弃arm64-v8a适配,选用32位架构方案;②替换为支持arm64-v8a的第三方库。

七、性能与兼容性兼得:ABI Split分包方案

Google提供ABI Split方案,可针对不同CPU架构单独打包APK,每个APK仅包含对应架构的.so库,既保证性能,又不增加APK体积。

实现方式(Gradle配置)

android {...splits {// 基于ABI配置多APKabi {// 启用ABI分包enable true// 重置默认ABI列表,仅保留需要适配的架构reset()// 指定需要适配的ABI(根据需求选择)include "armeabi", "armeabi-v7a", "arm64-v8a"// 禁止生成通用APK(仅生成对应架构的APK)universalApk false}}
}

局限性

  • Google Play支持:可上传多个架构的APK,用户下载时会自动匹配设备架构。
  • 国内应用商店不支持:国内多数应用商店仅允许上传一个APK包,因此该方案在国内场景下实用性有限。

八、总结与未来趋势

  1. 趋势判断:Google已强制要求Google Play应用适配arm64-v8a,32位架构(armeabi、armeabi-v7a)逐步被淘汰,新项目建议优先适配arm64-v8a
  2. 兼容性权衡:若需覆盖老旧设备,可选择armeabi-v7a方案;若完全面向主流设备,直接选择arm64-v8a方案。
  3. 体积控制:避免盲目添加多架构.so库,优先通过单一架构适配或ABI Split(海外场景)控制APK体积。

更多资料:https://github.com/0voice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96749.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 轻量级一站式日志可视化与JVM监控

一、项目初衷Java 应用开发的同学都知道,项目上线后,日志的可视化查询与 JVM 的可视化监控是一件非常重要的事。 市面上成熟方案一般是采用 ELK/EFK 实现日志可视化,采用 Actuator Prometheus Grafana 实现 JVM 监控。 这两套都是非常优秀的…

【Leetcode hot 100】101.对称二叉树

问题链接 101.对称二叉树 问题描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:…

Zynq开发实践(FPGA之选择开发板)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】我们之所以选用zynq开发板,就在于它支持arm软件开发,也支持fpga开发,甚至可以运行linux,这是之前没有…

Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架

在之前的 《注解模式下的 Riverpod 有什么特别之处》我们聊过 Riverpod 2.x 的设计和使用原理,同时当时我们就聊到作者已经在开始探索 3.0 的重构方式,而现在随着 Riverpod 3.0 的发布,riverpod 带来了许多细节性的变化。 当然,这…

Xcode 上传 ipa 全流程详解 App Store 上架流程、uni-app 生成 ipa 文件上传与审核指南

对于 iOS 开发者而言,应用开发完成后最重要的一步就是将应用打包为 ipa 文件,并上传至 App Store Connect 进行分发或上架。 其中,Xcode 上传 ipa 是最常见的方法,但很多开发者在实际操作中常常遇到卡住、上传失败或签名错误等问题…

快速选中对象

图片要求 图片背景单纯,对象边缘比较清晰 对象选择工具 选择对象选择工具后,画出大致区域,系统将自动分析图片内容,从而实现快速选择图片中的一个惑多个对象他有两种模式,分别是举行与套索模式。使用时可以先选中对象的…

点到点链路上的OSPF动态路由(2025年9月10日)

一、前言前面我们已经分享过了静态路由、缺省路由、浮动静态路由这些静态路由的配置。接下来将会 陆陆续续开始分享动态路由以及其他路由配置。博主这里是一个新人,了解这些路由配置不是自上而下的,而是自下而上的,也就是说通过实验去理解原理…

技术视界 | 末端执行器:机器人的“手”,如何赋予机器以生命?

在现代自动化系统中,末端执行器(End Effector)作为机器人与物理世界交互的“手”,发挥着至关重要的作用。它直接安装在机械臂末端,不仅是机器人实现“抓取、感知和操作”三大核心功能的关键部件,更是整个自…

滑动窗口概述

滑动窗口算法简介滑动窗口是一种用于处理数组或字符串子区间问题的高效算法。它通过维护一个动态窗口(通常由两个指针表示)来避免重复计算,将时间复杂度从O(n)优化到O(n)。基本实现步骤初始化窗口指针:通常使用left和right指针表示…

AI 创建学生管理系统

使用腾讯元宝创建,整体效果不错。修正2个bug跑起来,达到了需要的功能先上效果图:按钮分类别配色,界面清爽。喜欢这布局创建过程:prompt: 使用最新稳定vue版,使用pinia存储,基于typescript, 样式…

ASP.NET Core 中的简单授权

ASP.NET Core 中的授权通过 [Authorize] 属性及其各种参数控制。 在其最基本的形式中,通过向控制器、操作或 [Authorize] Page 应用 Razor 属性,可限制为仅允许经过身份验证的用户访问该组件。 使用 [Authorize] 属性 以下代码限制为仅允许经过身份验证…

leetcode 493 翻转对

一、题目描述 二、解题思路 本题的思路与逆序数的思路相似,采用归并排序的思路来实现。leetcode LCR 170.交易逆序对的总数-CSDN博客 注意:但是逆序数的ret更新在左、右区间合并时更新,但本题ret更新在左、右区间合并前更新。 三、代码实现…

初识微服务-nacos配置中心

配置中心 概述 配置中心是微服务中不可或缺的组件,因为如果没有配置中心,那么各个微服务的的配置信息无法得到统一和管理,会变得冗余。 :::color4 配置中心是用于管理应用程序配置信息的工具 集中管理配置:解决微服务架构下配置分…

Android webview更新记录-aosp

一、下载 webview下载地址,感谢火哥分享,版本很全。 https://www.firepx.com/app/android-system-webview/ 二、更新 external/chromium-webview/prebuilt 具体更新那个目录,需要查看编译架构 这个看你的lunch就行,这里我的是a…

无感FOC(无传感器磁场定向控制)

我们来详细解析无感FOC(无传感器磁场定向控制)中的高频方波注入(High-Frequency Square-Wave Injection, HFSWI)​​ 的原理。这是一个用于零低速或极低速范围内估算转子位置的核心技术。核心思想与要解决的问题在电机静止或转速极…

MATLAB基于博弈论组合赋权-云模型的煤与瓦斯突出危险性评价

MATLAB基于博弈论组合赋权-云模型的煤与瓦斯突出危险性评价 1. 问题背景与核心目标 背景:煤与瓦斯突出是煤矿生产中的一种极其复杂的动力灾害,其发生机理复杂,影响因素众多(如地应力、瓦斯压力、煤体物理属性等)。对其…

JavaWeb-Servlet总结及JSP

目录 一、文件下载 二、ServletConfig对象 三、Web.xml文件使用总结 四、server.xml文件 五、JSP动态网页技术 1.概念: 2.动态网页: 3.特点: 4.JSP的访问原理: 5.JSP的文档说明: 6.jsp实际运行文件&#xff…

DDIM和DDPM之 间的区别与联系

核心关系概述 首先,要理解DDIM并不是一个全新的模型,而是DDPM的一个精巧的重新参数化和扩展。它们使用完全相同的训练目标和方法,因此你可以用一个训练好的DDPM模型直接来运行DDIM的采样算法,而无需重新训练。 DDIM的核心贡献是&a…

c++---map和set

这里再提二叉树(二叉搜索树),是为了后面讲解map和set做准备。 一、二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树。 若它的左子树不为空,则左子树上所有节点的值都…

windows下,podman迁移镜像文件位置

docker-desktop有自带的镜像文件位置迁移功能,但podman-desktop还没有,所以只能自己操作wsl导入导出来实现# 1.一定要先停止当前machine podman machine stop# 2. 导出当前 machine(会生成 tar 镜像) wsl --export podman-machine…