Android 4.X 系統加載 so 失敗的原因分析

1 so 加載過程

so 加載的過程可以參考小米的系統工程師的文章loadLibrary動態庫加載過程分析

2 問題分析

2.1 問題

年前項目里新加了一個 so庫,但發現native 方法的找不到的 crash 好多,好些都是報了java.lang.unsatisfiedlinkerror native method not found,而且基本上是出現在4.x的系統里,特別是 4.4,4.2的系統。在網絡上搜索相關的可能導致到這個問題的原因:

  • so 文件沒有在對應架構的目錄里找到;
  • 方法名有錯誤;

    2.2 分析1

    我們最開始是懷疑應用在安裝時沒有正確解壓出對應的so文件到相應目錄,因此加了相應統計來看發生crash的手機是否是因為找不到對應的 so文件導致的;但統計數據發現這些手機里都可以找到對應架構的 so文件,因此就排除了不存在so文件導致的 crash;

2.3 分析2

我們同事以前有發現在Android 4.x系統里,如果so 文件是在應用啟動時加載的,但使用時機卻在后面的時間點,so加載進手機的內存可能會被系統由于資源緊張而回收掉,這種情況下,可以通過重新加載一次 so文件來減少相關的 crash,這種方法 fix了某個量很高的 so 相關的crash。但我們的 socrash 明顯是不屬于這種情況的,因為我們是通過 System.load() 方法加載完 so文件后,就調用相關的方法,這時內存肯定是還在的。在分析了一系列可能的原因后,懷疑這個crash 是因為應用安裝時解壓出來的 so文件是損壞的,因此我們嘗試在第一次發生這個crash時,將這個crash catch住,然后在 catch塊將原來目錄下的 so文件刪除掉,并重新從應用的安裝目錄解壓出對應的so文件放到原來的目錄,并加了相關的統計來驗證。so的加載用了 Relinkder。相關的簡化版本代碼如下:

relinker.loadLibrary(getApplicationContext(), "so_name");
try{// call native method
} catch(UnsatisfiedLinkError e) {//some statsString library = "so_name";String libName = System.mapLibraryName(library);File workaroundLibDir = getApplicationContext().getDir("lib", Context.MODE_PRIVATE);File workaroundLibFile = new File(workaroundLibDir, libName);workaroundLibFile.delete();apkLibraryInstaller.installLibrary(getApplicationContext(), supportedAbis(), libName, workaroundLibFile, relinker);System.load(workaroundLibFile.getAbsolutePath());//call native method// some stats
}

2.4 分析3

在使用的 2.3 的解決方法后,我們的 sojava.lang.unsatisfiedlinkerror native method not found 大部分消失了。理論上使用過一次重新解壓so 文件后,這個用戶在下一次升級前都應該不會再發生了類似的 crash了,但我們的統計數據發現,有些用戶每一次啟動都需要進入catch塊來避免crash,而每次都可以通過 reload來正常使用我們的應用,這至今還是個迷,還沒有想明白是什么情況會導致這個問題?手機的存儲有問題?但其他的so又沒有這個問題。希望如果有同行解決過類似的問題的,指點一下。

3 總結

Android 4.X 系統加載 so 后,出現 java.lang.unsatisfiedlinkerror native method not foundcrash的原因除了網上所說的 不存在這個so 和 方法名有問題(商用的應用應該不會有這個問題的)外,還有兩個原因:

  • so 加載進系統的內存被系統由于資緊張而回收了,這種情況下直接再load一下 so 文件就可以解決大部分;
  • so 文件有問題,這種情況下,可以通過重新從應用安裝目錄解壓出對應的 so 文件并重新加載來解決大部分;

這兩種方法不能保證可以100%解決問題,但可以減少大部分問題(90%);

轉載于:https://www.cnblogs.com/WoodJim/p/8468865.html

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

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

相關文章

桌面顯示激活windows_愚蠢的怪胎技巧:如何在桌面上顯示Windows版本

桌面顯示激活windowsHave you ever noticed during all the beta releases of Windows, there’s always a Windows version on the desktop in the lower right-hand corner? Here’s how that “feature” is enabled or disabled. 您是否曾經在Windows的所有beta版本中都注…

服務網格:限流保護 (上)

背景限流是服務治理中保護服務的重要手段之一,也是最直接有效的手段,它可以保護服務不被瞬間的大流量沖垮,類似電路中的“保險絲”。在服務上線前,我們都會對服務進行基準測試,來了解可通過的最大“電流”。上面所說的…

博弈論進階之Anti-SG游戲與SJ定理

前言 在上一節中,我們初步了解了一下SG函數與SG定理。 今天我們來分析一下SG游戲的變式——Anti-SG游戲以及它所對應的SG定理 首先從最基本的Anti-Nim游戲開始 Anti-Nim游戲是這樣的 有兩個頂尖聰明的人在玩游戲,游戲規則是這樣的: 有\(n\)堆…

怎樣取消outlook約會_快速提示:在Outlook 2010中設置和取消約會

怎樣取消outlook約會Getting everyone in one place at the same time for appointments can be daunting at times. Outlook makes it easy to setup appointments and invite attendees as well, and here we look at doing it in Outlook 2010. 同時讓每個人都集中在一個地方…

重視和解決 ABP 分布式事件亂序問題

ABP Framework 5.0 實現了單體應用場景下,收件箱和發件箱的事件嚴格順序性。但在微服務或多數據庫場景下,由于網絡時延和設施效率的限制, 分布式事件將不再是 Linearizability [1] 的,因此必然會存在物理時間上的收件亂序。借用 D…

