当前位置: 代码迷 >> Android >> android 搅混
  详细解决方案

android 搅混

热度:351   发布时间:2016-05-01 20:38:20.0
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} ? ?设置源文件中给定的字符串常量?

  相关解决方案