android之代码混淆

项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小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代码是不是反编译了;其他需求可以留言讨论


你可能感兴趣的:(Android)