Android 混淆打包详解

来源:互联网 发布:淘宝大c家有买假货吗 编辑:程序博客网 时间:2024/06/16 15:50

第一步:开启混淆功能

取消project.properties里面关于proguard的注释。​

删除“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”前的“#”注释。(这里指的是混淆配置文件在SDDK目录下,你也可以把配置文件放到目录下,引用时改为:“proguard.config=./proguard-android.txt:proguard-project.txt”即可)​

第二步:自定义“proguard-project.txt”文件​

proguard-android.txt是SDK自带的对Android系统混淆的一般性配置文件,一般工程不需要修改此配置文件,在此不再赘述。主要讲一下proguard-project.txt的自定义。​​

哪些功能需要配置:​

系统默认的配置已经涵盖了大部分的内容,但是如果你的工程中有如下内容,则需要手动添加配置到proguard-project.txt文件中。

(1) 只在 AndroidManifest.xml 引用的类(proguard-android.txt 已默认配置)

(2) 通过JNI回调方式被调用的函数(proguard-android.txt 已默认配置)

(3) 运行时动态调用的函数或者成员变量

(4) 当然,如果你不确定哪些需要手动配置,可以以默认的配置生成程序,当运行中发现ClassNotFoundException异常时,即可找到哪个类不该被混淆。

语法:​

-include {filename}    从给定的文件中读取配置参数

-basedirectory {directoryname}    指定基础目录为以后相对的档案名称

-injars {class_path}    指定要处理的应用程序jar,war,ear和目录

-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。

 

保留选项

-keep {Modifier} {class_specification}    保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件

 

压缩

-dontshrink    不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}    

 

优化

-dontoptimize    不优化输入的类文件

-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用

-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员

 

混淆

-dontobfuscate    不混淆输入的类文件

-printmapping {filename}

-applymapping {filename}    重用映射增加混淆

-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively    混淆时应用侵入式重载

-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名

-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and

 

InnerClasses.

-renamesourcefileattribute {string}    设置源文件中给定的字符串常量​

(1) 不混淆某个类的构造函数

例如:不混淆Test类的构造函数:

-keepclassmembers classcom.ticktick.example.Test {public (int,int);}

(2) 不混淆某个包所有的类或指定的类

例如,不混淆package com.ticktick.example下的所有类/接口

-keep class com.ticktick.example.** { * ; }

例如,不混淆com.ticktick.example.Test类:

-keep class com.ticktick.example.Test { * ; }

如果希望不混淆某个接口,则把上述命令中的class替换为interface即可。

(3) 不混淆某个类的特定的函数

例如:不混淆com.ticktick.example.Test类的setTestString函数:

-keepclassmembers classcom.ticktick.example.Test {public void setTestString(java.lang.String);}

(4) 不混淆某个类的子类,某个接口的实现

例如:不混淆com.ticktick.example.Test类的子类

-keep public class * extends com.ticktick.example.Test

例如:不混淆com.ticktick.example.TestInterface的实现

-keep class * implementscom.ticktick.example.TestInterface {public static final com.ticktick.example.TestInterface$Creator *;}

(5) 添加第三方依赖包

例如:添加android-support-v4.jar依赖包

-libraryjarslibs/android-support-v4.jar-dontwarnandroid.support.v4.**{*;}-keep class android.support.v4.**{*;}-keep interface android.support.v4.**{*;}

注意: 需要添加dontwarn,因为默认情况下proguard会检查每一个引用是否正确,但是第三方库里往往有些不会用到的类,没有正确引用,所以如果不配置的话,系统会报错。

5. 混淆后的调试信息解析

当代码混淆之后,输出的Log信息也会带有混淆内容,比如函数名和类名会被替换为晦涩难懂的名字,而与代码中的不一致。

因此,ProGuard工具还提供了恢复混淆内容的工具和文件。

当你开启了ProGuard混淆后,每次生成release版的apk时,Andriod工程的根目录下会对应生成一个proguard文件夹,该文件夹下的mapping.txt文件记录了混淆后的名字与混淆前的名字的对应关系,通过该文件,我们反向得到恢复后的Log信息。

假设Log文件名为log.txt,则恢复混淆的命令为:

$retrace.sh -verbose mapping.txt log.txt

注1:retrace.sh命令位于 /tools/proguard/目录下

注2:你需要保存每一个release版本的mapping.txt,因为每一次release的混淆结果和映射关系都不一样。

关于Android的代码混淆我就总结到这儿了,你也可以去ProGuard的官方网页上获取关于ProGuard更加详细的介绍,有任何疑问欢迎留言或者来信lujun.hust@gmail.com交流。​


参考:http://www.th7.cn/Program/Android/201405/204543.shtml

http://www.2cto.com/kf/201501/366450.html

引入微信开放平台不能混淆成功时请参考:http://blog.csdn.net/jiguangcanhen/article/details/41806599

0 0
原创粉丝点击