問題背景:因爲公司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方法中調用一下就可以了。然後錯也排完了,功能也加上了,那我們運行一下,然後達到預期的效果