开启混淆
buildTypes {
release {
minifyEnabled true
...
}}
复制代码
组件配置
consumerProguardFiles 与 proguardFiles 的区别:
- 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