android 混淆

本文转自 http://deanandbai-gmail-com.iteye.com/blog/1538663

注意:这里介绍的混淆是2.3SDK以后我方式。

 

1.打开工程会发现一个文件“proguard-android.txt”

  -optimizationpasses 5 

-dontusemixedcaseclassnames  

-dontskipnonpubliclibraryclasses  

-dontpreverify  

-verbose  

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  

-keep public class * extends android.app.Activity  

-keep public class * extends android.app.Application  

-keep public class * extends android.app.Service  

-keep public class * extends android.content.BroadcastReceiver  

-keep public class * extends android.content.ContentProvider  

-keep public class com.android.vending.licensing.ILicensingService  

-keepclasseswithmembernames class * {  

    native <methods>;  

}  

-keepclasseswithmembernames class * {  

    public <init>(android.content.Context, android.util.AttributeSet);  

}  

-keepclasseswithmembernames class * {  

    public <init>(android.content.Context, android.util.AttributeSet, int);  

}  

-keepclassmembers enum * {  

    public static **[] values();  

    public static ** valueOf(java.lang.String);  

}  

-keep class * implements android.os.Parcelable {  

  public static final android.os.Parcelable$Creator *;  

-optimizationpasses 5

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-dontpreverify

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity

-keep public class * extends android.app.Application

-keep public class * extends android.app.Service

-keep public class * extends android.content.BroadcastReceiver

-keep public class * extends android.content.ContentProvider

-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {

    native <methods>;

}

-keepclasseswithmembernames class * {

    public <init>(android.content.Context, android.util.AttributeSet);

}

-keepclasseswithmembernames class * {

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

-keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

-keep class * implements android.os.Parcelable {

  public static final android.os.Parcelable$Creator *;

}

 

 

上述文件就是android 自带的文件,从脚本中可以看到,混淆中保留了继承自Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件。

并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。

此文件中的每一项在后面会具体列出。

 

2。操作步骤

  1).在工程的"default.properties"中添加这样一句话“proguard.config=proguard-android.txt”

  2).签名打包:选中工程--->右击Android Tools—Export Signed Appalication Packges

  3).打出的APK反编译你会发现代码都边了,此APK可以安装使用。

 

3。遇到问题

  1).如果不能打包,看出错在那里,一般的出现warning 的话,你在 proguard-android.txt文件中添加这一命令

    -dontwarn

  2).打包出的结果比以往的不混淆的大小是不一样的,可能省略很多东西。具体要看 proguard文件夹中的           四个.txt文件

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

         dump.txt

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

         mapping.txt

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

         seeds.txt

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

         usage.txt

                   列出从.apk中剥离的代码

  3).有些类是不能混淆的,从proguard-android.txt文件可以看出,保留了很多类和方法。

  4).新建的工程中可能proguard-android.txt文件是空的,你可以去SDK目录下..\android-sdk-windows\tools\proguard查找这个文件。

 

 

 

 

 

3.介绍下proguard中的各个代码的具体含义

参数: 

 

-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}    设置源文件中给定的字符串常量 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章