android源码编译 关闭混淆,ProGuard混淆编译--防止apk被反编译

混淆器(ProGuard)通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,用来混淆、压缩和优化Java字节码文件,该文件比较难进行逆向工程。混淆器被集成在android构建系统中,仅在发布模式下进行构建应用程序的时候才会运行起来,所以在调试模式下构建程序时,你不必处理混淆代码。让混淆器运行起来是可选择的,但是推荐选上。

新建了一个Android工程之后,一个proguard.cfg文件会在工程的根目录下自动创建。启用混淆器要设置proguard.config属性,路径可以是绝对路径或者工程根目录的相对路径,例:proguard.config=proguard.cfg或proguard.config=/path/to/proguard.cfg

运行混淆器之后输出的文件有:

ldump.txt描述.apk包中所有class文件的内部结构。

lmapping.txt列出了源代码与混淆后的类,方法和属性名字之间的映射。这个文件对于在构建之后得到的bug报告是有用的,因为它把混淆的堆栈跟踪信息反翻译为源代码中的类,方法和成员名字。

lseeds.txt列出那些未混淆的类和成员。

lusage.txt列出从.apk中剥离的代码。

某些情况下,proguard.cfg文件的缺省配置可以满足需求了。但是,对于混淆器来说,大多数情况做出正确的分析是困难的,并且它或许会删除在它看来是无用的,但对于程序来说却确实需要的代码。可以自己修改proguard.cfg文件。

注意下列类不能进行混淆:

1.反射用到的类

2.在AndroidManifest中配置的类(Activity、Service等的子类及Framework类默认不会进行混淆)

3. Jni中调用的类

当因为ProGuard混淆了不该混淆的代码而产生一些bug,其中最常见的就是ClassNotFoundException,还有BadParcelableException等时,可以在proguard.cfg文件中添加-keep来修复这些错误。如,对于ClassNotFoundException,根据mapping.txt文件反推找到某个类,然后在proguard.cfg中不进行混淆即可:-keep class packagename.classname

{ *; }

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详细语法:

常用proguard.cfg代码段

不混淆某类的构造方法,需指定构造函数的参数类型,如JSONObject

-keepclassmembers

class cn.trinea.android.common.service.impl.ImageCache {

public (int);

}

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

-keep class

cn.trinea.android.common.** { *; }

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

-keepclassmembers

class cn.trinea.android.common.service.impl.ImageCache {

public boolean get(java.lang.String,

android.view.View);

}

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

-keep class *

implements android.os.Parcelable {

public static final

android.os.Parcelable$Creator *;

}

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

-libraryjars   libs/android-support-v4.jar

-dontwarn

android.support.v4.**

-keep class

android.support.v4.** { *; }

-keep interface

android.support.v4.app.** { *; }

已发布应用程序的调试注意事项:保存好每一个已发布给用户的程序的mapping.txt文件。通过保存发布构建版本的mapping.txt文件拷贝,确保当用户碰到bug,并把混淆后的堆栈调试跟踪信息提交给你时,你可以进行调试从而修复问题。程序的mapping.txt文件在每次发布构建时都会被覆盖,所以你一定要注意保存正确的版本。

proguard与log level结合解决debug模式Log问题

常见的Android debug日志的打法是定义一个静态变量DEBUG_STATUS,如果为true,则打印log,否则不打印。对于release模式该变量为false,debug模式变量为true。这里介绍一个更好的方法,不用担心正式发布时一不小心错改了该变量。

proguard的作用就是在release模式压缩、优化、混淆代码,其中的压缩和优化就包括去除不必要的代码,我们可以利用这一特性解决debug日志的问题,在proguard.cfg中添加

-assumenosideeffects class android.util.Log

{

public static *** d(...);

public static *** v(...);

}

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

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值