因爲Android是使用Java開發的,所以開發者可以使用ProGuard對代碼進行混淆。SDK已經集成了ProGuard工具,開發者可以從SDK目錄下的\tools\proguard目錄中進行查看。
ProGuard是一個免費的Java類文件收縮,優化,混淆和預校驗器。它可以檢測並刪除未使用的類,字段,方法和屬性。它可以優化字節碼,並刪除未使用的指令。它可以將類、字段和方法使用短無意義的名稱進行重命名。最後,預校驗的Java6或針對Java MicroEdition的所述處理後的碼。
下面就和大家分享一下對使用了第三方庫的項目進行混淆的經驗。
ProGuard默認會對第三方庫也進行混淆的,而第三方庫有的已經混淆過了,有的使用了Java反射技術,所以我們在進行代碼混淆的時候要排除這些第三方庫。排除對第三方庫的混淆需要在混淆規則文件(通常是:proguard-project.txt或proguard.cfg或proguard-rules.pro或proguard-rules.txt也可以是其它的文件名只要在配置文件中將含有混淆規則的文件名配置進去就行了)中添加如下規則:
1.如果使用了Gson之類的工具要使JavaBean類即實體類不被混淆。
2.如果使用了自定義控件那麼要保證它們不參與混淆。
3.如果使用了枚舉要保證枚舉不被混淆。
4.對第三方庫中的類不進行混淆
a.混淆時保護引用的第三方jar包
如:-libraryjars libs/baidumapapi_v3_2_0.jar #保護引用的第三方jar包不被混淆
注意:在使用Eclipse+ADT時需要加入-libraryjars libs/...,如果你是使用android Studio開發的項目則不需要加入libs包中的jar包,這是因爲,通過Android Studio進行混淆代碼時,默認已經將 lib目錄中的 jar 都已經添加到打包腳本中,所以不需要再次手動添加,否則會出現“ java.io.IOException: The same input jar is specified twice” 錯誤。
b.混淆時保護第三方jar包中的類不被混淆
如:-keep class com.baidu.** { *; } #讓ProGuard不要警告找不到com.baidu.**這個包裏面的類的相關引用
-dontwarn com.baidu.** #保持com.baidu.**這個包裏面的所有類和所有方法不被混淆。
附:小編開發中用到的一些混淆規則,大家可以根據需要複製到自己的項目中的混淆規則的文件中即可。
- ################common###############
- -keep class com.jph.android.entity.** { *; } #實體類不參與混淆
- -keep class com.jph.android.view.** { *; } #自定義控件不參與混淆
- ################baidu map###############
- -libraryjars libs/baidumapapi_v3_2_0.jar
- -libraryjars libs/locSDK_5.0.jar
- -keep class com.baidu.** { *; }
- -keep class vi.com.gdi.bgl.android.**{*;}
- -dontwarn com.baidu.**
- ################afinal##################
- #-libraryjars libs/afinal_0.5_bin.jar
- #-keep class net.tsz.afinal.** { *; }
- #-keep public class * extends net.tsz.afinal.**
- #-keep public interface net.tsz.afinal.** {*;}
- #-dontwarn net.tsz.afinal.**
- ################xutils##################
- -libraryjars libs/xUtils-2.6.14.jar
- -keep class com.lidroid.xutils.** { *; }
- -keep public class * extends com.lidroid.xutils.**
- -keepattributes Signature
- -keepattributes *Annotation*
- -keep public interface com.lidroid.xutils.** {*;}
- -dontwarn com.lidroid.xutils.**
- -keepclasseswithmembers class com.jph.android.entity.** {
- <fields>;
- <methods>;
- }
- ################支付寶##################
- -libraryjars libs/alipaysecsdk.jar
- -libraryjars libs/alipayutdid.jar
- -libraryjars libs/alipaysdk.jar
- -keep class com.alipay.android.app.IAliPay{*;}
- -keep class com.alipay.android.app.IAlixPay{*;}
- -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
- -keep class com.alipay.android.app.lib.ResourceMap{*;}
- ################gson##################
- -libraryjars libs/gson-2.2.4.jar
- -keep class com.google.gson.** {*;}
- #-keep class com.google.**{*;}
- -keep class sun.misc.Unsafe { *; }
- -keep class com.google.gson.stream.** { *; }
- -keep class com.google.gson.examples.android.model.** { *; }
- -keep class com.google.** {
- <fields>;
- <methods>;
- }
- -keepclassmembers class * implements java.io.Serializable {
- static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
- private void writeObject(java.io.ObjectOutputStream);
- private void readObject(java.io.ObjectInputStream);
- java.lang.Object writeReplace();
- java.lang.Object readResolve();
- }
- -dontwarn com.google.gson.**
- ################httpmime/httpcore##########
- -libraryjars libs/httpcore-4.3.2.jar
- -libraryjars libs/httpmime-4.3.5.jar
- -keep class org.apache.http.** {*;}
- -dontwarn org.apache.http.**
- ####################jpush##################
- -libraryjars libs/jpush-sdk-release1.7.1.jar
- -keep class cn.jpush.** { *; }
- -keep public class com.umeng.fb.ui.ThreadView { } #雙向反饋功能代碼不混淆
- -dontwarn cn.jpush.**
- -keepclassmembers class * {
- public <init>(org.json.JSONObject);
- }
- #不混淆R類
- -keep public class com.jph.android.R$*{
- public static final int *;
- }
- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
- ####################umeng##################
- -libraryjars libs/umeng-analytics-v5.2.4.jar
- -keep class com.umeng.analytics.** {*;}
- -dontwarn com.umeng.analytics.**
- #-keep public class * extends com.umeng.**
- #-keep public class * extends com.umeng.analytics.**
- #-keep public class * extends com.umeng.common.**
- #-keep public class * extends com.umeng.newxp.**
- -keep class com.umeng.** { *; }
- -keep class com.umeng.analytics.** { *; }
- -keep class com.umeng.common.** { *; }
- -keep class com.umeng.newxp.** { *; }
- -keepclassmembers class * {
- public <init>(org.json.JSONObject);
- }
- -keep class com.umeng.**
- -keep public class com.idea.fifaalarmclock.app.R$*{
- public static final int *;
- }
- -keep public class com.umeng.fb.ui.ThreadView {
- }
- -dontwarn com.umeng.**
- -dontwarn org.apache.commons.**
- -keep public class * extends com.umeng.**
- -keep class com.umeng.** {*; }
- ####################universal-image-loader########
- -libraryjars libs/universal-image-loader-1.9.3.jar
- -keep class com.nostra13.universalimageloader.** {*;}
- -dontwarn com.nostra13.universalimageloader.**
- ####################zxing#####################
- -libraryjars libs/zxing.jar
- -libraryjars libs/zxing_apply.jar
- -keep class com.google.zxing.** {*;}
- -dontwarn com.google.zxing.**
- ####################BASE64Decoder##################
- -libraryjars libs/sun.misc.BASE64Decoder.jar
- ####################support.v4#####################
- -libraryjars libs/android-support-v4.jar
- -keep class android.support.v4.** { *; }
- -dontwarn android.support.v4.**
- ###################other####################
- # slidingmenu 的混淆
- -dontwarn com.jeremyfeinstein.slidingmenu.lib.**
- -keep class com.jeremyfeinstein.slidingmenu.lib.** { *; }
- # ActionBarSherlock混淆
- -dontwarn com.actionbarsherlock.**
- -keep class com.actionbarsherlock.** { *; }
- -keep interface com.actionbarsherlock.** { *; }
- -keep class * extends java.lang.annotation.Annotation { *; }
- -keepclasseswithmembernames class * {
- native <methods>;
- }
- -keep class com.jph.android.entity.** {
- <fields>;
- <methods>;
- }
- -dontwarn android.support.**
- -dontwarn com.slidingmenu.lib.app.SlidingMapActivity
- -keep class android.support.** { *; }
- -keep class com.actionbarsherlock.** { *; }
- -keep interface com.actionbarsherlock.** { *; }
- -keep class com.slidingmenu.** { *; }
- -keep interface com.slidingmenu.** { *; }
5,在build.grandle添加,其中規則寫在proguard-rules.pro中
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
}
}
2,在proguard-rules.pro中加入以下代碼,一下代碼只做參考
-optimizationpasses 5 # 指定代碼的壓縮級別
-dontusemixedcaseclassnames # 是否使用大小寫混合
-dontpreverify # 混淆時是否做預校驗
-verbose # 混淆時是否記錄日誌
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆時所採用的算法
-keep public class * extends android.app.Activity # 保持哪些類不被混淆
-keep public class * extends android.app.Application # 保持哪些類不被混淆
-keep public class * extends android.app.Service # 保持哪些類不被混淆
-keep public class * extends android.content.BroadcastReceiver # 保持哪些類不被混淆
-keep public class * extends android.content.ContentProvider # 保持哪些類不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些類不被混淆
-keep public class * extends android.preference.Preference # 保持哪些類不被混淆
-keep public class com.android.vending.licensing.ILicensingService # 保持哪些類不被混淆
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keepclasseswithmembers class * { # 保持自定義控件類不被混淆
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定義控件類不被混淆
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定義控件類不被混淆
public void *(android.view.View);
}
-keepclassmembers enum * { # 保持枚舉 enum 類不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}