1. 程式人生 > >Android常見的異常之ClassNotFoundException--Didn't find class

Android常見的異常之ClassNotFoundException--Didn't find class

兩個可以完美執行的程式合在一起就會報以下的錯誤,彷徨了好久,終於迎來答案:

報的異常(還有很多相似的異常,這裡只截取了一部分)是

解決方案:

還是先解決打包問題,回頭再研究那些高深的動態化載入技術。偷懶一下咯考慮到投入產出比,決定使用Google官方的multiDex解決。(Google的補丁方案啊,不會再有坑了吧?後面才發現還是太天真) 該方案有兩步:
1.修改gradle指令碼來產生多dex。
2.修改manifest 使用MulitDexApplication。
步驟1.在gradle腳本里寫上:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
compile 'com.android.support:multidex:1.0.0'
}

步驟2.  manifest宣告修改
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>

如果有自己的Application,繼承MulitDexApplication。如果當前程式碼已經繼承自其它Application沒辦法修改那也行,就重寫 Application的attachBaseContext()這個方法。
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);     

}

run一下,可以了!但是dex過程好像變慢了。。。
文件還寫明瞭multiDex support lib 的侷限。瞄一下是什麼:
1.在應用安裝到手機上的時候dex檔案的安裝是複雜的(complex)有可能會因為第二個dex檔案太大導致ANR。請用proguard優化你的程式碼。呵呵


2.使用了mulitDex的App有可能在4.0(api level 14)以前的機器上無法啟動,因為Dalvik linearAlloc bug(Issue 22586)  。請多多測試自祈多福。用proguard優化你的程式碼將減少該bug機率。呵呵
3.使用了mulitDex的App在runtime期間有可能因為Dalvik linearAlloc limit (Issue 78035)  Crash。該記憶體分配限制在 4.0版本被增大,但是5.0以下的機器上的Apps依然會存在這個限制。
4.主dex被dalvik虛擬機器執行時候,哪些類必須在主dex檔案裡面這個問題比較複雜。build tools 可以搞定這個問題。但是如果你程式碼存在反射和native的呼叫也不保證100%正確。呵呵

感覺這就是個坑啊。補丁方案又引入一些問題。但是外掛化方案要求對現有程式碼有比較大的改動,代價太大,而且動態化載入框架意味著維護成本更高,會有更多潛在bug。所以先測試,遇到有問題的版本再解決。

這種頑固沒有頭緒的bug是不好找,必須我們親自遇見才能更好的解決它,希望能幫助和我有相同問題的同志。

詳細可以訪問:http://www.open-open.com/lib/view/open1452264136714.html