精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在安卓項目里部署so文件你需要知道的知識

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

在安卓項目里部署so文件你需要知道的知識

1. 什么是CPU架構及ABI

Android系統目前支持以下七種不同的CPU架構:ARMv***RMv7 (從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。

2. 為什么需要重點關注.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中的一種。

Native Libs Monitor這個應用可以幫助我們理解手機上安裝的APK用到了哪些.so文件,以及.so文件來源于哪些函數庫或者框架。當然,我們也可以自己對APP反編譯來獲取這些信息,不過相對麻煩一些。

很多設備都支持多于一種的ABI,例如ARM64和x86設備也可以同時運行armeabi-v7a和armeabi的二進制包。但***是針對特定平臺提供相應平臺的二進制包,這種情況下運行時就少了一個模擬層(例如x86設備上模擬arm的虛擬層),從而得到更好的性能(歸功于最近的架構更新,例如硬件fpu,更多的寄存器,更好的向量化等)。我們可以通過Build.SUPPORTED_ABIS得到根據偏好排序的設備支持的ABI列表。但你不應該從你的應用程序中讀取它,因為Android包管理器安裝APK時,會自動選擇APK包中為對應系統ABI預編譯好的.so文件,如果在對應的lib/ABI目錄中存在.so文件的話。

3. .so文件應該放在什么地方

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

  • Android Studio工程放在main/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目錄中。

4. 安裝Apk時PackageManagerService選擇解壓so文件的策略

在Android系統中,當我們安裝Apk文件的時候,lib目錄下的so文件會被解壓App的原生庫目錄,一般來說是放到/data/data/package-name/lib目錄下,而根據系統和CPU架構的不同,其拷貝策略也是不一樣的,不正確地配置so文件,比如某些App使用第三方的so時,只配置了其中某一種CPU架構的so,可能會造成App在某些機型上的適配問題。

Android版本

so拷貝策略

策略問題

 

在安卓項目里部署so文件你需要知道的知識在安卓項目里部署so文件你需要知道的知識

5. 配置so的建議

針對Android 系統的這些拷貝策略的問題,我們給出了一些配置so的建議:

5.1 針對armeabi和armeabi-v7a兩種ABI

  • 方法1:由于armeabi-v7a指令集兼容armeabi指令集,所以如果損失一些應用的性能是可以接受的,同時不希望保留庫的兩份拷貝,可以移除armeabi-v7a目錄和其下的庫文件,只保留armeabi目錄;比如Apk使用第三方的so只有armeabi這一種ABI時,可以考慮去掉Apk中lib目錄下armeabi-v7a目錄。
  • 方法2:在armeabi和armeabi-v7a目錄下各放入一份so。

5.2 針對x86

目前市面上的x86機型,為了兼容arm指令,基本都內置libhoudini模塊,即二進制轉碼支持,該模塊負責把ARM指令轉換為x86指令,所以如果是出于Apk包大小的考慮,并且可以接受一些性能損失,可以選擇刪掉x86庫目錄,x86下配置的armeabi目錄的so庫一樣可以正常加載使用。

5.3 針對64位ABI

如果App開發者打算支持64位,那么64位的so要放全,否則可以選擇不單獨編譯64位的so,全部使用32位的so,64位機型默認支持32位so的加載。比如Apk使用第三方的so只有32位ABI的so,可以考慮去掉Apk中lib目錄下的64位ABI子目錄,保證Apk安裝后正常使用。

5. Android Studio配置abiFilters

 

  1. android {  
  2. defaultConfig {  
  3. ndk {  
  4. abiFilters 'armeabi-v7a' //, 'armeabi''arm64-v8a''x86''x86_64''mips''mips64'  
  5.  
  6.  

這句話的意思就是指定NDK需要兼容的架構,把除了armeabi-v7a以外的兼容包都過濾掉,只剩下一個armeabi-v7a的文件夾。

即使我們沒有指定其他的兼容框架,也需要一個過濾。當我們接入多個第三方庫時,很可能第三方庫做了多個平臺的兼容。譬如fresco就做了各個平臺的兼容,所以它創建了各個兼容平臺的目錄。因為只要出現了這個目錄,系統就只會在這個目錄里找.so文件而不會遍歷其他的目錄,所以就出現了找不到.so文件的情況。

6. java.lang.UnsatisfiedLinkError

該錯誤類型較多,以下進行分類:

 

  1. java.lang.UnsatisfiedLinkError : dlopen failed: library //dlopen打開失敗  
  2. java.lang.UnsatisfiedLinkError :findLibrary returned null //找不到library  
  3. java.lang.UnsatisfiedLinkError : Native method not found //找不到對應函數 
  4.  java.lang.UnsatisfiedLinkError :Cannot load library: load_library //無法load library 

出現原因:

顯然出現上述崩潰的根本原因是:

  • (1)so無法加載,可能是so不存在等原因
  • (2)so正常加載,但是沒有找到相應的函數

針對第二個原因,顯然相對來說很容易排查,而且在開發中,這樣的函數調用必然會在編譯時和debug模式下進行測試,所以這種原因產生的概率很小。

那么下面主要總結幾類“so無法加載”而導致上述崩潰的幾種原因:

6.1 生成的so本身缺陷

一個簡單的例子:

crash堆棧:

 

  1. java.lang.UnsatisfiedLinkError: Cannot load library: find_library(linker.cpp:889): "/data/data/com.netease.nis.apptestunit/app_lib/libdemo.so" failed to load previously 
  2. at java.lang.Runtime.load(Runtime.java:340)  
  3. at java.lang.System.load(System.java:521)  
  4. at com.netease.nis.bugrpt.ReLinker.loadLibrary(ReLinker.java:76)  
  5. at com.example.crash.MainActivity.onCreate(MainActivity.java:272)  
  6. at android.app.Activity.performCreate(Activity.java:5220)  
  7. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1086)  
  8. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2193)  
  9. at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2279)  
  10. at android.app.ActivityThread.access$600(ActivityThread.java:142)  
  11. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)  
  12. at android.os.Handler.dispatchMessage(Handler.java:99)  
  13. at android.os.Looper.loop(Looper.java:137)  
  14. at android.app.ActivityThread.main(ActivityThread.java:5105)  
  15. at java.lang.reflect.Method.invokeNative(Native Method)  
  16. at java.lang.reflect.Method.invoke(Method.java:511)  
  17. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  
  18. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)  
  19. at dalvik.system.NativeStart.main(Native Method) 

