Android音视频开发2:So库适配总结

news2025/1/4 11:58:04

名词解析
 

Android NDK 是在SDK前⾯⼜加上了原⽣⼆字,即Native Development Kit,因此⼜被Google称为
NDK。C/C++编写代码。so 为共享库,是shared object。

前⾔
 

⽇常开发我们经常会使⽤到第三库,涉及到底层的语⾳,视频等都需要添加so库。⽽so库的体积⼀般来说⾮常的⼤,不搞清楚随意添加会导致apk体积暴增。今天就简单分析⼀下,各个架构的cpu的区别,读者只要能⼤致了解这些⽬录的含义就可以了,不必深究。
 

32位处理器与64位处理器区别
 

64位和32位是指CPU的通⽤寄存器数据宽度。


操作系统设计初衷不同,64位操作系统的设计初衷是满⾜机械设计和分析、三维动画、视频编辑和创作,以及科学计算和⾼性能计算应⽤程序等领域中需要⼤量内存和浮点性能的客户需求,主要考虑的是运⾏⼀些⽐较特殊的⾏业性应⽤软件,⽽32位操作系统是为普通⽤户设计的,主要考虑的是运⾏⽇常的应⽤软件。


区别:

  • 处理器有所不同

所谓64位处理器的“位数”,这个位数指的是CPU的GPRs(General-Purpose Registers通⽤寄
存器)的数据宽度为64位,⼀次能够处理64bit的数据(32位是32bit),⽽寄存器是CPU中⽤来
种暂时存放数据和地址的,是CPU构成的⼀部分。

  • 软件有所区别

64位操作系统主要考虑是运⾏⼀些⽐较特殊的⾏业性应⽤软件,⽽这些软件都是采⽤64位计算,
所以这些软件只能运⾏在64位操作系统下。32位应⽤软件主要是⼀些⽇常软件,⽐如QQ、MSN
等,但32位应⽤软件也可以兼容运⾏在64位操作系统下,不过这也是出于过渡上的考虑。

  • 对内存的控制不同

32位操作系统实际可识别的内存为3.5GB,⽽64位操作系统实际可⽀持128GB内存,这也是64位
和32位在表⾯上以及实际价值上最主要的不同。

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

.so库⼜该如何存放?
 

处理.so⽂件时有⼀条简单却并不知名的重要法则。
你应该尽可能的提供专为每个ABI优化过的.so⽂件,但要么全部⽀持,要么都不⽀持:你不应该混合着使⽤。你应该为每个ABI⽬录提供对应的.so⽂件。

注:
ABI : application binary interface
ABI : 是规范.
EABI : Embedded application binary interface
EABI : 是 arm 对于 ABI规范的⽐较新(2005年)的实现 // powerpc也有⼀个实现叫做EABI
 

CPU架构
 

Android⽬前⽀持以下7种ABIs(Application Binary Interface的缩写,即应⽤⼆进制接⼝):mips,
mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a
 

如何选择?
 

我们来看⼀下⼤⼚App如何选择so库:
 

上⾯这些APP只适配了⼀种CPU架构,⽐如只适配了armeabi-v7a,那如果APP装在其他架构的⼿机上,如arm64-v8a上,会崩溃吗?

答案是不会的。
因为armeabi-v7a和arm64-v8a会向下兼容:
只适配armeabi的APP可以跑在armeabi, x86,x86_64,armewabi-v7a,arm64-v8上
只适配armeabi-v7a可以运⾏在armeabi-v7a和arm64-v8a
只适配arm64-v8a 可以运⾏在arm64-v8a上

适配⽅案
 

综合上⾯市场占有及⼤⼚适配⽅案来看,我们只需要适配arm架构即可,即 armeabi,armewabiv7a,arm64-v8 三选⼀。


注意事项
 

