转载出处:http://www.trinea.cn/android/proguard-grammar/


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

本文主要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
1 2 3 - keepclassmembers class cn . trinea . android . common . service . impl . ImageCache { public <init> ( int ) ; }

不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名

Java
1 - keep class cn . trinea . android . common . * * { * ; }

不混淆指某个方法,*可换成指定的方法或类名

Java
1 2 3 - keepclassmembers class cn . trinea . android . common . service . impl . ImageCache { public boolean get ( java . lang . String , android . view . View ) ; }

不混淆Parcelable的子类,防止android.os.BadParcelableException

Java
1 2 3 - keep class * implements android . os . Parcelable { public static final android . os . Parcelable $ Creator * ; }

添加android-support-v4.jar依赖包

Java
1 2 3 4 - 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
1 2 3 4 - assumenosideeffects class android . util . Log { public static * * * d ( . . . ) ; public static * * * v ( . . . ) ; }

表示Log.d和Log.v代码无副作用,在proguard时会被从源码中remove掉,这样release模式(正式发布)就不会打印日志了,而debug模式(平常调试)照常打印,不用修改一点代码大赞吧,嘿嘿*_^



https://github.com/krschultz/android-proguard-snippets


更多相关文章

  1. android开发学习2——hello world
  2. Android高低API版本兼容之@TargetApi
  3. launchMode的几种模式
  4. Android系列之Fragment(一)----Fragment加载到Activity当中
  5. Android(安卓)ListView组件详解及示例代码
  6. 安卓向SD卡存储数据时java.io.FileNotFoundException:(Permissio
  7. Android设计模式系列--适配器模式
  8. android中activity的生命周期
  9. 弹出对话框--------android Toast 五种情形(无按钮)

随机推荐

  1. 2018 年终总结:成就不算少,进步不算多
  2. 【一】从0开始,用flask+mongo打造分布式服
  3. 2019,继续前行!
  4. 最佳实践【二】从 0 开始,用 flask+mongod
  5. 让我大吃一堑的前后分离 web 站模拟登录
  6. 情人节到了,让我们送出程序员专属礼物吧!
  7. time date datetme timestamp 傻傻分不清
  8. BootstrapVue 入门[每日前端夜话0x62]
  9. Python 排序算法[一]:令你茅塞顿开,却又匪
  10. 还在一个个写规则?来了解下爬虫的智能化解