android混淆配置

上传人:xy****7 文档编号:45557175 上传时间:2018-06-17 格式:DOC 页数:18 大小:140.50KB
返回 下载 相关 举报
android混淆配置_第1页
第1页 / 共18页
android混淆配置_第2页
第2页 / 共18页
android混淆配置_第3页
第3页 / 共18页
android混淆配置_第4页
第4页 / 共18页
android混淆配置_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《android混淆配置》由会员分享,可在线阅读,更多相关《android混淆配置(18页珍藏版)》请在金锄头文库上搜索。

1、Android 混淆配置混淆配置一、一、proguard 原理原理Java 代码编译成二进制 class 文件,这个 class 文件也可以反编译成源代码 。除了注释外,原来的 code 基本都可以看到。为了防止重要 code 被泄露,我们往往需要混淆(Obfuscation code ) , 也就是把方法,字段,包和类这些 java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组 class 的结构,根据用户的配置,然后把这些 class 文件的可以混淆 java 元素名混淆掉。在分析class

2、 的,同时他还有其他两个功能,删除无效代码(Shrinking 收缩) ,和代码进行优化 (Optimization Options) 。 缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变 java 元素的名称,否则就会这样就会导致程序出错。一, 我们用到反射的地方。二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。三, 是我们的 java 元素名称是在配置文件中配置好的。所以使用 proguard 时,我们需要有个配置文件告诉 proguard 哪些 java 元素是不能混淆的。二、二、proguard 配置配置Proguard.cfg 文

3、件是用来描述混淆配置的描述文件。自 Android 2.3 SDK 发布后,Google 便在 Android SDK Tools 里加入了 proguard,proguard是一个可以对.java 文件进行一定程度上的代码混淆,使用 proguard 是一件极方便工作,在你项目中没有其他外部 Jar 包的情况下,在“project.properties”文件里,添加一行:proguard.config=proguard.cfg 代码即可,然后通过 Android Tools(右击项目名)里导出APK 即可。如果项目所使用的的 SDK 版本低于 2.3,只需要进行%android_dir%/t

4、ools/lib 目录,复制 proguard.cfg 文件到项目的根目录下导出 APK 即可。(2.3 之前版本可以拷贝 proguard.cfg 文件到项目工程下)这里我们重点看看 proguard.cfg 文件是如何配置的?Google 默认的 proguard.cfg 文件内容如下:-optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-verbose-optimizations !code/simplification/arithmetic,!fiel

5、d/*,!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 pub

6、lic class com.android.vending.licensing.ILicensingService-keepclasseswithmembernames class * native ;-keepclasseswithmembernames class * public (android.content.Context, android.util.AttributeSet);-keepclasseswithmembernames class * public (android.content.Context, android.util.AttributeSet, int);-k

7、eepclassmembers enum * public static * values();public static * valueOf(java.lang.String);-keep class * implements android.os.Parcelable public static final android.os.Parcelable$Creator *;混淆中保留了继承自 Activity、Service、Application、BroadcastReceiver、ContentProvider等基本组件以及 com.android.vending.licensing.I

8、LicensingService,并保留了所有的 Native 变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。最常用的配置选项:-dontwarn 缺省 proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。-keep 指定的类和类成员被保留作为入口 。-keepclassmembers 指定的类成员被保留。-keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。三、三、proguard 问题和风险问题和风险代码混淆后虽然有混淆优化的好处,但是它往往也会带来如

9、下的几点问题:1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则 proguard 会报错。2,运行错误,当 code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。四、解决方案四、解决方案为了防止混淆出问题,你需要熟悉你所有的 code ,系统的架构 ,以及系统和你 code 的集成的接口,并细心分析。 同时你必须需要一轮全面的测试。 所以混淆也还是有一定风险的。 为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。常见的不能混淆的常见的不能混淆的

10、androidCode(1)Android 程序 ,下面这样代码混淆的时候要注意保留。(2)Android 系统组件,系统组件有固定的方法被系统调用。(3) 被 Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。(4)Android Parcelable ,需要使用 android 序列化的。其他 Anroid 官方建议不混淆的,如(5) android.app.backup.BackupAgentHelper(6) android.preference.Preference(7) com.android.vending.licensing.IL

11、icensingService(8) Java 序列化方法,系统序列化需要固定的方法。(9) 枚举 ,系统需要处理枚举的固定方法。(10)native 本地方法,不能修改本地方法名(11)annotations 注释(12)数据库驱动(13)有些 resource 文件(14)用到反射的地方,比如调用 aidl如何实施如何实施?(1)保留系统默认混淆设置。)保留系统默认混淆设置。默认系统的混淆配置会保留: Android 系统组件自定义 ViewAndroid ParcelableAndroid R 文件Android Parcelable枚举各个开发人员必须检查自己的 code 是否用到反射

12、,和其他不能混淆的地方。告诉我来修改配置文件(已经保留的就不需要了)目前系统不检查的第三方库为:-dontwarn android.support.*-dontwarn com.tencent.*-dontwarn org.dom4j.*-dontwarn org.slf4j.*-dontwarn org.http.mutipart.*-dontwarn org.apache.*-dontwarn org.apache.log4j.*-dontwarn mons.logging.*-dontwarn mons.codec.binary.*-dontwarn weibo4android.*pro

13、guard 参数:-include filename 从给定的文件中读取配置参数 -basedirectory directoryname 指定基础目录为以后相对的档案名称 -injars class_path 指定要处理的应用程序 jar,war,ear 和目录 -outjars class_path 指定处理完后要输出的 jar,war,ear 和目录的名称 -libraryjars classpath 指定要处理的应用程序 jar,war,ear 和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipno

14、npubliclibraryclassmembers 指定不去忽略包可见的库类的成员。 保留选项:-keep Modifier class_specification 保护指定的类文件和类的成员 -keepclassmembers modifier class_specification 保护指定类的成员,如果此类受到保护他们会保护的更好-keepclasseswithmembers class_specification 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames class_specification 保护指定的类和类的成员的名称(如果他们不会压缩

15、步骤中删除) -keepclassmembernames class_specification 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) -keepclasseswithmembernames class_specification 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) -printseeds filename 列出类和类的成员-keep 选项的清单,标准输出到给定的文件 压缩 -dontshrink 不压缩输入的类文件 -printusage filename -whyareyoukeeping class_specification 优化

16、 -dontoptimize 不优化输入的类文件 -assumenosideeffects class_specification 优化时假设指定的方法,没有任何副作用 -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员 混淆 -dontobfuscate 不混淆输入的类文件 -printmapping filename -applymapping filename 重用映射增加混淆 -obfuscationdictionary filename 使用给定文件中的关键字作为要混淆方法的名称 -overloadaggressively 混淆时应用侵入式重载 -useuniqueclassmembernames 确定统一的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号