Android 常見Crash Log匯總


一、BinderProxy@4479b390 is not valid; is your activity running?

原因分析:

因為使用了AsyncTask 異步線程在線程完成以后的onPostExecute方法里面操作UI。這個時候如果用戶在onPostExecute調用之間跳轉了頁面,這時activity已經onDestory了,那么就會報出android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4479b390 is not valid; is your activity running?

解決辦法:

1. 在修改UI之前使用Activity的isFinishing判斷一下Activity是否還存在.

2. 在修改UI的時候捕獲一下異常.

二、java.lang.NoSuchMethodError: android.app.ANRAppManager.dumpMessageHistory

原因分析:

Android是開源的系統,廠商獲拿到源碼后可以自由地定制和改造,當然,修改的過程可能帶來一些不穩定的問題,會導致同樣的代碼,在一些特定的機型出現適配的問題。這個問題就是出現的很普遍的一個崩潰,異常信息如下所示:

java.lang.NoSuchMethodError: android.app.ANRAppManager.dumpMessageHistory
android.app.ActivityThread$ApplicationThread.dumpMessageHistory(ActivityThread.java:1177)
android.app.ApplicationThreadNative.onTransact(ApplicationThreadNative.java:609)
android.os.Binder.execTransact(Binder.java:351)
dalvik.system.NativeStart.run(Native Method)

先按照上面提到的思路,通過Android源碼來分析問題的根源,找到ActivityThread類,仔細檢查,看到這個類里面並沒有dumpMessageHistory這個方法,也沒有ANRAppManager類,很明顯這不是Android原生系統的方法,是被修改過的。再檢查下出現這個崩潰的機型特點,發現也不是集中在某些機型上出現,對於這個問題,找到了一台出現這個崩潰的機器並重現出來了,得到的崩潰堆棧信息跟上面完全一樣。

 

解決辦法:

屬於系統級別的問題,目前沒有解決方案.

三、android.app.Fragment$InstantiationException — make sure class name exists, is public, and has an empty constructor that is public

解決辦法:

若Fragement定義有帶參構造函數,則一定要定義public的默認的構造函數。即可解決此問題。如果硬要攜帶參數進去,可以通過Intent結合Bunble的方式攜帶進去。

相關文章:Android Fragment 使用技巧

四、The final local variable xxx cannot be assigned, since it is defined in an enclosing type

錯誤分析:

The final local variable xxx cannot be assigned, since it is defined in an enclosing type“,其中xxx是一個局部變量名。首先這是一個java編譯時的錯誤,翻譯成中文是:不可變的局部變量不能被賦值,因為它已經被定義在一個封閉類型中。

解決辦法:

如果將此變量聲明為一個全局的變量,然后針對此數據做好相關的數據的內容控制即可。

五、Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView that was originally added here

異常場景:

經常在應用中需要處理一些耗時的工作,諸如讀取大文件、訪問網絡資源等。為了避免因程序假死而帶來的糟糕用戶體驗,通常我們可以通過線程+Handler或者Android提供的AsyncTask來解決該問題,並一般以ProgressDialog等提示性控件來告知用戶當前的程序進度。而標題中描述的異常則會常常出現在這樣的場景中,並且往往掩蓋了導致異常的真正的罪魁禍首。

問題原因:

從異常描述中,大致的意思是存在窗口句柄泄露,即未能及時銷毀某個PhoneWindow。而這往往誤導了我們,把過多的精力放在查找所謂的內存泄露上了。其實存在這么一種情況,即因我們在非主線程中的某些操作不當而產生了一個嚴重的異常,從而強制當前Activity被關閉。而在關閉的同時,卻沒能及時的調用dismiss來解除對ProgressDialog等的引用,從而系統拋出了標題中的錯誤,而掩蓋了真正導致這個錯誤的異常信息。

解決方法:

重寫Activity的onDestroy方法,在方法中調用dismiss來解除對ProgressDialog等的引用。

六、Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri 

日志內容:

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=21235, uid=10285 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

異常場景:

在Android 6.0及以上的手機版本,做一些讀取文件的操作,如讀取圖片的時候,如果沒有申請權限,則會導致此問題。

解決辦法:

在Manifest里面聲明權限,在需要的時候,動態請求權限。

七、UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in 

異常場景:Jar包中的Java方法調用Native方法的時候,出現鏈接失敗

解決方法:檢查混淆的設置,一般是Java層面的代碼被混淆了,此時需要保證此區域的代碼不被混淆

八、Timer already cancelled.

異常場景:一般與兩種情況。1. cancel之前已經手動調用了一次cancel操作。2.timer運行的任務出錯,導致Timer自動取消執行。

解決方法:一般是第二種錯誤場景為大多數出現的情況。建議優化運行任務的代碼,對潛在的問題做好處理機制。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM