版权声明:本文为HaiyuKing原创文章,转载请注明出处!
概述
为什么需要代码混淆呢?原因很简单,你的apk很容易被反编译出来,你写的代码都会被看到,因此我们需要在编译过程中对代码进行一定程度的混淆,使得别人不能反编译不出你的代码。
新建一个项目,Android Studio默认关闭代码混淆开关,在build.gradle文件中,minifyEnabled 开关默认为false,因此如果需要混淆代码,需将false改为true,然后在文件proguard-rules.pro添加具体混淆规则。
开启代码混淆
在文件proguard-rules.pro添加具体混淆规则
常用的混淆规则
#==================================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/*
The same input jar is specified twice 解决办法
解决方法如下:
打开 proguard-rules.cfg文件
在所有的-libraryjars 前插入 # 变成 #-libraryjars xxxx.jar
原因是build.gradle文件配置了
旧版本:
新版本:
里面已经添加过jar包,通过 proguard 混淆代码时默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加。