当前位置:   article > 正文

Android代码混淆_android 混淆 debug

android 混淆 debug

一、代码混淆作用:

  1. 防止反编译;
  2. 精简编译后的apk文件大小;

二、开启混淆:

  • 在项目的build.gradle中开启混淆:

  • 将minifyEnabled的值改为true即开启:其中debug为测试版本,release为发布版本

三、混淆说明:

开启混淆后Android会用自带的混淆进行代码混淆,如在安装Android SDK的目录下的proguard-android.txt或proguard-android-optimize.txt文件为默认混淆文件。对于自己定义的混淆需要在proguard-rules.pro文件中进行配置:

1、常用命令

命令作用
-keep防止该类所有内容被移除或重命名
-keepnames防止类和成员被重命名
-keepclassmembers防止成员被移除或者被重命名
-keepclasseswithmembers防止拥有该成员的类和成员被移除或者被重命名
-keepclasseswithmembernames防止拥有该成员的类和成员被重命名

2. 常用规则

  • 类:需要使用完全限定名;

  • *:通配符,任意字符串,不包含包名分隔符(.);

  • **:通配符,任意字符串,包含包名分隔符(.);

  • extends:继承某类的类;

  • implement:实现某接口的类;

  • $:内部类;

  • <init>:所有构造方法;

  • <fields>:所有成员变量;

  • <methods>:所有方法;

  • …:任意参数;

  • 修饰符:public private protected

3. 例子

含义指令语句
不混淆某个类-keep public class packageName.className{ *; }
不混淆某个包的所有类-keep class packageName.**{ *; }
不混淆某个类的子类-keep public class * extends packageName.className{ *; }
不混淆某个接口的子类-keep public class * implements packageName.className{ *; }
不混淆某个类的构造方法-keepclassmembers class packageName.className{ public <init style="box-sizing: border-box;">(); }</init>
不混淆某个类的某个方法-keepclassmembers class packageName.className{ public void methodName(…); }
不混淆某个类的内部类-keep class packageName.className$*{ *; }

四、自定义混淆模板:

