在android打包發佈的時候,需要對app進行壓縮,混淆,去除無效文件等,以保證發佈出去的app佔用資源儘可能的小。因此需要我們對gradle進行必要的配置(以android studio打包爲例)。
1、build.gradle 配置
buildTypes{
debug {
//多餘的參數
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
// 顯示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
}
release {
minifyEnabled true //混淆
zipAlignEnabled true //Zipalign優化
shrinkResources false //刪除無用資源
signingConfig signingConfigs.release
// 顯示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
release版本爲發佈版本,因此設置了minifyEnabled true,zipAlignEnabled true,shrinkResources true。其中proguard-rules.pro是需要我們自己根據項目編寫的混淆文件。
2、proguard-rules.pro混淆文件編寫(網上都有,就不貼了)
3、常見transformClassesAndResourcesWithProguardForRelease’.錯誤
這個問題是在說你在混淆打包的時候有些類有可能找不着,所以會報錯,和warning
解決的辦法:
找到報warning的類都給他在你的proguard-rules.pro混淆器文件中
添加代碼-dontwarn 包名+類名.**;
給取消掉warning就可以了,如果你不想那個類被混淆,那就添加代碼:-keep class 包名+類名{;}或者包名.*{*;}
當然也可以在proguard-rules.pro添加-ignorewarning ,這個是“屏蔽所有警告” 。
因此打出的包可能會出現必要代碼被混淆導致項目奔潰而無法正常運行,因此個人建議,最好不要加這句代碼,遇到什麼錯誤什麼警告,對應去解決即可,解決完了自然可以打包成功了。
4、解決 The same input jar is specified twice 問題
在 Android Studio 中, build.gradle 中聲明瞭對這個 jar 包的依賴,所以不需要在混淆配置文件中繼續聲明。
將proguard-rules.pro中所有的 -libraryjars libs/*.jar 註釋掉以後,項目就可以正常混淆了。
5、最後還有一個小問題,混淆後打開包含百度地圖的app時,報如下錯誤
No pending exception expected: java.lang.NoSuchMethodError: no static method "Lcom/baidu/vi/VMsg;.postMessage(IIIJ)V
解決方法如下:原因是啓用了代碼混淆引起的報錯。
修改android/app/proguard-rules.pro 文件,在裏面增加如下兩行
-keep class com.baidu.** { *;}
-keep class vi.com.gdi.bgl.**{*;}