解決方法:

查看原項目Application.mk,發現APP_STL := gnustl_shared。原方案使用的是共享庫,這不一定都支持所有的機型,改用靜態庫gnustl_static問題解決。

對應的在Android Studio中需要將共享庫改用靜態庫gnustl_static。這一類關于so編譯共享庫問題,需要進行檢查。

 

  1. APP_STL 可用值  
  2. system 系統默認  
  3. stlport_static - 使用STLport作為靜態庫  
  4. stlport_shared - 使用STLport 作為共享庫  
  5. gnustl_static - 使用GNU libstdc++ 作為靜態庫  
  6. gnustl_shared - 使用GNU libstdc++ 作為共享庫 

上述例子只是一個簡單的例子,可能在so編譯生成時,由于沒有考慮共享庫的機型匹配等原因導致UnsatisfiedLinkError崩潰,其次是64位32位系統架構問題,也可能導致UnsatisfiedLinkError崩潰。

6.2 手機設備沒有空間

在so正確生成情況下,會根據設置的支持so庫框架生成對應的庫。在Android系統中,當我們安裝Apk文件的時候,lib目錄下的so文件會被解壓到App的原生庫目錄,一般來說是放到/data/data/package-name/lib目錄下,當準備加載native層的so時,雖然在Apk中有對應的so文件,但是由于手機設備沒有足夠的空間加載該so,導致加載失敗,產生上述崩潰。

6.3 so配置錯誤

倘若so正確生成,且手機空間充足,那么如上所述,在Android系統中,當我們安裝Apk文件的時候,lib目錄下的so文件會被解壓到App的原生庫目錄,一般來說是放到/data/data/package-name/lib目錄下。但是根據系統和CPU架構的不同,其拷貝策略也是不一樣的。倘若不正確地配置了so文件,比如某些App使用第三方的so時,只配置了其中某一種CPU架構的so,可能會造成App在某些機型上的適配問題,產生上述崩潰。

6.4 Android的PackageManager安裝問題

用戶安裝了與手機CPU架構不符的Apk安裝包,或者App升級過程中因各種原因未正確釋放so文件。這種問題可以使用ReLinker解決。

使用ReLinker十分簡單,使用

  1. ReLinker.loadLibrary(context, “mylibrary”) 

代替標準的即可。

  1. System.loadLibrary(“mylibrary”); 
責任編輯:未麗燕 來源: 程序師
相關推薦

2022-02-09 16:25:34

區塊鏈技術加密貨幣

2022-04-29 09:00:00

Platform架構內核線程

2022-08-10 09:03:35

