Android开发中的代码混淆

版权声明:--------------------------------------------博文可随意转载,但请注明出处,谢谢!-------------------------------------------- https://blog.csdn.net/zxc514257857/article/details/78533913

编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/78533913

前言

  代码混淆是在apk功能基本开发完成后进行的代码保护操作,混淆后的apk通过dex转jar进行反编译后,混淆部分的类名、方法名全部为英文字母,使反编译者难以理解代码,达到代码保护的目的

gradle文件配置

  项目的build.gradle文件配置如下:

buildTypes {
    release {
        // 打开混淆
        minifyEnabled true
        // 加载默认混淆配置文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        // 签名
        signingConfig signingConfigs.release
        // 移除无用的resourse资源
        shrinkResources true
        // Zipalign优化
        zipAlignEnabled true
    }
    debug {
        // 签名
        signingConfig signingConfigs.release
    }
}

  在打Release包时配置混淆即可,打debug包时打开混淆,时间较慢,降低调试效率

proguard-rules文件配置

  在项目的build.gradle文件配置了加载默认混淆配置文件路径为项目中的proguard-rules.pro。proguard-rules文件配置参考了: 5分钟搞定android混淆 这篇文件,写得简单易懂,值得参考
  以下是我的配置内容:

#-------------------------------------------定制化区域----------------------------------------------
#---------------------------------1.实体类---------------------------------
-keep class com.zhumei.commercialscreen.bean.** { *; }

#-------------------------------------------------------------------------

#---------------------------------2.第三方包-------------------------------
# Okhttputils
-dontwarn com.zhy.http.**
-keep class com.zhy.http.**{*;}

# Okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}

# Okio
-dontwarn okio.**
-keep class okio.**{*;}

# SwipeRecyclerView
-keepclasseswithmembers class android.support.v7.widget.RecyclerView$ViewHolder {
   public final View *;
}

# Filedownloader
# Percent-support-extends
# IjkPlayer

# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# Butterknife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-dontwarn butterknife.internal.ButterKnifeProcessor.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson    Gson需要配置的javaBean目录,在实体类中已经配置
# -keep class com.google.gson.examples.android.model.** { *; }

#-------------------------------------------------------------------------

#---------------------------------3.与js互相调用的类------------------------



#-------------------------------------------------------------------------

#---------------------------------4.反射相关的类和方法-----------------------



#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
# 指定代码的压缩级别,0-7之间
-optimizationpasses 5
# 混淆后类名均为小写
-dontusemixedcaseclassnames
# 不去忽略非公共的库和类
-dontskipnonpubliclibraryclasses
# 不优化输入的类文件
-dontoptimize
# 不去预校验
-dontpreverify
# 生成原类名和混淆后的类名的映射文件
-verbose
-printmapping proguardMapping.txt
# 混淆时所采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 不混淆注解和内部类
-keepattributes *Annotation*,InnerClasses
# 不混淆泛型 如果混淆报错建议关掉
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------默认保留区---------------------------------
-keep public class * extends android.app.Activity
-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 <methods>;
}
-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 <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(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);
}
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

打包测试

  以上配置完成之后,即可打Release包测试混淆是否成功,在打Release包的时候可能会出现报错情况,比如:

java.io.FileNotFoundException: ...\proguard-rules\release\aapt_rules.txt (系统找不到指定的路径)

  遇到这种情况需在菜单栏选择build –> Clean Project ,然后再build –> Make Project即可,然后就能在这个路径下找到这个aapt_rules.txt文件了,再次混淆就不会报同样错误了

  如果混淆没有报错就可以通过反编译代码,将dex转jar后,查看混淆过的类和方法名是否变为字母来判断是否混淆成功,如图:
这里写图片描述

这里写图片描述

反编译工具下载请移步:http://download.csdn.net/download/zxc514257857/10118640


———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-

猜你喜欢

转载自blog.csdn.net/zxc514257857/article/details/78533913
今日推荐