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

简介:

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模式(平常调试)照常打印,不用修改一点代码大赞吧,嘿嘿*_^

目录
相关文章
|
3月前
|
Ubuntu 网络安全 C语言
vscode 编译多个当前目录下cpp文件,报错未定义标识符的问题
vscode 编译多个当前目录下cpp文件,报错未定义标识符的问题
66 0
|
10月前
|
Linux C语言
多文件目录Makefile的写法
多文件目录Makefile的写法
|
算法 IDE Java
ProGuard的各种参数说明(1)
ProGuard的各种参数说明(1)
527 0
|
IDE 开发工具 Android开发
ProGuard的各种参数说明(2)
ProGuard的各种参数说明(2)
172 0
ProGuard:保留包名,混淆类
ProGuard:保留包名,混淆类
162 0
ProGuard混淆时保留注释(@类内容)
ProGuard混淆时保留注释(@类内容)
123 0
|
计算机视觉
CMakeLists用法
CMakeLists用法
122 0
|
Java Android开发
ProGuard混淆
ProGuard技术的功能概括为以下4项: 1.压缩(shrinks) :检查并移除代码中无用的类,字段,方法,属性。 2.优化(optimizes):对字节码进行优化,移除无用的指令。 3.混淆(obfuscates):使用a,b,c,d等简短而无意义的名称,对类,字段和方法进行重名,这样即使代码被逆向工程,对方也比较难以读懂。 4.预检测(Preveirfy):在java平台上对处理后的代码进行再次检测。 详细介绍 (1) ProGuard 配置 -include{filename}:从给定的文件中读取配置参数。 -basedirectory{directoryname}:指定基础目录为
399 0
|
Android开发
ProGuard中keep到底有什么作用
一直以为keep就是不要混淆,近期发现还有另外一个作用
335 0
|
安全 Android开发 数据安全/隐私保护
【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
260 0
【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )