Android开发中的代码混淆

来源:互联网 发布:系统交互流程图软件 编辑:程序博客网 时间:2024/06/07 01:22

编写不易,如有转载,请声明出处: 梦回河口: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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-

原创粉丝点击