eclipse adt中因升級ADT出現的問題解決方法,method IDnotin[0,0xffff]:65536,分包處理這個問題

問題背景:因爲公司Android 框架項目比較老,但是客戶那邊還在用,而google對android系統權限的審覈問題做出調整,導致之前的項目在android系統升級之後,項目不能用了,比如調用拍攝的功能,所以我必須着手升級api。下面開始一步步記錄升級過程。

一、準備階段

1,下載eclipse adt,我這裏是下載的配置好的adt,省去了配置的時間(jdk環境最好是1.8以上,現在大多用的這個)

2,下載新版的sdk(6.0),最低要這個,原因下面會描述,所有的依賴包庫都要升級成6.0以上,v7 ,v4的包,不然sdk不一致會起衝突

3.將原項目工程導入新的環境下

二,排錯過程

1.先保證你的項目能在新的環境下運行起來,然而不會那麼容易跑起來的,我導入新的後,問題不少

  a.問題1,因爲我項目有v7,v4包,所以替換的時候,我採取的是將依賴庫下的libs用新的替換,替換後有些styles會報錯,你如果知道這個樣式是哪裏用到的,清楚這個,可以處理,不清楚先註釋,目的是讓項目先跑起來。

  b.問題2,排完所有報錯的地方後,不報錯了,那就開始運行,,然後給你報個錯,method IDnotin[0,0xffff]:65536  方法數超過了虛擬機加載的最大數,項目小一般不會出現這個問題,然後之前都是在project.properties加個dex.force.jumbo=true就完事了,但是這次不行,然後以前eclipse有時候clear一下就好了,這次確不行,於是就找方法,查這查那的,最後看到一個方法,

  https://www.jianshu.com/p/09c7204109b0   開始在eclipse中手動分包然後避免35536的問題, 然後就開始嘗試 

三,分包

看上面鏈接的方法,大體思路是將部分jar合併成一個一個jar包,然後再將jar轉成.dex文件,大多比較大、功能比較多的apk,可以解壓之後看到有classes.dex ,classes2.dex classes3.dex文件,所以我我們也是將部分(在Application中沒有用到的jar,看着上面的文檔說的,如果將在Application中用到的jar包也合併的話,會爆ClassNotFound找不到類的那個錯誤,沒有驗證)

1.jar到dex轉換

如果你你項目中jar比較多,像我的項目中引入了16個的jar包,所以我們需要將部分jar合併,我用到了一個eclipse插件fatjar工具,百度搜索然後下載最新的就好。具體可參考 https://blog.csdn.net/nmzkchina/article/details/79701142

然後將合併好的jar包生成爲dex,然後重命名classes2.dex ,你也可以在生成的時候就命名成這個,具體參考https://www.jianshu.com/p/562eaf211ff5,然後放在src根目錄下,我們的目的是爲了分包 ,那麼libs下的包是不是可以刪減了呢,但是這時我們不能直接刪除下面的包,因爲我們直接刪除項目會報錯,因爲我們編譯的時候要用到這些jar,我們要將這些jar放在其他地方,上文鏈接中的大哥是在src下建了個folder(圖1)其實在其他地方存放也行,然後把jar包放在這裏然後再在以外部lib的方式加入項目(圖2),保證編譯通過

               圖1

                                             圖2

然後呢,再到此項目本地項目目錄下找到.classpath文件,就可以看到文件路徑在這裏已經能看到了

                             圖3

 

2.導入 mutildex 分包所需要的jar包

然後在 Application的oncreate聲明載入dex文件的代碼MultiDex.install(this)就行了,然後項目運行,發現已經不會爆35536的問題了。

四、將在6.0以上的動態添加系統權限的功能加上,也是我們升級api的目的

    private void boolOpenCarmer() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA) // 打開相機權限
        != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_EXTERNAL_STORAGE) // 可讀
                != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) // 可寫
                != PackageManager.PERMISSION_GRANTED) {
            // 申請WRITE_EXTERNAL_STORAGE權限
            ActivityCompat.requestPermissions(this,
                    new String[] { Manifest.permission.CAMERA,
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);
        }
    }

在你的BaseActivity中加上這個方法,然後再onCreate方法中調用一下就可以了。然後錯也排完了,功能也加上了,那我們運行一下,然後達到預期的效果

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章