因为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.**这个包里面的所有类和所有方法不被混淆。
附:小编开发中用到的一些混淆规则,大家可以根据需要复制到自己的项目中的混淆规则的文件中即可。
[plain] view plain copy
print?
1. ################common###############
2. -keep class com.jph.android.entity.** { *; } #实体类不参与混淆
3. -keep class com.jph.android.view.** { *; } #自定义控件不参与混淆
4.
5. ################baidu map###############
6. -libraryjars libs/baidumapapi_v3_2_0.jar
7. -libraryjars libs/locSDK_5.0.jar
8. -keep class com.baidu.** { *; }
9. -keep class vi.com.gdi.bgl.android.**{*;}
10. -dontwarn com.baidu.**
11.
12.
13. ################afinal##################
14. #-libraryjars libs/afinal_0.5_bin.jar
15. #-keep class net.tsz.afinal.** { *; }
16. #-keep public class * extends net.tsz.afinal.**
17. #-keep public interface net.tsz.afinal.** {*;}
18. #-dontwarn net.tsz.afinal.**
19.
20. ################xutils##################
21. -libraryjars libs/xUtils-2.6.14.jar
22. -keep class com.lidroid.xutils.** { *; }
23. -keep public class * extends com.lidroid.xutils.**
24. -keepattributes Signature
25. -keepattributes *Annotation*
26. -keep public interface com.lidroid.xutils.** {*;}
27. -dontwarn com.lidroid.xutils.**
28. -keepclasseswithmembers class com.jph.android.entity.** {
29. <fields>;
30. <methods>;
31. }
32.
33. ################支付宝##################
34. -libraryjars libs/alipaysecsdk.jar
35. -libraryjars libs/alipayutdid.jar
36. -libraryjars libs/alipaysdk.jar
37. -keep class com.alipay.android.app.IAliPay{*;}
38. -keep class com.alipay.android.app.IAlixPay{*;}
39. -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
40. -keep class com.alipay.android.app.lib.ResourceMap{*;}
41.
42. ################gson##################
43. -libraryjars libs/gson-2.2.4.jar
44. -keep class com.google.gson.** {*;}
45. #-keep class com.google.**{*;}
46. -keep class sun.misc.Unsafe { *; }
47. -keep class com.google.gson.stream.** { *; }
48. -keep class com.google.gson.examples.android.model.** { *; }
49. -keep class com.google.** {
50. <fields>;
51. <methods>;
52. }
53. -keepclassmembers class * implements java.io.Serializable {
54. static final long serialVersionUID;
55. private static final java.io.ObjectStreamField[] serialPersistentFields;
56. private void writeObject(java.io.ObjectOutputStream);
57. private void readObject(java.io.ObjectInputStream);
58. java.lang.Object writeReplace();
59. java.lang.Object readResolve();
60. }
61. -dontwarn com.google.gson.**
62.
63.
64.
65. ################httpmime/httpcore##########
66. -libraryjars libs/httpcore-4.3.2.jar
67. -libraryjars libs/httpmime-4.3.5.jar
68. -keep class org.apache.http.** {*;}
69. -dontwarn org.apache.http.**
70.
71. ####################jpush##################
72. -libraryjars libs/jpush-sdk-release1.7.1.jar
73. -keep class cn.jpush.** { *; }
74. -keep public class com.umeng.fb.ui.ThreadView { } #双向反馈功能代码不混淆
75. -dontwarn cn.jpush.**
76. -keepclassmembers class * {
77. public <init>(org.json.JSONObject);
78. }
79. #不混淆R类
80. -keep public class com.jph.android.R$*{
81. public static final int *;
82. }
83. -keepclassmembers enum * {
84. public static **[] values();
85. public static ** valueOf(java.lang.String);
86. }
87.
88. ####################umeng##################
89. -libraryjars libs/umeng-analytics-v5.2.4.jar
90. -keep class com.umeng.analytics.** {*;}
91. -dontwarn com.umeng.analytics.**
92.
93. #-keep public class * extends com.umeng.**
94. #-keep public class * extends com.umeng.analytics.**
95. #-keep public class * extends com.umeng.common.**
96. #-keep public class * extends com.umeng.newxp.**
97. -keep class com.umeng.** { *; }
98. -keep class com.umeng.analytics.** { *; }
99. -keep class com.umeng.common.** { *; }
100. -keep class com.umeng.newxp.** { *; }
101.
102. -keepclassmembers class * {
103. public <init>(org.json.JSONObject);
104. }
105. -keep class com.umeng.**
106.
107. -keep public class com.idea.fifaalarmclock.app.R$*{
108. public static final int *;
109. }
110.
111. -keep public class com.umeng.fb.ui.ThreadView {
112. }
113.
114. -dontwarn com.umeng.**
115.
116. -dontwarn org.apache.commons.**
117.
118. -keep public class * extends com.umeng.**
119.
120. -keep class com.umeng.** {*; }
121.
122. ####################universal-image-loader########
123. -libraryjars libs/universal-image-loader-1.9.3.jar
124. -keep class com.nostra13.universalimageloader.** {*;}
125. -dontwarn com.nostra13.universalimageloader.**
126.
127.
128. ####################zxing#####################
129. -libraryjars libs/zxing.jar
130. -libraryjars libs/zxing_apply.jar
131. -keep class com.google.zxing.** {*;}
132. -dontwarn com.google.zxing.**
133.
134. ####################BASE64Decoder##################
135. -libraryjars libs/sun.misc.BASE64Decoder.jar
136.
137. ####################support.v4#####################
138. -libraryjars libs/android-support-v4.jar
139. -keep class android.support.v4.** { *; }
140. -dontwarn android.support.v4.**
141.
142. ###################other####################
143. # slidingmenu 的混淆
144. -dontwarn com.jeremyfeinstein.slidingmenu.lib.**
145. -keep class com.jeremyfeinstein.slidingmenu.lib.** { *; }
146. # ActionBarSherlock混淆
147. -dontwarn com.actionbarsherlock.**
148. -keep class com.actionbarsherlock.** { *; }
149. -keep interface com.actionbarsherlock.** { *; }
150. -keep class * extends java.lang.annotation.Annotation { *; }
151. -keepclasseswithmembernames class * {
152. native <methods>;
153. }
154.
155. -keep class com.jph.android.entity.** {
156. <fields>;
157. <methods>;
158. }
159.
160. -dontwarn android.support.**
161. -dontwarn com.slidingmenu.lib.app.SlidingMapActivity
162. -keep class android.support.** { *; }
163. -keep class com.actionbarsherlock.** { *; }
164. -keep interface com.actionbarsherlock.** { *; }
165. -keep class com.slidingmenu.** { *; }
166. -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 *;
}