项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。

Android 中通过ProGuard 来混淆Java代码,仅仅是混淆java代码。它是无法混淆Native代码,资源文件drawable、xml等文件。

ProGuard作用

  1. 压缩: 移除无效的类、属性、方法等
  2. 优化: 优化字节码,并删除未使用的结构
  3. 混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c;

不能混淆

 

  1. 在AndroidManifest中配置的类,比如四大组件
  2. JNI调用的方法
  3. 反射用到的类
  4. WebView中JavaScript调用的方法
  5. Layout文件引用到的自定义View
  6. 一些引入的第三方库(一般都会有混淆说明的)

要做混淆,首先在build.gradle文件中把 minfyEnabled false 改成 true


buildTypes {        release {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}

之后打开 proguard-rules.pro 文件  加以下代码:

1:基本指令区

-optimizationpasses 5          # 指定代码的压缩级别-dontusemixedcaseclassnames   # 是否使用大小写混合-dontskipnonpubliclibraryclassmembers  #指定不去忽略非公共的库的类-dontpreverify           # 混淆时是否做预校验-verbose                # 混淆时是否记录日志-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法

2:通用混淆配置

-keep public class * extends android.app.Activity-keep public class * extends android.support.v7.app.AppCompatActivity-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 * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.** {*;} -keepclasseswithmembernames class * {  native ; } -keepclassmembers class * extends android.app.Activity{  public void *(android.view.View); } -keepclassmembers enum * {  public static **[] values();  public static ** valueOf(java.lang.String); } -keep public class * extends android.view.View{  *** get*();  void set*(***);  public (android.content.Context);  public (android.content.Context, android.util.AttributeSet);  public (android.content.Context, android.util.AttributeSet, int); } -keepclasseswithmembers class * {  public (android.content.Context, android.util.AttributeSet);  public (android.content.Context, android.util.AttributeSet, int); } -keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *; } -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(); } -keep class **.R$* {  *; } -keepclassmembers class * {  void *(**On*Event); } #---------------------------------webview------------------------------------ -keepclassmembers class fqcn.of.javascript.interface.for.Webview {  public *; } -keepclassmembers class * extends android.webkit.WebViewClient {  public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);  public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient {  public void *(android.webkit.WebView, jav.lang.String); }

3:实体类

-keep class com.demo.login.bean.** { *; } -keep class com.demo.main.bean.** { *; } 

 

 

4:第三方包  以 glide butterknife 为例  一般官网都会有混淆代码,去把他们官网的混淆代码Copy下来就可以了 

 

-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {**[] $VALUES;public *;}-keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keep class **$$ViewInjector { *; } -keepclasseswithmembernames class * {  @butterknife.* ; } -keepclasseswithmembernames class * {  @butterknife.* ; }

5:与js互相调用的类

-keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface {  ; } 

 当然也还有其他的 反射相关的类和方法  具体情况根据自己的项目而定。

现在可以混淆打包 ,在用反编译工具看看Java代码是不是反编译了;其他需求可以留言讨论


更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. Android(安卓)AndroidManifest 清单文件以及权限详解
  7. Android的SurfaceView使用
  8. Android下的实现对本地指定和筛选文件的目录显示
  9. Android(安卓)屏幕截图 代码

随机推荐

  1. Android Activity 常用功能设置(全屏、横
  2. android中apk反编译
  3. Android 图像处理资料
  4. Android 获取控件宽高
  5. android发送短信
  6. Android常用组件,太全了
  7. Android——Notification 通知类 (适配 An
  8. android 将图片转换成黑白图片
  9. Android 默认全面屏适配方案
  10. Android manifest属性