【转】 Android代码混淆之混淆规则

请尊重他人的劳动成果,转载请注明出处:Android代码混淆技巧》

因为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 plaincopy

  1. ################common###############
  2. -keep class com.jph.android.entity.** { *; } #实体类不参与混淆
  3. -keep class com.jph.android.view.** { *; } #自定义控件不参与混淆
  4. ################baidu map###############
  5. -libraryjars libs/baidumapapi_v3_2_0.jar
  6. -libraryjars libs/locSDK_5.0.jar
  7. -keep class com.baidu.** { *; }
  8. -keep class vi.com.gdi.bgl.android.**{*;}
  9. -dontwarn com.baidu.**
  10. ################afinal##################
  11. #-libraryjars libs/afinal_0.5_bin.jar
  12. #-keep class net.tsz.afinal.** { *; }
  13. #-keep public class * extends net.tsz.afinal.**
  14. #-keep public interface net.tsz.afinal.** {*;}
  15. #-dontwarn net.tsz.afinal.**
  16. ################xutils##################
  17. -libraryjars libs/xUtils-2.6.14.jar
  18. -keep class com.lidroid.xutils.** { *; }
  19. -keep public class * extends com.lidroid.xutils.**
  20. -keepattributes Signature
  21. -keepattributes *Annotation*
  22. -keep public interface com.lidroid.xutils.** {*;}
  23. -dontwarn com.lidroid.xutils.**
  24. -keepclasseswithmembers class com.jph.android.entity.** {
  25. <fields>;
  26. <methods>;
  27. }
  28. ################支付宝##################
  29. -libraryjars libs/alipaysecsdk.jar
  30. -libraryjars libs/alipayutdid.jar
  31. -libraryjars libs/alipaysdk.jar
  32. -keep class com.alipay.android.app.IAliPay{*;}
  33. -keep class com.alipay.android.app.IAlixPay{*;}
  34. -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
  35. -keep class com.alipay.android.app.lib.ResourceMap{*;}
  36. ################gson##################
  37. -libraryjars libs/gson-2.2.4.jar
  38. -keep class com.google.gson.** {*;}
  39. #-keep class com.google.**{*;}
  40. -keep class sun.misc.Unsafe { *; }
  41. -keep class com.google.gson.stream.** { *; }
  42. -keep class com.google.gson.examples.android.model.** { *; }
  43. -keep class com.google.** {
  44. <fields>;
  45. <methods>;
  46. }
  47. -keepclassmembers class * implements java.io.Serializable {
  48. static final long serialVersionUID;
  49. private static final java.io.ObjectStreamField[] serialPersistentFields;
  50. private void writeObject(java.io.ObjectOutputStream);
  51. private void readObject(java.io.ObjectInputStream);
  52. java.lang.Object writeReplace();
  53. java.lang.Object readResolve();
  54. }
  55. -dontwarn com.google.gson.**
  56. ################httpmime/httpcore##########
  57. -libraryjars libs/httpcore-4.3.2.jar
  58. -libraryjars libs/httpmime-4.3.5.jar
  59. -keep class org.apache.http.** {*;}
  60. -dontwarn org.apache.http.**
  61. ####################jpush##################
  62. -libraryjars libs/jpush-sdk-release1.7.1.jar
  63. -keep class cn.jpush.** { *; }
  64. -keep public class com.umeng.fb.ui.ThreadView { } #双向反馈功能代码不混淆
  65. -dontwarn cn.jpush.**
  66. -keepclassmembers class * {
  67. public <init>(org.json.JSONObject);
  68. }
  69. #不混淆R类
  70. -keep public class com.jph.android.R$*{
  71. public static final int *;
  72. }
  73. -keepclassmembers enum * {
  74. public static **[] values();
  75. public static ** valueOf(java.lang.String);
  76. }
  77. ####################umeng##################
  78. -libraryjars libs/umeng-analytics-v5.2.4.jar
  79. -keep class com.umeng.analytics.** {*;}
  80. -dontwarn com.umeng.analytics.**
  81. #-keep public class * extends com.umeng.**
  82. #-keep public class * extends com.umeng.analytics.**
  83. #-keep public class * extends com.umeng.common.**
  84. #-keep public class * extends com.umeng.newxp.**
  85. -keep class com.umeng.** { *; }
  86. -keep class com.umeng.analytics.** { *; }
  87. -keep class com.umeng.common.** { *; }
  88. -keep class com.umeng.newxp.** { *; }
  89. -keepclassmembers class * {
  90. public <init>(org.json.JSONObject);
  91. }
  92. -keep class com.umeng.**
  93. -keep public class com.idea.fifaalarmclock.app.R$*{
  94. public static final int *;
  95. }
  96. -keep public class com.umeng.fb.ui.ThreadView {
  97. }
  98. -dontwarn com.umeng.**
  99. -dontwarn org.apache.commons.**
  100. -keep public class * extends com.umeng.**
  101. -keep class com.umeng.** {*; }
  102. ####################universal-image-loader########
  103. -libraryjars libs/universal-image-loader-1.9.3.jar
  104. -keep class com.nostra13.universalimageloader.** {*;}
  105. -dontwarn com.nostra13.universalimageloader.**
  106. ####################zxing#####################
  107. -libraryjars libs/zxing.jar
  108. -libraryjars libs/zxing_apply.jar
  109. -keep class com.google.zxing.** {*;}
  110. -dontwarn com.google.zxing.**
  111. ####################BASE64Decoder##################
  112. -libraryjars libs/sun.misc.BASE64Decoder.jar
  113. ####################support.v4#####################
  114. -libraryjars libs/android-support-v4.jar
  115. -keep class android.support.v4.** { *; }
  116. -dontwarn android.support.v4.**
  117. ###################other####################
  118. # slidingmenu 的混淆
  119. -dontwarn com.jeremyfeinstein.slidingmenu.lib.**
  120. -keep class com.jeremyfeinstein.slidingmenu.lib.** { *; }
  121. # ActionBarSherlock混淆
  122. -dontwarn com.actionbarsherlock.**
  123. -keep class com.actionbarsherlock.** { *; }
  124. -keep interface com.actionbarsherlock.** { *; }
  125. -keep class * extends java.lang.annotation.Annotation { *; }
  126. -keepclasseswithmembernames class * {
  127. native <methods>;
  128. }
  129. -keep class com.jph.android.entity.** {
  130. <fields>;
  131. <methods>;
  132. }
  133. -dontwarn android.support.**
  134. -dontwarn com.slidingmenu.lib.app.SlidingMapActivity
  135. -keep class android.support.** { *; }
  136. -keep class com.actionbarsherlock.** { *; }
  137. -keep interface com.actionbarsherlock.** { *; }
  138. -keep class com.slidingmenu.** { *; }
  139. -keep interface com.slidingmenu.** { *; }

