Android ABI

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

獲取當前ABI

var supportsABIs:Array<String>? = null
if(Build.VERSION.SDK_INT >= 21) {supportsABIs = Build.SUPPORTED_ABIS
}
var currentABI = Build.CPU_ABI

? ? 通過Build可以獲取當前手機支持的abi集以及cpu的abi

前言 ? ?

????早期的Android系統幾乎只支持ARMv5的CPU架構,你知道現在它支持多少種嗎?7種!

????Android系統目前支持以下七種不同的CPU架構:ARMv5,ARMv7 (從2010年起),x86 (從2011年起),MIPS (從2012年起),ARMv8,MIPS64和x86_64 (從2014年起),每一種都關聯著一個相應的ABI。

????應用程序二進制接口(Application Binary Interface)定義了二進制文件(尤其是.so文件)如何運行在相應的系統平臺上,從使用的指令集,內存對齊到可用的系統函數庫。在Android系統上,每一個CPU架構對應一個ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。

? ? 可以參考這篇官方文檔https://developer.android.com/ndk/guides/abis.html

? ? 其中armeabi mips 和mips64已經被廢棄,并且在ndk r17中將會被移除。

為什么你需要重點關注.so文件

????如果項目中使用到了NDK,它將會生成.so文件,因此顯然你已經在關注它了。如果只是使用Java語言進行編碼,你可能在想不需要關注.so文件了吧,因為Java是跨平臺的。但事實上,即使你在項目中只是使用Java語言,很多情況下,你可能并沒有意識到項目中依賴的函數庫或者引擎庫里面已經嵌入了.so文件,并依賴于不同的ABI。

????例如,項目中使用RenderScript支持庫,OpenCV,Unity,android-gif-drawable,SQLCipher等,你都已經在生成的APK文件中包含.so文件了,而你需要關注.so文件。

????Android應用支持的ABI取決于APK中位于lib/ABI目錄中的.so文件,其中ABI可能是上面說過的七種ABI中的一種。

????很多設備都支持多于一種的ABI。例如ARM64和x86設備也可以同時運行armeabi-v7a和armeabi的二進制包。但最好是針對特定平臺提供相應平臺的二進制包,這種情況下運行時就少了一個模擬層(例如x86設備上模擬arm的虛擬層),從而得到更好的性能(歸功于最近的架構更新,例如硬件fpu,更多的寄存器,更好的向量化等)。

????我們可以通過Build.SUPPORTED_ABIS得到根據偏好排序的設備支持的ABI列表。但你不應該從你的應用程序中讀取它,因為Android包管理器安裝APK時,會自動選擇APK包中為對應系統ABI預編譯好的.so文件,如果在對應的lib/ABI目錄中存在.so文件的話。

App中可能出錯的地方

????處理.so文件時有一條簡單卻并不知名的重要法則。

????你應該盡可能的提供專為每個ABI優化過的.so文件,但要么全部支持,要么都不支持:你不應該混合著使用。你應該為每個ABI目錄提供對應的.so文件。

????當一個應用安裝在設備上,只有該設備支持的CPU架構對應的.so文件會被安裝。在x86設備上,libs/x86目錄中如果存在.so文件的話,會被安裝,如果不存在,則會選擇armeabi-v7a中的.so文件,如果也不存在,則選擇armeabi目錄中的.so文件(因為x86設備也支持armeabi-v7a和armeabi)。

其他地方也可能出錯

????當你引入一個.so文件時,不止影響到CPU架構。我從其他開發者那里可以看到一系列常見的錯誤,其中最多的是"UnsatisfiedLinkError","dlopen: failed"以及其他類型的crash或者低下的性能:

使用android-21平臺版本編譯的.so文件運行在android-15的設備上

????使用NDK時,你可能會傾向于使用最新的編譯平臺,但事實上這是錯誤的,因為NDK平臺不是后向兼容的,而是前向兼容的。推薦使用app的minSdkVersion對應的編譯平臺。

????這也意味著當你引入一個預編譯好的.so文件時,你需要檢查它被編譯所用的平臺版本。

混合使用不同C++運行時編譯的.so文件

????.so文件可以依賴于不同的C++運行時,靜態編譯或者動態加載。混合使用不同版本的C++運行時可能導致很多奇怪的crash,是應該避免的。作為一個經驗法則,當只有一個.so文件時,靜態編譯C++運行時是沒問題的,否則當存在多個.so文件時,應該讓所有的.so文件都動態鏈接相同的C++運行時。

????這意味著當引入一個新的預編譯.so文件,而且項目中還存在其他的.so文件時,我們需要首先確認新引入的.so文件使用的C++運行時是否和已經存在的.so文件一致。

