• 【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 代码混淆

  • 相关阅读:
    explicit构造函数
    Windows内核编程之:结构化异常处理
    驱动对象DRIVER_OBJECT
    Windows内核编程之:内存管理
    Windows内核编程之:链表
    Windows内核编程之:返回状态值
    设备对象DEVICE_OBJECT
    数据恢复
    Windows内核编程之:数据类型
    Windows内核编程之:检查内存的可用性
  • 原文地址:https://www.cnblogs.com/whycxb/p/9093157.html
Copyright © 2020-2023  润新知