android 混淆
注意:这里介绍的混淆是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} ? ?设置源文件中给定的字符串常量?