Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 662|回复: 0

Proguard 语法及常用proguard.cfg代码段

[复制链接]

该用户从未签到

发表于 2013-9-2 21:11:49 | 显示全部楼层 |阅读模式
本文主要ProGuard常用语法、标准proguard.cfg文件内容、常用proguard.cfg代码段及proguard与log level结合解决debug模式日志问题。关于ProGuard的作用、使用及bug分析可见ProGuard的作用、使用及bug分析。(PS:^_^不错的Android学习交流群278744577,验证:xxz,有兴趣的话可以加入进来一起讨论)
1、ProGuard的常用语法
-libraryjars class_path 应用的依赖包,如android-support-v4
-keep [,modifier,...] class_specification 不混淆某些类
-keepclaSSMembers [,modifier,...] class_specification 不混淆类的成员
-keepclasseswithmembers [,modifier,...] class_specification 不混淆类及其成员
-keepnames class_specification 不混淆类及其成员名
-keepclassmembernames class_specification 不混淆类的成员名
-keepclasseswithmembernames class_specification 不混淆类及其成员名
-assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等
-dontwarn [class_filter] 不提示warnning
关于proguard更多语法可见:http://proguard.sourceforge.net/index.html#manual/usage.html
2、标准proguard.cfg文件内容
参考android标准,修改如下:
标准proguard.cfg文件内容
源文件见<android_root>/build/core/proguard.flags , 将14行 -dontobfuscate解除注释。
3、常用proguard.cfg代码段
不混淆某类的构造方法,需指定构造函数的参数类型,如JSONObject
java
  1. -keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
  2. public <init>(int);
  3. }
复制代码
不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名
Java
  1. -keep class cn.trinea.android.common.** { *; }
复制代码
不混淆指某个方法,*可换成指定的方法或类名
Java
  1. -keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
  2. public boolean get(java.lang.String, android.view.View);
  3. }
复制代码
不混淆Parcelable的子类,防止android.os.BadParcelableException
Java
  1. -keep class * implements android.os.Parcelable {
  2. public static final android.os.Parcelable$Creator *;
  3. }
复制代码
添加android-support-v4.jar依赖包
Java
  1. -libraryjars   libs/android-support-v4.jar
  2. -dontwarn android.support.v4.**   
  3. -keep class android.support.v4.** { *; }  
  4. -keep interface android.support.v4.app.** { *; }
复制代码
4、proguard与log level结合解决debug模式Log问题
常见的Android debug日志的打法是定义一个静态变量DEBUG_STATUS,如果为true,则打印log,否则不打印。对于release模式该变量为false,debug模式变量为true。这里介绍一个更好的方法,不用担心正式发布时一不小心错改了该变量。
proguard的作用就是在release模式压缩、优化、混淆代码,其中的压缩和优化就包括去除不必要的代码,我们可以利用这一特性解决debug日志的问题,在proguard.cfg中添加
Java
  1. -assumenosideeffects class android.util.Log {
  2. public static *** d(...);
  3. public static *** v(...);
  4. }
复制代码
表示Log.d和Log.v代码无副作用,在proguard时会被从源码中remove掉,这样release模式(正式发布)就不会打印日志了,而debug模式(平常调试)照常打印,不用修改一点代码大赞吧,嘿嘿*_^

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-12 03:47 , Processed in 0.349095 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表