需要注意的是,虽然ABI加载So会向下兼容。但是如果你的App同时存在两种架构如:"armeabi", "arm64-v8a"。
那么不同Cpu架构的⼿机便只会加载对应的SO库不再向下兼容。⽐如a.so存在armeabi中,不存在arm64-v8a中。那么arm64-v8a⼿机加载a.so库时,便会崩溃。因此需要每个So库同时添加到每种架构中。
armeabi-v7a与armeabi都适⽤于32位CPU架构,因此理论上他们的So库时完全通⽤的,即如果你的项⽬只适配了armeabi架构,但是第三⽅框架只提供了armeabi-v7a的So库,也是可以直接⽤的。
但是arm64-v8a是64位的,所以⽆法通⽤。


⼀些没⼈维护的第三⽅库,年久失修,可能没有arm64-v8a架构的So库。
我们这个时候就要考虑是否适配arm64-v8a架构,或者使⽤其他库代替。
 

后记–性能+兼容能否兼得?
 

就能为每个CPU架构单独打⼀个APK,该apk中就只包含⼀个架构。这样,⼜能保证性能,⼜能不额外增加APK的⼤⼩,同时⼜⼜很完美的兼容,因为可以为所有架构都单独打⼀个包,⼀举多得。
Google Play ⽀持上传多个不同平台的APK,这样,就能根据不同的CPU架构,下载不同的包。
但是,很遗憾,国内的应⽤商店⽬前还不⽀持
 

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

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

相关文章

【虚拟机】VMware虚拟机安装Windows 10系统 详细教程

大家好,我是雷工! 由于购买的电脑自带系统为windows11家庭版,而有些软件无法在家庭版中安装,所以考虑用虚拟机再装个Windows10专业版系统。 前一段时间在Windows11 家庭版上安装的KingSCADA软件运行时总反应很慢,准备…

【MLC】 TensorIR 练习

文章目录 前言TensorIR 练习TensorIR: 张量程序抽象案例研究练习 1:广播加法练习 2:二维卷积练习 3:变换批量矩阵乘法程序 总结 前言 这两天重新看了一下天奇的mlc课程文档,把里边儿的TensorIR 练习写了一下,顺便推广…

ubuntu循环登录,无法进入桌面

现象 在用户登录界面输入用户名和密码后无法正常登录,并且一直循环提示输入登录信息。 问题定位 1. 键入:ctrlaltF1, 进入命令行登录界面 2. 输入当前的用户名和密码(也可以是root,操作需谨慎) 3.…

【SonarQube】下载、安装、配置、使用介绍

文章目录 SonarQube安装运行使用root启动问题处理修改文件数限制JDK版本问题创建Project创建token扫描代码数据持久化在线文档 SonarQube安装 官网下载地址: http://www.sonarqube.org/downloads/9.9.1.69595下载地址: https://binaries.sonarsource.com/Distribution/sonarqu…

chatgpt赋能python:Python下载之后怎么用:详细教程

Python下载之后怎么用:详细教程 Python作为一种著名的编程语言,已经成为众多程序员和开发者的首选。因此,如果您也想开始使用 Python 来进行编程,那么下一步应该是下载和安装Python。但是,下载完 Python 之后&#xf…

范式迁移 | Squids DBMotion支持Oracle迁移到GaussDB

Squids DBMotion 2304发版成功,再添重量级数据同步功能——支持Oracle迁移到GaussDB。 GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力,同时支持分布式事务,同城跨AZ部署,数据0丢失&…

企业使用WordPress网站的6个理由

WordPress 为超过三分之一的网络和超过 38%的顶级 10K 网站提供支持。它最初是一个博客平台,现在是世界上使用最广泛的内容管理系统,对于希望在未来几年扩大规模的网站所有者来说,是一个明智的选择。 除了使用开源软件的好处之外&#xff0c…

从古板到智能:机器程序的华丽转身

因为 ChatGPT 的热潮,目前在恶补人工智能方面的知识。在某一篇文章的评论中,我看到了一个问题:“为什么 ChatGPT 能这么厉害,基本什么问题都能回答,如何做到的” 这也是我想问的问题,在初学编程的时候&…