推荐阅读:《Android开发之反编译与防止反编译

Android代码混淆指南

时间: 2024-10-25 20:35:17

【转】 Android代码混淆之混淆规则的相关文章

android代码签名和混淆打包

研究了一下android的apk的签名和代码的混淆打包,如果不混淆打包,那么apk可以直接被人反编译出来查看源码,混淆打包虽然还是能看懂,但是没有那么好懂了,至少要话费些时间 如果不混淆,反编译后的代码如下: 基本上就是源码. 如果混淆后,反编译后的代码如下: 代码中出现很多的a.b.c之类的变量命名,所以要读懂就具有一定的困难了! 下面先说一下apk的签名: 1.apk签名必须先弄一个key,如何生成key呢?那么就要运用jdk来生成. 首先必须把jdk在系统环境变量中配置好.这个就不多说了,

Android代码混淆防反编译解决方案研究

做Android开发的都知道要做混淆去防apk被反编译.破解,通过proguard进行Java代码混淆.但是,Android代码混淆真的能起到实质性的作用吗?看下面分析 1.Android代码混淆 如上图,对Android 代码进行混淆后混淆器将代码中的所有变量.函数.类的名称加密为简短的英文字母代号,在APP被破解后增加破解者对代码的阅读难度. 但是混淆的功效只能运作在APP已经被破解后,而且只是增加破解者的难度时间,对其防止破解的作用意义不是很大. 那么,Android代码混淆不能从根本上防

Android代码混淆之混淆规则

请尊重他人的劳动成果,转载请注明出处:<Android代码混淆技巧> 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆.SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看. ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器.它可以检测并删除未使用的类,字段,方法和属性.它可以优化字节码,并删除未使用的指令.它可以将类.字段和方法使用短无意义的名称进行重命名.最后,预校验的Jav

Android 代码混淆规则

1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器.它可以检测并删除未使用的类,字段,方法和属性.它可以优化字节码,并删除未使用的指令.它可以将类.字段和方法使用短无意义的名称进行重命名.最后,预校验的Java6或针对Java MicroEdition的所述处理后的码.如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,

【转】Android代码混淆指南

请尊重他人的劳动成果,转载请注明出处:<Android代码混淆指南> 本文将和大家分享使用Eclipse+ADT与使用Android Studio进行代码混淆打包的方法. 使用Eclipse+ADT进行代码混淆打包的方法 新版本SDK下进行打包混淆 如果使用新版本的SDK创建的Android项目会在项目的根目录下生成一个proguard-project.txt文件,该文件是默认的混淆规则文件. 混淆打包的步骤: 1.在proguard-project.txt文件中添加混淆的项目规则,大家可参考

Android代码混淆指南

请尊重他人的劳动成果,转载请注明出处:<Android代码混淆指南> 本文将和大家分享使用Eclipse+ADT与使用Android Studio进行代码混淆打包的方法. 使用Eclipse+ADT进行代码混淆打包的方法 新版本SDK下进行打包混淆 如果使用新版本的SDK创建的Android项目会在项目的根目录下生成一个proguard-project.txt文件,该文件是默认的混淆规则文件. 混淆打包的步骤: 1.在proguard-project.txt文件中添加混淆的项目规则,大家可参考

Android代码混淆及项目发布步骤记录

本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. 一.清理代码中的调试信息,如Log.System.out 二.在清单文件中修改版本为当前版本,如果需要更新数据库,则需要在配置类或配置文件中修改程序数据库版本. 三.在清单文件中将项目的debugable设置为false 四.创建签名证书keystore文件 五.在项目中的project.properites文件中添加语句proguard.config=proguard-project.txt来

Android代码混淆及项目发布方法记录

 Android代码混淆及项目发布步骤记录 本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. Android代码混淆及项目发布步骤记录 一.清理代码中的调试信息,如Log.System.out 二.在清单文件中修改版本为当前版本,如果需要更新数据库,则需要在配置类或配置文件中修改程序数据库版本. 三.在清单文件中将项目的debugable设置为false 四.创建签名证书keystore文件 五.在项目中的project.properite

Android代码混淆和项目宣布步骤记录器

原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System.out 二.在清单文件里改动版本号为当前版本号,假设须要更新数据库,则须要在配置类或配置文件里改动程序数据库版本号. 三.在清单文件里将项目的debugable设置为false 四.创建签名证书keystore文件 五.在项目中的project.properites文件里加入语句proguard.c