温馨提示:此页面服务由第三方为您提供,交易前请仔细核对商家真实资质,勿信夸张宣传和承诺,勿轻易相信预付定金、汇款等交易方式; 此页面所发布文字及图片均由网民自行发布,如有侵权请联系发布者删除。
数控解锁数控解密在这里,我们可以思考一个问题:如果apk构建过程中,没有任何keep规则,那么代码会不会全部被裁剪掉?答案是肯定的,*终apk中不会有任何代码。可能有同学会说,我用Android Studio新建一个app工程,开启了Proguard但是没有配置任何keep规则,为什么*终apk中会包含一些代码?这个是由于Android Gradle Plugin在构建apk过程中,会自动生成一些混淆规则,关于所有keep规则的来源问题,在后面的章节会讲到。
好了,继续回到keep配置上来。keep配置支持的规则非常复杂,在这里将其分为以下几类:
1、直接保留类、方法、变量;
-keep。被保留类、方法、变量,不允许shrink(裁剪),不允许obfuscate(混淆);
-keepnames。等效于-keep, allowshrinking。保留类、方法、变量,允许shrink,如果*终被保留住(其它keep规则,或者代码调用),那么不允许obfuscate;
2、如果类被保留(未裁剪掉),则保留指定的变量、方法;
-keepclassmembers。被保留的变量、方法,不允许shrink(裁剪),不允许obfuscate(混淆);
-keepclassmembernames。等效于-keepclassmembers, allowshrinking。被保留的变量、方法,允许shrink,如果*终被保留住,那么不允许obfuscate;
3、如果方法/变量,均满足指定条件,则保留对应类、变量、方法;
-keepclasseswithmembers。被保留类、方法、变量,不允许shrink(裁剪),不允许obfuscate(混淆);
keepclasseswithmembernames。等效于-keepclasseswithmembers, allowshrinking。被保留类、方法、变量,允许shrink,如果*终被保留住,那么不允许obfuscate。
完整keep规则格式如下,感受下复杂度:
-keepXXX [,modifier,...] class_specification
# support modifiers:
includedescriptorclasses
includecode
allowshrinking
allowoptimization
allowobfuscation
# class_specification format:
[@annotationtype] [[!]public|final|abstract|@ ...] [!]interface|class|enum classname
[extends|implements [@annotationtype] classname]
[{
[@annotationtype]
[[!]public|private|protected|static|volatile|transient ...]
<fields> | (fieldtype fieldname [= values]);
[@annotationtype]
[[!]public|private|protected|static|synchronized|native|abstract|strictfp ...]
<methods> | <init>(argumenttype,...) | classname(argumenttype,...) | (returntype methodname(argumenttype,...) [return values]);
}]
# 此外,不同位置均支持不同程度的通配符,不详述.
在实际工作中,一般不会用到非常复杂的keep规则,所以完整用法不必刻意学习,遇到时能够通过查文档看懂即可。举一个比较有意思的例子,来结束本小节。
===================== 示例 =====================
# 示例类:
package com.example.myapplication.proguard;public class TestProguardFieldOnly {
public static String fieldA; public int fieldB;
}
package com.example.myapplication.proguard;public class TestProguardMethodOnly {
public static void methodA() {
Log.d("TestProguardClass", "void methodA");
}
}
package com.example.myapplication.proguard;public class TestProguardFieldAndMethod {
public int fieldB; public static void methodA() {
Log.d("TestProguardClass", "void methodA");
}
}# keep规则:-keepclasseswithmembers class com.example.myapplication.proguard.** {
*;
}
# 问题:上述这条keep规则,会导致哪几个示例类被“保留”?
# 答案:TestProguardFieldOnly和TestProguardFieldAndMethod
辅助文件
这里要讲的辅助文件,是指progaurd生成的一些文件,用于了解处理结果,对排查裁剪、混淆相关问题很有帮忙(必要)。
辅助文件
配置项集合
配置项集合,汇总了所有配置信息,并对某些配置进行“展开”。由于配置项可以在多个文件、多个工程中定义(后面会讲到所有来源),因此配置项集合方便我们对此集中查看。
通过配置项-printconfiguration <filepath>打开此项输出,例如-printconfiguration build/outputs/proguard.cfg会生成${application工程根目录}/build/outputs/proguard.cfg文件,示例内容如下:
苏ICP备09042555号-2 | 增值电信业务经营许可证:苏B2-20150120 | 公安部备案号:32020202000170 | Copyright © 无锡市新视点网络科技有限公司 版权所有
免费
报修
微信扫一扫
师傅
抢单
请先关注公众号
方便后期订单推送
图文
软件
138-6175-9787
关注
我们
公众号
顶部