将报错的或者自己不需要的删除即可,然后在最后添加自己不需要混淆的代码:

  1. #---------这里提供一份这个lib中最好不要混淆的地方,前边的配置都差不多,主要是第三方包以及其他不需要混淆的代码----
  2. #---------------------------------基本指令以及一些固定不混淆的代码--开始--------------------------------
  3. #<基本指令>
  4. -optimizationpasses 5
  5. -dontskipnonpubliclibraryclassmembers
  6. -optimizations !code/simplification/cast,!field/*,!class/merging/*
  7. -keepattributes *Annotation*,InnerClasses
  8. -keepattributes Signature
  9. -keepattributes SourceFile,LineNumberTable
  10. #忽略警告
  11. -ignorewarning
  12. #记录生成的日志数据,gradle build时在本项目根目录输出apk 包内所有 class 的内部结构
  13. -dump class_files.txt
  14. #未混淆的类和成员
  15. -printseeds seeds.txt
  16. #列出从 apk 中删除的代码
  17. -printusage unused.txt
  18. #混淆前后的映射
  19. -printmapping mapping.txt
  20. #</基本指令>
  21. #<基础>
  22. -keep public class * extends android.app.Activity
  23. -keep public class * extends android.app.Application
  24. -keep public class * extends android.support.multidex.MultiDexApplication
  25. -keep public class * extends android.app.Service
  26. -keep public class * extends android.content.BroadcastReceiver
  27. -keep public class * extends android.content.ContentProvider
  28. -keep public class * extends android.app.backup.BackupAgentHelper
  29. -keep public class * extends android.preference.Preference
  30. -keep public class * extends android.view.View
  31. -keep public class com.android.vending.licensing.ILicensingService
  32. -keep class android.support.** {*;}
  33. #</基础>
  34. #<view相关>
  35. -keep public class * extends android.view.View{
  36. *** get*();
  37. void set*(***);
  38. public <init>(android.content.Context);
  39. public <init>(android.content.Context, android.util.AttributeSet);
  40. public <init>(android.content.Context, android.util.AttributeSet, int);
  41. }
  42. -keepclasseswithmembers class * {
  43. public <init>(android.content.Context, android.util.AttributeSet);
  44. public <init>(android.content.Context, android.util.AttributeSet, int);
  45. }
  46. -keepclassmembers class * {
  47. public void *(android.view.View);
  48. }
  49. #</view相关>
  50. #<Serializable、Parcelable>
  51. -keepclassmembers class * implements java.io.Serializable {
  52. static final long serialVersionUID;
  53. private static final java.io.ObjectStreamField[] serialPersistentFields;
  54. private void writeObject(java.io.ObjectOutputStream);
  55. private void readObject(java.io.ObjectInputStream);
  56. java.lang.Object writeReplace();
  57. java.lang.Object readResolve();
  58. }
  59. -keep public class * implements java.io.Serializable {*;}
  60. -keep class * implements android.os.Parcelable {
  61. public static final android.os.Parcelable$Creator *;
  62. }
  63. #</Serializable、Parcelable>
  64. #<R文件>
  65. -keep class **.R$* {
  66. *;
  67. }
  68. #</R文件>
  69. #<enum>
  70. -keepclassmembers enum * {
  71. public static **[] values();
  72. public static ** valueOf(java.lang.String);
  73. }
  74. #</enum>
  75. #<natvie>
  76. -keepclasseswithmembernames class * {
  77. native <methods>;
  78. }
  79. #</natvie>
  80. #---------------------------------基本指令以及一些固定不混淆的代码--结束-----------
  81. #---------------------------------第三方包--开始-------------------------------
  82. #<okhttp3.x>
  83. -dontwarn com.squareup.okhttp3.**
  84. -keep class com.squareup.okhttp3.** { *;}
  85. -dontwarn okio.**
  86. #</okhttp3.x>
  87. #<retrofit2.x>
  88. -dontnote retrofit2.Platform
  89. -dontwarn retrofit2.Platform$Java8
  90. -keepattributes Signature
  91. -keepattributes Exceptions
  92. -dontwarn okio.**
  93. #</retrofit2.x>
  94. #</okhttp3.x>
  95. #<ButterKnife 7.0 以上>
  96. -keep class butterknife.** { *; }
  97. -dontwarn butterknife.internal.**
  98. -keep class **$$ViewBinder { *; }
  99. -keepclasseswithmembernames class * {
  100. @butterknife.* <fields>;
  101. }
  102. -keepclasseswithmembernames class * {
  103. @butterknife.* <methods>;
  104. }
  105. #</ButterKnife 7.0 以上>
  106. #<eventbus 3.0>
  107. -keepattributes *Annotation*
  108. -keepclassmembers class ** {
  109. @org.greenrobot.eventbus.Subscribe <methods>;
  110. }
  111. -keep enum org.greenrobot.eventbus.ThreadMode { *; }
  112. -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
  113. <init>(java.lang.Throwable);
  114. }
  115. #</eventbus 3.0>
  116. #<Gson>
  117. -keep class com.google.gson.** {*;}
  118. -keep class com.google.**{*;}
  119. -keep class sun.misc.Unsafe { *; }
  120. -keep class com.google.gson.stream.** { *; }
  121. -keep class com.google.gson.examples.android.model.** { *; }
  122. #</Gson>
  123. #<glide>
  124. -keep public class * implements com.bumptech.glide.module.GlideModule
  125. -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  126. **[] $VALUES;
  127. public *;
  128. }
  129. #</glide>
  130. #<Rxjava RxAndroid>
  131. -dontwarn rx.*
  132. -dontwarn sun.misc.**
  133. -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
  134. long producerIndex;
  135. long consumerIndex;
  136. }
  137. -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
  138. rx.internal.util.atomic.LinkedQueueNode producerNode;
  139. }
  140. -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
  141. rx.internal.util.atomic.LinkedQueueNode consumerNode;
  142. }
  143. #</Rxjava RxAndroid>
  144. #----------------------------------第三方包--结束--------------------------
  145. #---------------------------------一些不要混淆的代码--开始-------------------
  146. -keep class net.arvin.afbaselibrary.nets.** { *; }
  147. -keep class net.arvin.afbaselibrary.data.** { *; }
  148. #<反射>
  149. -keep class net.arvin.afbaselibrary.nets.BaseNet{*;}
  150. #</反射>
  151. #<js>
  152. #</js>
  153. #<自定义View的类>
  154. -keep class net.arvin.afbaselibrary.ui.views.** {*;}
  155. #</自定义View的类>
  156. #---------------------------------一些不要混淆的代码--结束-------------------

五、编译aar文件或apk文件:

因为我们提供给别人的一般都是release版本的库,所以要在build.gradle中开启release版代码混淆,配置好混淆规则后在Android studio的Terminal界面输入:gradlew assembleRelease回车进行编译打包,如果编译失败则检查配置的混淆规则。成功后即可得到混淆后的aar或apk文件:

六、注意事项:

混淆时对外暴露的接口层不能混淆,实体类不能混淆。

七、参考文章:

  1. https://www.jianshu.com/p/252759ca6042
  2. https://blog.csdn.net/github_30662571/article/details/70921710
  3. http://www.androidchina.net/8367.html
  4. https://www.jianshu.com/p/d1cbe2fdb82c
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/285610
推荐阅读
相关标签
  

闽ICP备14008679号