個人博客建站方案推薦

1.服務器選擇 正值雙十一來臨之際各大服務器提供商又大量的優惠活動,各位要步入個人站長行列的小哥們時機要把握好了,我個人使用過阿里云的服務器,騰訊云的服務器,華為云的服務器。其實,個人感覺就放個博客&#xff0c…

linux系統下nginx安裝目錄和nginx.conf配置文件目錄

linux系統下nginx安裝目錄和nginx.conf配置文件目錄 1、查看nginx安裝目錄 輸入命令 # ps -ef | grep nginx 返回結果包含安裝目錄 root 2662 1 0 07:12 ? 00:00:00 nginx: master process /usr/sbin/nginx 2、查看nginx.conf配置文件目錄 輸入命令 # nginx…

android啟用hdcp_如何在Android上啟用優先收件箱(和設置僅重要通知)

android啟用hdcpYesterday Google released an updated Gmail application for Android 2.2 phones that supports the Priority Inbox feature—and more importantly, allows you to change your notifications to only alert you for important email. Let’s take a look. …

.Net CLR GC plan_phase二叉樹和Brick_table

楔子Plan_Phase(GC的計劃階段)很早就接觸了,但是后面一直沒用到,忘記了,此次又用到了,幾乎忘光了,費了很大力氣理解它,記錄下,以免又忘記了。主題計劃階段(plan_phase)主要就兩個部分&#xff0…

Vijos p1484 ISBN號碼

描述每一本正式出版的圖書都有一個ISBN號碼與之對應,ISBN碼包括9位數字、1位識別碼和3位分隔符,其規定格式如“x-xxx-xxxxx-x”,其中符號“-”就是分隔符(鍵盤上的減號),最后一位是識別碼,例如0…

scrapy爬蟲啟示錄-小伙子老夫看你血氣方剛這本《爬蟲秘錄》就傳給你了

文章來源: IT源點 第一章 誤入歧途 每個學習爬蟲的人都有一顆愛美的心,俺也是一樣的。那么多的美眉圖片,不薅下來,沒了誰負責。于是夜里孤枕難眠的老男孩開始了他的擼碼之旅。從此在學習爬蟲,學習Python的道路上越走…

自己設置假期的日歷控件_在假期旅行時使用PC娛樂自己

自己設置假期的日歷控件Staying connected may be hard no matter what network you are on, and in flight Wi-Fi isn’t pervasive enough to count on. Here are tips and tricks to keep yourself entertained when unplugged and traveling. 無論您使用什么網絡&#xff0…

.Net CLR異常和windows C++ 異常調用棧簡析

楔子前面一篇研究了下C異常的,這篇來看下,CLR的異常內存模型,實際上都是一個模型,承繼自windows異常處理機制。不同的是,有VC編譯器(vcruntime.dll)接管的部分,被CLR里面的函數ProcessCLRExcept…

Codeforces936C. Lock Puzzle

給個串&#xff0c;只能用操作shift x表示把后面x個字符翻轉后放到串的前面。問s串怎么操作能變t串。n<2000&#xff0c;操作次數<6100。 打VP時這轉來轉去的有點暈。。。 可以想一種逐步構造的方法&#xff0c;即從一個小的完成構造的部分通過一頓操作&#xff0c;在不影…

公共服務領域英文譯寫規范_公共領域日:對版權和公共領域重要性的思考

公共服務領域英文譯寫規范The first of the year is Public Domain Day, a day intended to call attention to copyright issues and the public domain. At the Center for the Study of the Public Domain they have an interesting (and sobering) review of works that wo…

Elasticsearch 實戰經驗總結

Centos7下es 7.7.0安裝配置 怎么安裝使用elasticsearch-head插件 用logstash同步Mysql數據到ES Springboot使用ES官方推薦方式REST Client整合ES實現關鍵詞高亮 ELK-Elasticsearch&#xff0c;Logstash&#xff0c;kibana搭建基于日志文件的日志分析系統 設置elasticsearc…

.Net 7 的 AOT 和 CLR有什么區別?

楔子&#xff1a;AOT和 CLR的區別是什么呢&#xff1f;大部分人肯定會說&#xff0c;一個編譯成本地機器碼&#xff08;Native Code&#xff09;&#xff0c;一個是JIT即時編譯的結果。這么說&#xff0c;其實也對&#xff0c;但是不具體。具體應該怎么看呢&#xff1f;AOTAOT實…

接入amazon avs_每日新聞綜述:亞馬遜將互聯網接入推向全球的宏偉計劃

接入amazon avsPlus Snap’s big push to stay relevant, Amazon’s Alexa-powered AirPods alternatives, more Android Q news, and a lot more. It’s time to talk about the biggest, coolest, or generally most interesting stories from the last 24 hours. 加上Snap保…

計算的未來

我自己倒是后來也是覺得我自己可以想象一個未來的技術&#xff0c;就是以后的編程的語言和庫可以抽象現在的一些高級語言的關鍵字。比如要寫一個編輯器的時候&#xff0c;只要給點這些東西的數據結構和數據流向&#xff0c;而一些什么很繁瑣的一些底層編碼都是可以用高級語言來…

nginx 實用配置問題總結

配置 tomcat&#xff0c;nginx&#xff0c;解決 post 請求超時問題nginx 跨域問題 CORS policy: No Access-Control-Allow-Originnginx 配置靜態驗證文件&#xff0c;報 404&#xff0c;解決方案nginx 獲取用戶真實 IPcentos 部署 php 網站方法-使用 nginx ssl https