版权声明:--------------------------------------------博文可随意转载,但请注明出处,谢谢!-------------------------------------------- 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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-