Packet Tracer - 配置区域策略防火墙

Packet Tracer - 配置区域策略防火墙 拓扑 地址表 设备 接口 IP地址 子网掩码 默认网关 交换机端口 R1 F0/1 192.168.1.1 255.255.255.0 N/A S1 F0/2 S0/3/0 (DCE) 10.1.1.1 255.255.255.252 N/A N/A R2 S0/3/0 10.1.1.2 255.255.255.252 N/A N/A S0/3…

Unity 反射探针

反射射探针 是用来模拟反射周边物体的光照信息的一种解决方案让物体,受周围物体的光照或材质进行影响的一种模拟光照效果。如下图效果: 反射探针属性截图 反射探针类型 Baked 烘焙模式,此种模式需要反射的物体是静态的不能移动,但…

如何高效提问,准确搜索,开发小白不会百度?

How-To-Ask-Question ?其实我也是小白,这个问题没有太多发言权。目前来说,我暂时也没有找到一个通法,但整体上来说也不是无迹可寻(是有一定技巧和经验在里面的)。我之前也经常遇到了一些这方面问题&#x…

1.5. 流程控制(分支与循环)

流程控制是编程中的基本概念,用于控制程序的执行顺序。在 Java 中,流程控制主要分为两类:分支结构(Branching)和循环结构(Looping)。 1.5.1. 分支结构 分支结构是根据条件判断来选择执行不同的…

【*1900 DP+Tree】CF9D

Problem - 9D - Codeforces 题意: 思路: 计数问题,考虑计数DP 因为它是二叉树,比较特殊,所以可以考虑一下线性DP 按照题目最后要算的答案,状态可以这样设计: 设dp[i][j]表示树高为i&#x…

Linux设备驱动程序(二)——建立和运行模块

文章目录 前言一、设置测试系统二、Hello World 模块1、代码详解2、执行效果 三、内核模块相比于应用程序1、用户空间和内核空间2、内核的并发3、当前进程4、几个别的细节 四、编译和加载1、编译模块2、加载和卸载模块3、版本依赖 五、内核符号表六、预备知识七、初始化和关停1…

旗鱼优化(SFO)算法(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

Thread.sleep( )线程休眠的优化写法

TimeUnit.SECONDS.sleep(10)和Thread.sleep(10 * 1000)都可以用于线程休眠 代码如下: import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.TimeUnit; /*** program: moon-cloud-car* author: 阿水* create…

MT6765 处理器参数 MTK6765芯片性能配置|详细参数

MT6765处理器,也被称为Helio P35,是联发科(MediaTek)推出的高性能智能芯片。作为目前市场上受欢迎的低成本智能芯片之一,MT6765以其卓越的性能和创新技术为用户提供了更加顺畅和高效的使用体验。 MT6765作为一款八核芯片,MT6765的…

最佳实践:基于vite3的monorepo前端工程搭建 | 京东云技术团队

一、技术栈选择 1.代码库管理方式-Monorepo: 将多个项目存放在同一个代码库中 ▪选择理由1:多个应用(可以按业务线产品粒度划分)在同一个repo管理,便于统一管理代码规范、共享工作流 ▪选择理由2:解决跨项…

Homeassistant --openwrt docker 安装

openwrt homeassistant安装教程 前提:在N1盒子上面烧录 f大的openwrt系统 (安装81o 或者82o都可以) 一.进入openwrt系统 通常为192.168.1.1 打开网络配置 点击网络点击接口然后修改 这样网络是属于旁路由上网了 可以联通网络了 主要需要填写正确 二.点击docker …

南大通用数据库-Gbase-8a-报错集锦-02-metadata is incomplete on localhost

一、版本信息 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase8a版本8.6.2-R43 二、问题原因 由于gbase.table_distribution存储了所有引擎为express的表元数据信息,如果此表出现数据损坏&a…