【Android Studio安装部署系列】十二、Android studio代码混淆

版权声明:本文为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 都已经添加到打包脚本中,所以不需要再次手动添加。

参考资料

Android Studio 代码混淆

 

posted @ 2018-06-03 10:33  HaiyuKing  阅读(782)  评论(0编辑  收藏  举报