TypeScript前端

2011-09-20 10:56:35

云計算PaaS

2018-09-10 09:26:33

2021-07-26 10:48:47

Kafka

2011-12-13 10:16:34

2023-09-08 13:46:12

ArrayList數據存儲容器

2018-05-30 15:15:47

混合云公共云私有云

2024-06-04 16:51:11

2019-10-23 10:36:46

DevSecOpsDevOps

2024-01-24 11:59:44

Django自定義字段Python

2020-03-27 12:30:39

python開發代碼

2014-07-31 17:13:50

編碼程序員

2023-01-30 11:43:04

開源代碼

2018-02-08 08:08:12

2020-09-08 08:27:25

JavaScript模塊ECMAScript

2014-09-01 14:31:11

2012-07-27 09:25:40

2013-03-04 09:34:48

CSSWeb
點贊
收藏

51CTO技術棧公眾號

日韩影片中文字幕| 九九热只有精品| 国产黄a三级三级三级av在线看| 极品av少妇一区二区| 欧美日韩精品一区视频| 国产在线精品一区二区三区| 老熟妻内射精品一区| 日韩欧美看国产| 久久综合一区二区| 亚洲人成在线观看一区二区| 欧洲视频一区二区| 国产区日韩欧美| 欧美丰满艳妇bbwbbw| 少妇高潮一区二区三区99| 国产精品12区| 久久影院中文字幕| 国产性xxxx18免费观看视频| 亚洲av无码乱码国产精品| 四虎成人精品永久免费av九九| 欧美色视频日本版| 久久狠狠久久综合桃花| 国产污片在线观看| 豆花视频一区二区| 亚洲国产精品一区二区久久| 99久久自偷自偷国产精品不卡| 欧美中文在线视频| 精品视频无码一区二区三区| 日韩一区中文字幕| 在线观看精品国产视频| 国产成人a亚洲精v品无码| 国产 欧美 自拍| 亚洲伦理精品| 日韩av中文在线| 日本一道本久久| www.国产.com| 日韩大片在线播放| 欧美熟乱第一页| 一区二区不卡在线观看| 精品成人无码久久久久久| 久久99国产精品视频| 精品欧美aⅴ在线网站| 国产一区二区在线网站| 欧美亚洲精品天堂| 国产不卡av一区二区| 狠狠爱在线视频一区| 久久久国产精品一区二区三区| 亚洲精品1区2区3区| 琪琪久久久久日韩精品| 在线一区二区视频| 中文字幕一区二区三区四区五区 | 欧美女同在线观看| 69视频在线| 韩国av一区二区| 欧美大成色www永久网站婷| 日本55丰满熟妇厨房伦| av男人的天堂在线观看| 久久久亚洲精品石原莉奈| 国产精品三级网站| 青娱乐免费在线视频| 欧美调教视频| 欧美日韩成人高清| 亚洲精品蜜桃久久久久久| 青青九九免费视频在线| 麻豆一区二区三| 久久久久久一区二区三区| 亚洲成人日韩在线| 午夜影院在线播放| 国产欧美精品区一区二区三区| 成人黄色免费网站在线观看| 久久久国产成人| 视频精品在线观看| 欧美一区二区三级| 日韩在线视频在线观看| 搞黄视频免费在线观看| 国产成人综合视频| 国产精品福利在线观看| 国产性生活网站| 欧美一区二区三区高清视频| 精品国产乱码久久久久久1区2区| 欧美日韩大尺度| 17videosex性欧美| 亚洲天堂a在线| 欧美自拍资源在线| 丰满人妻一区二区三区无码av| 午夜一区二区三区不卡视频| 超薄丝袜一区二区| 蜜桃av乱码一区二区三区| 91亚洲精品视频在线观看| 欧美亚洲一区三区| 黄色网页免费在线观看| 国产写真视频在线观看| 久久午夜免费电影| 国产成人免费观看| 国产精品探花视频| 日本午夜精品一区二区三区电影| 久久久久久亚洲精品中文字幕| 久久国产高清视频| 成人国产精品一级毛片视频| 亚洲美女视频网| 四虎成人免费视频| 精品国产亚洲日本| 欧美日韩国产欧美日美国产精品| 37pao成人国产永久免费视频| 久久av色综合| 自拍偷拍国产亚洲| 亚洲视频在线二区| 成年人在线视频免费观看| 久久综合九色综合久久久精品综合| 成人18视频| www.久久精品.com| 国产乱人伦精品一区二区在线观看| 国产精品美女久久久久av超清| av大片在线免费观看| 在线播放精品| 欧美精品久久一区二区| 黄色一级片中国| 亚洲欧洲中文字幕| 久久九九有精品国产23| 久久精品亚洲a| 国产精品成久久久久| 中文字幕日韩欧美在线| 懂色av粉嫩av浪潮av| 日韩久久综合| 久久久精品久久久| 欧美成人免费观看视频| 欧美久久九九| 国模精品系列视频| 国产成人自拍视频在线| 中文精品在线| 国产成人精品电影| 亚洲性生活大片| 国内精品免费**视频| 亚洲一区二区三区视频| www.久久色| 99免费精品在线| 欧美日韩一区二区三区免费| 国产精品99999| 国产精品久久午夜| 成人手机在线播放| 99thz桃花论族在线播放| 狠狠久久五月精品中文字幕| 激情综合网俺也去| 成人激情久久| 亚洲国产精品999| 六月婷婷七月丁香| 色综合五月天| 欧美精品激情视频| 无码人妻精品一区二区蜜桃色欲| 免费一级欧美片在线观看| 成人黄色中文字幕| 亚洲国产剧情在线观看| 久久婷婷一区二区三区| 一区二区视频在线播放| 密臀av在线| 色狠狠av一区二区三区| 三级一区二区三区| 六月丁香久久丫| 最新亚洲国产精品| 国产在线视频二区| 免费人成精品欧美精品 | 亚洲精品a区| 日韩精品在线第一页| 美女福利视频网| 亚洲国产综合在线看不卡| 国产精品wwwwww| 成人精品在线播放| 国产喂奶挤奶一区二区三区| 亚洲五码在线观看视频| 高清电影一区| 精品国产免费一区二区三区香蕉| 摸摸摸bbb毛毛毛片| 国产精品红桃| 国产精品最新在线观看| 国产自产一区二区| 中文字幕人成不卡一区| 国产精品一区二区免费在线观看| 日韩成人在线一区| 日韩电影网在线| 91porn在线视频| 蜜臀国产一区二区三区在线播放| 国产精品制服诱惑| 欧美激情办公室videoshd| 日韩欧美aaa| 99久久久无码国产精品性波多| 成人激情开心网| 国产91精品久| 韩国av电影在线观看| 中文字幕在线一区| 欧美少妇性生活视频| 成人在线tv视频| 欧美日本精品在线| 亚洲天堂手机在线| 久久免费偷拍视频| 人人妻人人添人人爽欧美一区| 国内精品视频| 久久亚洲影音av资源网| 久草热在线观看| 久久久久久久久97黄色工厂| 欧美在线一区视频| 国产精品极品在线观看| 久久99久国产精品黄毛片入口| 一级片在线观看视频| 国产女同互慰高潮91漫画| www.中文字幕在线| 女仆av观看一区| 性欧美视频videos6一9| www夜片内射视频日韩精品成人| 国产精品乱码人人做人人爱| 免费看污黄网站| 欧美日韩亚洲在线观看| 日韩av电影在线网| 欧洲一区av| 日本高清免费不卡视频| 制服 丝袜 综合 日韩 欧美| 性8sex亚洲区入口| 玛丽玛丽电影原版免费观看1977 | 五月婷婷狠狠干| 性做久久久久久免费观看欧美| 麻豆短视频在线观看| 黄色成人在线网址| 国产精品视频免费一区二区三区| 日本资源在线| 亚洲国产另类 国产精品国产免费| 日本三级片在线观看| 成人app下载| 少妇高潮喷水久久久久久久久久| 在线成人动漫av| 国产精品天天狠天天看| 国产精品久久久久久福利| 6080日韩午夜伦伦午夜伦| 欧美激情图片小说| 成人免费视频视频在线观看免费| 欧美精品一区二区三区三州| 中日韩免视频上线全都免费| 国产精品福利在线观看| 福利视频在线| 亚洲电影免费观看高清完整版在线| 欧美亚韩一区二区三区| 久久众筹精品私拍模特| 国产3p在线播放| 伊人影院久久| 欧美中日韩一区二区三区| 亚洲视频自拍| 国内精品视频久久| 国产高清av在线| 日韩写真欧美这视频| 国产成人无码一区二区三区在线 | 精品无码一区二区三区蜜臀| 国产成人综合网| 激情六月丁香婷婷| 婷婷久久国产对白刺激五月99| 国产chinese精品一区二区| 亚洲精品mv| 久久久精品久久久久| 色中色在线视频| 6080国产精品一区二区| 亚洲日本视频在线观看| 中文字幕亚洲一区二区va在线| 怡红院一区二区| 秋霞电影网一区二区| 久无码久无码av无码| 日本不卡电影| 精品亚洲欧美日韩| 国产视频一区二区在线播放| 欧美在线免费视频| 91精品久久久久久粉嫩| 亚洲香蕉成视频在线观看| www.中文字幕| 欧美日本精品一区二区三区| www.99re7.com| 一色桃子久久精品亚洲| 人妻少妇一区二区| 国产成人aaaa| 五月天丁香花婷婷| 久久激情一区| 国产黄色片免费在线观看| 国产精品成人a在线观看| 久久久久久九九九九| 二区三区精品| 成人妖精视频yjsp地址| 午夜精品区一区二区三| 高潮按摩久久久久久av免费| 国产综合视频在线观看| 朝桐光一区二区| 欧美在线免费视频| 多野结衣av一区| 久久久久久久av| a毛片在线观看| 久热精品视频在线观看一区| 超碰97在线免费观看| 亚洲精品视频免费| 天天操天天爱天天干| 欧美精品一区二区精品网| 国产99999| 91精品国产色综合久久不卡蜜臀| 自拍偷拍第八页| 色久优优欧美色久优优| 亚洲第一在线播放| 污片在线观看一区二区| 青娱乐国产在线| 夜夜亚洲天天久久| 欧美成人精品一区二区免费看片| 亚洲欧美日韩系列| 久久国产美女视频| 亚洲图片你懂的| 男人的午夜天堂| 亚洲同性同志一二三专区| 99自拍偷拍视频| 中文字幕亚洲电影| 亚洲人做受高潮| 亚洲欧美日韩国产综合| 亚洲最大的黄色网址| 亚洲欧美另类图片小说| 男女羞羞免费视频| 亚洲一区在线播放| 精品午夜福利在线观看| 亚洲mv大片欧洲mv大片精品| 日韩三级av在线| 色综合久久精品| 亚洲中文字幕无码爆乳av| 欧美三级中文字幕在线观看| 中文字幕一级片| 欧美一区二区私人影院日本| 国产黄频在线观看| 亚洲国产91精品在线观看| 色中色在线视频| 日韩综合中文字幕| 97影院秋霞午夜在线观看| 欧美精品福利在线| 免费福利视频一区二区三区| 国产精品久久一区主播| 91丨精品丨国产| 国产精品一级久久久| 亚洲精品亚洲人成在线观看| 涩涩涩999| 欧美1区3d| 日韩欧美视频网站| 老司机精品视频在线| 韩国三级在线播放| 91丨九色丨国产丨porny| 久久久久久国产免费a片| 亚洲欧美国产毛片在线| 国产在线拍揄自揄拍| 欧洲精品中文字幕| av中文在线观看| 亚洲免费福利视频| 欧美极品视频| 97在线视频观看| 日韩av黄色| 久久天天狠狠| 91精品动漫在线观看| av之家在线观看| 国内国产精品久久| 最新在线黄色网址| 国产精品麻豆视频| 日本黄色片视频| 欧美一区二区免费| 猫咪在线永久网站| 色综合久久精品亚洲国产| 性欧美hd调教| 古典武侠综合av第一页| 青青草原综合久久大伊人精品| 亚洲色成人www永久在线观看 | 日韩精品福利一区二区三区| 一区二区在线观看网站| 亚洲国产高清视频| 欧美激情精品久久久久久小说| 国产另类ts人妖一区二区| 亚洲午夜福利在线观看| 亚洲激情图片qvod| 中文字幕乱码人妻二区三区| 亚洲白虎美女被爆操| 麻豆传媒视频在线| 欧美综合一区第一页| 亚洲伊人影院| 超碰97免费观看| 日韩av电影天堂| 亚洲国产欧美视频| 亚洲18色成人| 亚洲av少妇一区二区在线观看| 在线播放日韩av| 黄色成人免费网| 韩国成人av| 亚洲视屏一区| 欧美污在线观看| 国产精品高清亚洲| 中文字幕人妻互换av久久 | 91久久久久久久| 成人3d动漫在线观看| 人妻无码视频一区二区三区| av在线一区二区三区| 久久精品性爱视频| 日韩视频免费观看高清完整版| 思思99re6国产在线播放| 欧美综合第一页| 色哟哟精品丝袜一区二区| 日韩亚洲欧美视频| 成人国产亚洲欧美成人综合网| 粉嫩av性色av蜜臀av网站| 欧美福利视频一区|