TA的每日心情 | 郁闷 2022-8-29 14:43 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]测试小兵
|
2#
楼主 |
发表于 2018-6-12 11:22:37
|
只看该作者
[保持命令] [类] {
[成员]
}
“类”代表类相关的限定条件,它将最终定位到某些符合该限定条件的类。它的内容可以使用:
具体的类
访问修饰符(public 、protected 、private )
通配符* ,匹配任意长度字符,但不含包名分隔符(.)
通配符** ,匹配任意长度字符,并且包含包名分隔符(.)
extends ,即可以指定类的基类
implement ,匹配实现了某接口的类
$,内部类
“成员”代表类成员相关的限定条件,它将最终定位到某些符合该限定条件的类成员。它的内容可以使用:
匹配所有构造器
匹配所有域
匹配所有方法
通配符* ,匹配任意长度字符,但不含包名分隔符(.)
通配符** ,匹配任意长度字符,并且包含包名分隔符(.)
通配符*** ,匹配任意参数类型
… ,匹配任意长度的任意类型参数。比如void test(…)就能匹配任意 void test(String a) 或者是 void test(in
t a, String b) 这些方法。
访问修饰符(public 、protected 、private )
举个例子,假如需要将name.huihui.test 包下所有继承Activity 的public 类及其构造函数都保持住,可以
这样写:
-keep public class name.huihui.test.** extends Android.app.Activity {
<init>
}
3. 常用的自定义混淆规则
不混淆某个类
-keep public class name.huihui.example.Test { *; }
不混淆某个包所有的类
-keep class name.huihui.test.** { *; }
不混淆某个类的子类
-keep public class * extends name.huihui.example.Test { *; }
不混淆所有类名中包含了“model”的类及其成员
-keep public class **.*model*.** {*;}
不混淆某个接口的实现
-keep class * implements name.huihui.example.TestInterface { *; }
不混淆某个类的构造方法
-keepclassmembers class name.huihui.example.Test {
public <init>();
}
不混淆某个类的特定的方法
-keepclassmembers class name.huihui.example.Test {
public void test(java.lang.String);
}
四、自定义资源保持规则
1. keep.xml
用shrinkResources true开启资源压缩后,所有未被使用的资源默认被移除。假如你需要定义哪些资源必
须被保留,在 res/raw/ 路径下创建一个 xml 文件,例如 keep.xml 。
通过一些属性的设置可以实现定义资源保持的需求,可配置的属性有:
tools:keep 定义哪些资源需要被保留(资源之间用“,”隔开)
tools:discard 定义哪些资源需要被移除(资源之间用“,”隔开)
tools:shrinkMode 开启严格模式
当代码中通过 Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可
能会有问题。例如,如下代码会导致所有以“img_”开头的资源都被标记为已使用。
String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());
我们可以设置 tools:shrinkMode 为 strict 来开启严格模式,使只有确实被使用的资源被保留。
以上就是自定义资源保持规则相关的配置,举个例子:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2"
tools:shrinkMode="strict"/>
2. 移除替代资源
一些替代资源,例如多语言支持的 strings.xml ,多分辨率支持的 layout.xml 等,在我们不需要使用又不
想删除掉时,可以使用资源压缩将它们移除。
我们使用 resConfig 属性来指定需要支持的属性,例如
android {
defaultConfig {
...
resConfigs "en", "fr"
}
}
其他未显式声明的语言资源将被移除。
参考资料
Shrink Your Code and Resources
proguard
Android安全攻防战,反编译与混淆技术完全解析(下)
Android混淆从入门到精通
Android代码混淆之ProGuard
附录
- <p>proguard-android.txt 文件内容</p><p>
- </p><p>#包名不混合大小写</p><p>-dontusemixedcaseclassnames</p><p>
- </p><p>#不跳过非公共的库的类</p><p>-dontskipnonpubliclibraryclasses</p><p>
- </p><p>#混淆时记录日志</p><p>-verbose</p><p>
- </p><p>#关闭预校验</p><p>-dontpreverify</p><p>
- </p><p>#不优化输入的类文件</p><p>-dontoptimize</p><p>
- </p><p>#保护注解</p><p>-keepattributes *Annotation*</p><p>
- </p><p>#保持所有拥有本地方法的类名及本地方法名</p><p>-keepclasseswithmembernames class * {</p><p> native <methods>;</p><p>}</p><p>
- </p><p>#保持自定义View的get和set相关方法</p><p>-keepclassmembers public class * extends android.view.View {</p><p> void set*(***);</p><p> *** get*();</p><p>}</p><p>
- </p><p>#保持Activity中View及其子类入参的方法</p><p>-keepclassmembers class * extends android.app.Activity {</p><p> public void *(android.view.View);</p><p>}</p><p>
- </p><p>#枚举</p><p>-keepclassmembers enum * {</p><p> **[] $VALUES;</p><p> public *;</p><p>}</p><p>
- </p><p>#Parcelable</p><p>-keepclassmembers class * implements android.os.Parcelable {</p><p> public static final android.os.Parcelable$Creator CREATOR;</p><p>}</p><p>
- </p><p>#R文件的静态成员</p><p>-keepclassmembers class **.R$* {</p><p> public static <fields>;</p><p>}</p><p>
- </p><p>-dontwarn android.support.**</p><p>
- </p><p>#keep相关注解</p><p>-keep class android.support.annotation.Keep</p><p>
- </p><p>-keep @android.support.annotation.Keep class * {*;}</p><p>
- </p><p>-keepclasseswithmembers class * {</p><p> @android.support.annotation.Keep <methods>;</p><p>}</p><p>
- </p><p>-keepclasseswithmembers class * {</p><p> @android.support.annotation.Keep <fields>;</p><p>}</p><p>
- </p><p>-keepclasseswithmembers class * {</p><p> @android.support.annotation.Keep <init>(...);</p><p>}</p><div>
- </div>
复制代码
|
|