沒有為每個支持的CPU架構提供對應的.so文件

????這一點在前文已經說到了,但你應該真的特別注意它,因為它可能發生在根本沒有意識到的情況下。

????例如:你的app支持armeabi-v7a和x86架構,然后使用Android Studio新增了一個函數庫依賴,這個函數庫包含.so文件并支持更多的CPU架構,例如新增android-gif-drawable函數庫:

compile ‘pl.droidsonroids.gif:android-gif-drawable:1.1.+’

????發布我們的app后,會發現它在某些設備上會發生Crash,例如Galaxy S6,最終可以發現只有64位目錄下的.so文件被安裝進手機。

????解決方案:重新編譯我們的.so文件使其支持缺失的ABIs,或者設置

ndk.abiFilters

????顯示指定支持的ABIs。

????最后一點:如果你是一個SDK提供者,但提供的函數庫不支持所有的ABIs,那你將會搞砸你的用戶,因為他們能支持的ABIs必將只能少于你提供的。

將.so文件放在錯誤的地方

????我們往往很容易對.so文件應該放在或者生成到哪里感到困惑,下面是一個總結:

  • Android Studio工程放在jniLibs/ABI目錄中(當然也可以通過在build.gradle文件中的設置jniLibs.srcDir屬性自己指定)
  • Eclipse工程放在libs/ABI目錄中(這也是ndk-build命令默認生成.so文件的目錄)
  • AAR壓縮包中位于jni/ABI目錄中(.so文件會自動包含到引用AAR壓縮包的APK中)
  • 最終APK文件中的lib/ABI目錄中
  • 通過PackageManager安裝后,在小于Android 5.0的系統中,.so文件位于app的nativeLibraryPath目錄中;在大于等于Android 5.0的系統中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目錄中。

只提供armeabi架構的.so文件而忽略其他ABIs的

????所有的x86/x86_64/armeabi-v7a/arm64-v8a設備都支持armeabi架構的.so文件,因此似乎移除其他ABIs的.so文件是一個減少APK大小的好技巧。但事實上并不是:這不只影響到函數庫的性能和兼容性。

????x86設備能夠很好的運行ARM類型函數庫,但并不保證100%不發生crash,特別是對舊設備。64位設備(arm64-v8a, x86_64, mips64)能夠運行32位的函數庫,但是以32位模式運行,在64位平臺上運行32位版本的ART和Android組件,將丟失專為64位優化過的性能(ART,webview,media等等)。

?

轉載于:https://my.oschina.net/zzxzzg/blog/1621777

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278433.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx限流健康檢查

Nginx原生限流模塊:ngx_http_limit_conn_module模塊根據前端請求域名或ip生成一個key&#xff0c;對于每個key對應的網絡連接數進行限制。配置如下:http模塊server模塊#http模塊內 http {include mime.types;default_type application/octet-stream;log_format main [$t…

如何在Ubuntu上創建桌面快捷方式

Desktop icons should be simple, but they’re not on Ubuntu 18.04 LTS and newer releases like Ubuntu 19.10. Follow these easy steps to get desktop shortcuts for your favorite applications, just like on other operating systems and other Linux desktops. 桌面圖…

阿里再破記錄!代表中國企業首次在這項國際比賽中摘得銀牌!

2月9日在洛杉磯舉行的第11屆網絡搜索與數據挖掘國際會議&#xff08;WSDM 2018&#xff09;上&#xff0c;公布了今年的WSDM Cup競賽成績&#xff0c;來自阿里巴巴的AliOS團隊憑借優秀的算法能力&#xff0c;摘得榜眼。這是該賽事舉辦11屆以來&#xff0c;中國企業在該賽事上首…

關于IE 對 $.get 緩存的記錄

最近在IE9中碰到一個問題是&#xff0c; 當我對某個角色進行修改的時候&#xff0c;再點擊查詢還是修改之前的內容&#xff0c;但是實際數據庫已經修改成功&#xff0c;糾結了好一會兒之后&#xff0c;才發現是 $.get請求的問題。 因為 IE對get請求&#xff0c;如果請求url 相…

閃存驅動器_將閃存驅動器變成便攜式Web服務器

閃存驅動器Portable applications are very useful for getting work done on the go, but how about portable servers? Here’s how you can turn your flash drive into a portable web server. 便攜式應用程序對于在旅途中完成工作非常有用&#xff0c;但是便攜式服務器呢…

Android中文API-ViewStub

ViewStub控件是一個不可見&#xff0c;0尺寸得惰性控件。當ViewStub控件設置可見&#xff0c;或者調用inflate()&#xff0c;并運行完畢之后&#xff0c;ViewStub所指定的layout資源就會被載入。這個ViewStub就會被新載入的layout文件取代。ViewStub也會從其父控件中移除。因此…

