【音視頻】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
英文地址,請注明出處:http://en.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…