组件统一混淆方案

开启混淆

buildTypes {
    release {
        minifyEnabled true
        ...
    }}
复制代码

组件配置

consumerProguardFilesproguardFiles 的区别:

  • consumerProguardFiles 配置的proguard会打进aar,proguardFiles 配置的proguard不会打进aar
  • proguardFiles 配置的proguard只作用于库文件代码,在编译发布aar时生效,当library作为一个module依赖到app模块时,consumerProguardFiles 配置的proguard会追加到app模块的proguard配置中

组件混淆规则请编写在 proguard-rules.pro 文件中

请组件负责人编写具体的混淆规则

android {
    ...
    defaultConfig {
        ...
        consumerProguardFiles "consumer-rules.pro"
    }
    
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}    
复制代码

常用命令

更多用法,参考官网

命令 作用
dontwarn 通常与keep同时出现,尤其在引入library时,为了忽略library的警告保证build正常进行
keep 保留类和类中的成员,防止被重命名或移除
keepnames 保留类和类中的成员,防止被重命名,成员没有被引用会被移除
keepclassmembers 只保留类中的成员,防止被重命名或移除
keepclassmembernames 只保留类中的成员,防止被重命名,成员没有引用会被移除
keepclasseswithmembers 保留拥有该成员的类和成员,防止被重命名或移除
keepclasseswithmembernames 保留拥有该成员的类和成员,防止被重命名
[保持命令] [类] {
    [成员]
}
复制代码

“类”代表类相关的限定条件,它将最终定位到某些符合该限定条件的类。它的内容可以使用:

  • 具体的类
  • 访问修饰符(public、protected、private)
  • 通配符*,匹配任意长度字符,但不含包名分隔符(.)
  • 通配符**,匹配任意长度字符,并且包含包名分隔符(.)
  • extends,即可以指定类的基类
  • implement,匹配实现了某接口的类
  • $,内部类

“成员”代表类成员相关的限定条件,它将最终定位到某些符合该限定条件的类成员。它的内容可以使用:

  • <init> 匹配所有构造器
  • <fields> 匹配所有成员变量
  • <methods> 匹配所有方法
  • 通配符*,匹配任意长度字符,但不含包名分隔符(.)
  • 通配符**,匹配任意长度字符,并且包含包名分隔符(.)
  • 通配符***,匹配任意参数类型
  • …,匹配任意长度的任意类型参数。比如void test(…)就能匹配任意 void test(String a) 或者是 void test(int a, String b) 这些方法。
  • 访问修饰符(public、protected、private)

通用配置

一般写在主工程

# --------------------------------- 基本指令区 ----------------------------------
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify
-printmapping proguardMapping.txt
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# ----------------------------------------------------------------------------

# --------------------------------- 默认保留区 ---------------------------------
-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.app.View
-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 * extends java.lang.Throwable {*;}
-keep public class * extends java.lang.Exception {*;}
-keep class android.support.** {*;}

# --------------------------------- 不优化Parcelable的实现类 ---------------------------------
-keep class * implements android.os.Parcelable {*;}

# --------------------------------- 不优化序列化的实现类 ---------------------------------
-keep class * implements java.io.Serializable { *; }
-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 public class com.kotlin.Test { *; }
复制代码
  • 不混淆某个包所有类
-keep public class com.kotlin.** { *; }
复制代码
  • 不混淆某个类的子类
-keep public class * extends com.kotlin.Test { *; }
复制代码
  • 不混淆某个类的内部类
-keep class com.kotlin.Test$* { *; }
复制代码
  • 不混淆某个接口的实现类
-keep public class * implements com.kotlin.Callback { *; }
复制代码
  • 不混淆某个类的构造方法
-keepclassmembers class com.kotlin.Test {
    public <init>();
}
复制代码
  • 不混淆某个类的特定方法
-keepclassmembers class com.kotlin.Test {
    public void test(java.lang.String);
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享