版权声明:本文为HaiyuKing原创文章,转载请注明出处!html
为何须要代码混淆呢?缘由很简单,你的apk很容易被反编译出来,你写的代码都会被看到,所以咱们须要在编译过程当中对代码进行必定程度的混淆,使得别人不能反编译不出你的代码。android
新建一个项目,Android Studio默认关闭代码混淆开关,在build.gradle文件中,minifyEnabled 开关默认为false,所以若是须要混淆代码,需将false改成true,而后在文件proguard-rules.pro添加具体混淆规则。算法
经常使用的混淆规则json
#==================================API================================================= #API里边的类,最好都要避免混淆 -keep public class * extends android.app.Fragment -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.support.v4.** -keep public class com.android.vending.licensing.ILicensingService -dontwarn android.annotation -keepattributes *Annotation* #=====================保留了全部的Native变量名及类名===================== -keepclasseswithmembernames class * { native <methods>; } #某些构造方法不能去混淆 -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } #枚举类不能去混淆 -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #aidl文件不能去混淆. -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class * { public <init>(org.json.JSONObject); } #=====================不混淆资源类===================== -keepclassmembers class **.R$* { public static <fields>; } #过滤R文件的混淆: -keep class **.R$* { *; } #=================================当前项目================================================== #通常model最好避免混淆(model可有可无,不混淆也没多大关系)如: #-keep class com.why.project.helloworld.bean.**{*;} #===================================其余常规================================================ #加上这句话,否则会在控制台中报warning警告【不添加的话比较好,能够用来验证签名是否成功】 #-ignorewarnings #设置混淆的压缩比率 0 ~ 7 -optimizationpasses 5 #Aa aA -dontusemixedcaseclassnames #混淆后生产映射文件 map 类名->转化后类名的映射 -verbose #混淆采用的算法. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
解决方法以下:app
打开 proguard-rules.cfg文件ide
在全部的-libraryjars 前插入 # 变成 #-libraryjars xxxx.jarpost
缘由是build.gradle文件配置了gradle
旧版本:ui
新版本:url
里面已经添加过jar包,经过 proguard 混淆代码时默认已经将 lib目录中的 jar 都已经添加到打包脚本中,因此不须要再次手动添加。