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中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-
- Android开发中的代码混淆
- android中的代码混淆
- Android 中的代码混淆
- Android 中的代码混淆
- Android 中的代码混淆
- android开发--代码混淆
- android开发-----代码混淆
- 读懂 Android 中的代码混淆
- 读懂 Android 中的代码混淆
- Android中的代码混淆详解
- Android Studio中的代码混淆
- 读懂 Android 中的代码混淆
- Android开发之代码混淆
- eclipse Android开发代码混淆
- Android开发之代码混淆
- Android开发之代码混淆
- Android开发(45) android代码混淆
- Android应用开发之代码混淆
- Codeforces 888A Local Extrema
- JDK源码中使用的设计模式-总结
- 【tensorflow 学习】tf.get_variable()和tf.Variable()的区别
- 辗转相除法求两个整数的最大公约数
- 二叉树的建立,前序,中序,后序遍历
- Android开发中的代码混淆
- nuc972的ramfs的配置yaffs2,ubi文件系统
- muduo库源码学习(base):Logfile
- 集合类操作优化经验总结
- 改善程序员生活质量的 3+10 习惯
- HDU1754 I hate it 线段树 最大值
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink实战基础0012--flink分布式部署007
- 关于博客笔记大汇总,持续更新迭代
- 在VS2013中添加QT的信号和槽功能