当前位置:   article > 正文

最简单的用Android Studio实现代码混淆(ProGuard)_android studio 混淆

android studio 混淆

ProGuard使用

由于Android SDK 中已经集成了该工具,所以可以直接开启混淆即可。

  1. buildTypes {
  2. release {
  3. minifyEnabled true
  4. zipAlignEnabled true
  5. shrinkResources true
  6. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  7. }
  8. }

minifyEnabled: 混淆开关,默认为 false
zipAlignEnabled : zipAlign优化,默认为 true。一般我们打包之后先得到xxx-unaligned.apk,开启这个之后才得到最终的xxx-aligned.apk
shrinkResources :移除无用resources文件(需要保证minifyEnabled开启)
proguardFiles: 混淆配置文件。可添加多个,因为Gradle会在构建的时候对文件进行合并操作。
proguard-rules.pro:对应module下的proguard-rules.pro文件。
getDefaultProguardFile:这个函数指向的路径是<SDK_HOME>/tools/proguard文件夹,如下图:


 我们可以通过在module下面的proguard-rules.pro文件中,对混淆配置进行扩展,以适用自己的项目。下面总结出一个模板,里面包含常用的混淆配置含义,按需添加即可:

  1. # -allowaccessmodification
  2. # -optimizationpasses 5
  3. # -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
  4. # 不进行优化。优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行
  5. -dontoptimize
  6. # 混合时不使用大小写混合,混合后的类名为小写
  7. -dontusemixedcaseclassnames
  8. # 不跳过library中的非public的类
  9. -dontskipnonpubliclibraryclasses
  10. # 不跳过library中的非public的类成员
  11. -dontskipnonpubliclibraryclassmembers
  12. # 在处理时打印冗长的信息
  13. -verbose
  14. # 不做预校验,preverify是proguard的四个步骤之一,Android平台不需要preverify,去掉这一步能够加快混淆速度
  15. -dontpreverify
  16. # 保留异常表,以便编译器知道哪些异常可能被抛出
  17. # 保留InnerClasses,否则外部无法引用内部类
  18. # 保留Signature,否则无法访问泛型
  19. -keepattributes Exceptions,SourceFile,LineNumberTable,EnclosingMethod,Signature,*Annotation*,InnerClasses,Deprecated
  20. ################################## 需要保留的公共部分 ##################################
  21. # 保留四大组件,自定义的Application等等这些类不被混淆
  22. -keep public class * extends android.app.Activity
  23. -keep public class * extends android.app.Appliction
  24. -keep public class * extends android.app.Service
  25. -keep public class * extends android.content.BroadcastReceiver
  26. -keep public class * extends android.content.ContentProvider
  27. -keep public class * extends android.app.backup.BackupAgentHelper
  28. -keep public class * extends android.preference.Preference
  29. -keep public class * extends android.view.View
  30. -keep public class com.android.vending.licensing.ILicensingService
  31. # 保留support包下的所有类及其内部类
  32. -keep class android.support.** {*;}
  33. # 保留继承的
  34. -keep public class * extends android.support.v4.**
  35. -keep public class * extends android.support.v7.**
  36. -keep public class * extends android.support.annotation.**
  37. # 保留R下面的资源
  38. -keep class **.R$* {*;}
  39. # 保留本地native方法不被混淆
  40. -keepclasseswithmembernames class * {
  41. native <methods>;
  42. }
  43. # 保留在Activity中的方法参数是view的方法,
  44. # 这样以来我们在layout中写的onClick就不会被影响
  45. -keepclassmembers class * extends android.app.Activity{
  46. public void *(android.view.View);
  47. }
  48. # 保留枚举类不被混淆
  49. -keepclassmembers enum * {
  50. public static **[] values();
  51. public static ** valueOf(java.lang.String);
  52. }
  53. # 保留我们自定义控件(继承自View)不被混淆
  54. -keep public class * extends android.view.View{
  55. *** get*();
  56. void set*(***);
  57. public <init>(android.content.Context);
  58. public <init>(android.content.Context, android.util.AttributeSet);
  59. public <init>(android.content.Context, android.util.AttributeSet, int);
  60. }
  61. # 保留Parcelable序列化类不被混淆
  62. -keep class * implements android.os.Parcelable {
  63. public static final android.os.Parcelable$Creator *;
  64. }
  65. # 保留Serializable序列化的类不被混淆
  66. -keepclassmembers class * implements java.io.Serializable {
  67. static final long serialVersionUID;
  68. private static final java.io.ObjectStreamField[] serialPersistentFields;
  69. !static !transient <fields>;
  70. !private <fields>;
  71. !private <methods>;
  72. private void writeObject(java.io.ObjectOutputStream);
  73. private void readObject(java.io.ObjectInputStream);
  74. java.lang.Object writeReplace();
  75. java.lang.Object readResolve();
  76. }
  77. # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
  78. -keepclassmembers class * {
  79. void *(**On*Event);
  80. void *(**On*Listener);
  81. }
  82. #-----------WebView处理---------------
  83. # 项目中没有使用到WebView忽略即可
  84. -keepclassmembers class fqcn.of.javascript.interface.for.webview {
  85. public *;
  86. }
  87. -keepclassmembers class * extends android.webkit.WebViewClient {
  88. public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
  89. public boolean *(android.webkit.WebView, java.lang.String);
  90. }
  91. -keepclassmembers class * extends android.webkit.WebViewClient {
  92. public void *(android.webkit.WebView, jav.lang.String);
  93. }
  94. #-----------处理js交互---------------
  95. #-----------处理反射类---------------
  96. #-----------处理实体类---------------
  97. # 在开发的时候我们可以将所有的实体类放在一个包内,这样我们写一次混淆就行了。
  98. -keep public class com.upd.proguard.bean.** {
  99. public void set*(***);
  100. public *** get*();
  101. public *** is*();
  102. }
  103. #-----------处理第三方依赖库---------

当然,很多博客中也都有类似的模板供大家参考。这里在注释的地方给出了配置的含义。需要特别注意的是开头几个被注释掉的混淆配置,可根据需要选择配置:

  1. # 是否允许放宽类、类成员的访问限定符
  2. # -allowaccessmodification
  3. # 优化的步骤数,默认1步,如果发现没有可优化的,后续步骤自动省略
  4. # -optimizationpasses 5
  5. # 指定混淆是采用的算法
  6. # -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*

以上,就是只改了app目录中的【build.gradle】,app目录中的【proguard-rules.pro】两个文件。

然后就可以打包成apk了,这个时候打包出来的apk,就是已经混淆了,用mt管理器查看dex源码时,发现里面全是abcdefg,根本没法正常阅读,增加了代码的可阅读性难度,就难以被破解了。

本文转载自:http://www.jianshu.com/p/7371952ae006

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/285596
推荐阅读
相关标签
  

闽ICP备14008679号