如何播放梅西百貨的感恩節大游行2019

Macy’s梅西百貨As we draw ever closer to the Thanksgiving holiday, multiple things come to mind: turkey, Black Friday, and the Macy’s Thanksgiving Day Parade. With that in mind, you might want to find a way to stream it for your family. 隨著我們越來越接近…

thinkpaidE480office安裝文件夾

C:\Program Files (x86)\Microsoft Office\root\Office16需要嵌入office的小伙伴自行百度吧教程吧&#xff0c;網上有很多的轉載于:https://www.cnblogs.com/hgyzm/p/10303449.html

AJAX入門這一篇就夠了

什么是Ajax Ajax(Asynchronous JavaScript and XML) 異步JavaScript和XML Ajax實際上是下面這幾種技術的融合&#xff1a; (1)XHTML和CSS的基于標準的表示技術(2)DOM進行動態顯示和交互(3)XML和XSLT進行數據交換和處理(4)XMLHttpRequest進行異步數據檢索(5)Javascript將以上技術…

如何在iPhone和iPad上允許“不受信任的快捷方式”

Khamosh PathakKhamosh PathakShortcuts is now a stock app in iOS 13, iPadOS 13, and beyond. Thanks to Apple’s stricter rules, any shortcut you download from the internet is blocked. Here’s how you can allow untrusted shortcuts on your iPhone or iPad. 現在…

程序員技術進階手冊(一)

AI正在迅速改變世界&#xff0c;對于程序員來說&#xff0c;這絕對是一個千載難逢的轉型機會。機器學習是計算機科學的一個子領域&#xff0c;在人工智能領域&#xff0c;機器學習逐漸發展成模式識別和計算科學理論的研究。從2016年起&#xff0c;機器學習到達了不合理的火熱巔…

SpringBoot入門 (一) HelloWorld

一 什么是springboot springboot是一個全新的框架&#xff0c;它設計的目的簡化spring項目的初始環境的搭建和開發&#xff0c;主要有以下幾個特點&#xff1a; 1、簡化初始配置 &#xff0c;可與主流框架集成&#xff1b; 2、內置Servlet容器&#xff0c;無需在打War包&#x…

gmail附件調用_如何將Gmail附件保存到Google云端硬盤

gmail附件調用While you can access Gmail attachments by opening the related message deep within Google’s client, it’s not very convenient. You need a central location to access saved documents and images. This guide shows you how to save Gmail attachments…

spring boot攔截器中獲取request post請求中的參數(轉)

文章轉自 https://www.jianshu.com/p/69c6fba08c92 轉載于:https://www.cnblogs.com/shuaiandjun/p/10306242.html

絕地求生大逃殺,改配置

提取效果設置配置文件 通過Procmon工具分析&#xff0c;絕地求生大逃殺效果設置的配置文件為 “C:\Users\Administrator\AppData\Local\TslGame\Saved\Config\WindowsNoEditor\GameUserSettings.ini”&#xff0c;設置好網吧需要的游戲效果后將“TslGame”文件夾提取出來即可&a…

如何使用VLOOKUP在Google表格中查找數據

VLOOKUP is one of the most misunderstood functions in Google Sheets. It allows you to search through and link together two sets of data in your spreadsheet with a single search value. Here’s how to use it. VLOOKUP是Google表格中最容易被誤解的功能之一。 它使…

共享內存

https://blog.csdn.net/tojohnonly/article/details/70246965 轉載于:https://www.cnblogs.com/132818Creator/p/10307072.html

WPF項目學習.一

WPF項目搭建 版權聲明&#xff1a;本文為博主初學經驗&#xff0c;未經博主允許不得轉載。 一、前言 記錄在學習與制作WPF過程中遇到的解決方案。 使用MVVM的優點是 數據和視圖分離&#xff0c;雙向綁定&#xff0c;低耦合&#xff0c;可重用行&#xff0c;相對獨立的設計和邏輯…

airpods_如何通過AirPods與其他人共享音樂

airpodsKhamosh PathakKhamosh PathakUsing the new Audio Sharing feature introduced in iOS 13.1 and iPadOS 13.1, you can share audio from one iPhone with two AirPods. You can watch a video or listen to a song along with your friend in just a tap! 使用iOS 13.…

Laravel 5 多個視圖共享數據的方法

我們都知道模板一般會用到繼承&#xff0c;導航欄就是一個很好的例子&#xff0c;但是導航欄的數據如何共享&#xff0c;比如有個導航的文件叫在view/navigation.blade.php為了簡單一點&#xff0c;文件里只有設置了一個變量1{{ $cqh }}現在的要求是每個頁面都會用到這個變量&a…