從SDK2.3開始在android-sdk-windows\tools\下面多了一個proguard文件夾,proguard是一個java代碼混淆的工具,不過代碼混淆不能混淆xml的佈局文件,混淆的是JAVA文件。java
1、在eclipse中,android 2.3開始支持這個功能;android
2、另外一種是使用腳本如ant等 。windows
混淆器經過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。app
1、默認混淆文件 :proguard.cfg文件, google默認不混淆 Activity 、Service ... 類的 子類, 全部 activity 的子類 名稱是被保留的。讓proguard.cfg起做用的作法很簡單,就是在eclipse自動生成的default.properties文件中加上一句「proguard.config=proguard.cfg」就能夠了eclipse
混淆中保留了繼承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本組件以及com.android.vending.licensing.ILicensingService,並保留了全部的Native變量名及類名,全部類中部分以設定了固定參數格式的構造函數,枚舉等等。ide
2、android sdk目錄在帶有空格的目錄名稱的子目錄下沒法混淆 去掉空格就行了函數
3、依賴包混淆帶來的麻煩,最好所有保留不混淆。例如工具
-keep class com.badlogic.** { *; }佈局
-keep class * implements com.badlogic.gdx.utils.Json*優化
-keep class com.google.** { *; }
4. jni反調java方法
這些類或方法一樣可能會被proguard認爲沒有調用過而被除掉, 或都被更名. 這些方法最好統一寫在一個類中, 而後這個類不做優化, 或是找出全部jni調用過的類與方法, 在proguard.cfg中配置, 不對它們做優化
5. 其它反射調用的java類與方法
使用反射時必定要注意proguard可能會認爲那些方法未被調用過, 會在代碼優化過程當中將它們更名或除去. 在使用反射的地方必定要在proguard.cfg中配置, 不優化反射調用過的類和方法。
比較常見的是寫在視圖xml中的onClick響應出錯. 由於寫在xml中的onClick是經過反射調用的, proguard認爲它們沒有在代碼中被調用過, 因此將它們從代碼中除掉或更名了.
解決方法:在proguard.cfg中添加如下代碼, 就能夠防止被配在視圖xml中的onClick方法被proguard優化掉。
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
咱們公司目前的批量打包腳本注意事項:
7 若是是引用第三方jar包,應注意查看jar包裏是否有assets資源文件夾,若是有,應用將assets文件夾中的資源copy到項目中的assets文件夾下,這樣混淆後纔不會出錯。在proguard優化事後會產生一些文件
dump.txt – 描述.apk文件中全部類文件間的內部結構
8 客戶端利用友盟的分享功能作第三方分享,但客戶端混淆打包後,分享功能會報一些resource找不到的問題。這是由於友盟分享功能會用反射的方法去找本身須要的資源文件。被混淆後固然報錯。
-keep class **.R$* {
*;
}
mapping.txt – 列出了原始的類,方法和字段名與混淆後代碼間的映射。這個文件很重要,當你從release版本中收到一個bug報告時,能夠用它來翻譯被混淆的代碼。
對應公司裏產生的.map文件
seeds.txt – 列出了未被混淆的類和成員
usage.txt – 列出了從.apk中刪除的代碼