Proguard语法及常用proguard.cfg代码段
2014-03-19 17:07
274 查看
转自: http://www.trinea.cn/android/proguard-grammar/
本文主要ProGuard常用语法、标准proguard.cfg文件内容、常用proguard.cfg代码段及proguard与log level结合解决debug模式日志问题。关于ProGuard的作用、使用及bug分析可见ProGuard的作用、使用及bug分析。
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
-keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
public <init>(int);
}
不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名
Java
-keep class cn.trinea.android.common.** { *; }
不混淆指某个方法,*可换成指定的方法或类名
Java
-keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
public boolean get(java.lang.String, android.view.View);
}
不混淆Parcelable的子类,防止android.os.BadParcelableException
Java
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
添加android-support-v4.jar依赖包
Java
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-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
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
表示Log.d和Log.v代码无副作用,在proguard时会被从源码中remove掉,这样release模式(正式发布)就不会打印日志了,而debug模式(平常调试)照常打印。
本文主要ProGuard常用语法、标准proguard.cfg文件内容、常用proguard.cfg代码段及proguard与log level结合解决debug模式日志问题。关于ProGuard的作用、使用及bug分析可见ProGuard的作用、使用及bug分析。
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
-keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
public <init>(int);
}
1 2 3 | -keepclassmembersclass cn.trinea.android.common.service.impl.ImageCache{ public<init>(int); } |
不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名
Java
-keep class cn.trinea.android.common.** { *; }
1 | -keepclass cn.trinea.android.common.**{ *;} |
不混淆指某个方法,*可换成指定的方法或类名
Java
-keepclassmembers class cn.trinea.android.common.service.impl.ImageCache {
public boolean get(java.lang.String, android.view.View);
}
1 2 3 | -keepclassmembersclass cn.trinea.android.common.service.impl.ImageCache{ publicboolean get(java.lang.String,android.view.View); } |
不混淆Parcelable的子类,防止android.os.BadParcelableException
Java
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
1 2 3 | -keepclass *implements android.os.Parcelable{ publicstatic finalandroid.os.Parcelable$Creator*; } |
添加android-support-v4.jar依赖包
Java
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
1 2 3 4 | -libraryjars libs/android-support-v4.jar -dontwarn android.support.v4.** -keepclass android.support.v4.**{ *;} -keep interfaceandroid.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
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
1 2 3 4 | -assumenosideeffectsclass android.util.Log{ publicstatic ***d(...); publicstatic ***v(...); } |
相关文章推荐
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- Proguard语法及常用proguard.cfg代码段
- 常用CSS缩写语法总结
- Jquery常用语法
- 01java语法回顾_常用api类
- IBM 的数据库Informix 常用代语法
- sql数据库基础知识整理,常用函数及常用语法
- Android之Proguard语法
- makefile常用语法讲解(1)
- My SQL 基础常用语法
- 正则表达式语法及常用的正则表达式
- Apache Rewrite规则配置常用语法介绍
- Ant 常用语法及选项
- ios笔记--OC常用语法归纳小结
- redis常用语法总结