android 混淆文件proguard.cfg详解
来源:互联网 发布:手机制谱软件 编辑:程序博客网 时间:2024/05/21 10:26
- android应用程序的混淆打包
proguard.config=proguard.cfg
Eclipse会通过此配置在工程目录生成proguard.cfg文件
参数意义:-validity主要是证书的有效期,写100000天;空格,退格键
File
proguard 自己考一个就行
- proguard 原理
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
- proguard 配置
-dontwarn 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-keep 指定的类和类成员被保留作为 入口 。
-keepclassmembers 指定的类成员被保留。
-keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。
- proguard 问题和风险
1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。
2,运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。
3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。
为了防止混淆出问题,你需要熟悉你所有的code ,系统的架构 ,以及系统和你code的集成的接口,并细心分析。 同时你必须需要一轮全面的测试。 所以混淆也还是有一定风险的。 为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。
常见的不能混淆的androidCode:
- Android 程序 ,下面这样代码混淆的时候要注意保留。
- Android系统组件,系统组件有固定的方法被系统调用。被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。
- Android Parcelable ,需要使用android 序列化的。
- android.app.backup.BackupAgentHelper
- android.preference.Preference
- com.android.vending.licensing.ILicensingService
- Java序列化方法,系统序列化需要固定的方法。
- 枚举 ,系统需要处理枚举的固定方法。
- 本地方法,不能修改本地方法名
- annotations 注释
- 数据库驱动
- 有些resource 文件
- 用到反射的地方
- 如何实施
- Android系统组件
- 自定义View
- Android Parcelable
- Android R 文件
- Android Parcelable
- 枚举
目前系统部检查的第三方库为
-dontwarn android.support.**
-dontwarn com.tencent.**
-dontwarn org.dom4j.**
-dontwarn org.slf4j.**
-dontwarn org.http.mutipart.**
-dontwarn org.apache.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.codec.binary.**
-dontwarn weibo4android.**
- proguard 参数
-basedirectory {directoryname} 指定基础目录为以后相对的档案名称
-injars {class_path} 指定要处理的应用程序jar,war,ear和目录
-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
- 保留选项
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
- 压缩
-printusage {filename}
-whyareyoukeeping {class_specification}
- 优化
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
- 混淆
-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} 设置源文件中给定的字符串常量
- 解决export打包的报错
升级办法很简单,就是把android sdk目录下的tool/proguard目录覆盖一下即可。
- 打包出来的程序如何调试
个人建议减少依赖包混淆带来的麻烦,干脆都全部保留不混淆。例如
-ignorewarnings-libraryjars lib/org.simalliance.openmobileapi.jar-libraryjars libs/mylib.jar-libraryjars libs/simple-xml-2.7.jar-libraryjars libs/TsmSeiMvo.jar-libraryjars libs/YakUtil.jar -optimizationpasses 5 -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class com.android.vending.licensing.ILicensingService -keep class com.broadthinking.globalplatform.web.**{*;}-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 *; }
- 验证打包效果
- 配置实例
-injars androidtest.jar【jar包所在地址】 -outjars out【输出地址】-libraryjars 'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】-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 * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class com.android.vending.licensing.ILicensingService-keep public abstract interface com.asqw.android.Listener{public protected ; 【所有方法不进行混淆】}-keep public class com.asqw.android{public void Start(java.lang.String); 【对该方法不进行混淆】}-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】native ;}-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】public (android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * {public (android.content.Context, android.util.AttributeSet, int);}-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】public void *(android.view.View);}-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】public static final android.os.Parcelable$Creator *;}//不混淆指定包下的类 -keep class com.aspire.**
附:使用zipalign的4字节对齐优化处理,以提高apk的性能:
1.在Android中,当资源文件通过内存映射对齐到4字节边界时,访问资源文件的代码才是有效率的。但是,如果资源本身没有进行对齐处理(未使用zipalign工具),它就必须回到老路上,显式地读取它们——这个过程将会比较缓慢且会花费额外的内存。
2.必须在签名apk文件后进行,使用以下命令让其对齐:
zipalign -v 4 source.apk destination.apk
3.以下的命令用于检查程序包是否进行了对齐:
zipalign -c -v 4 application.apk
以后凡是eclipse编译打包生成的apk,最好经过zipalign的处理。
zipalign 的文件路径:
sdk目录/tools/zipalign
idh.code/out/host/linux-x86/bin/zipalign
参考文献:http://www.eoeandroid.com/thread-209210-1-1.html
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- Android:混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解 .
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android开发混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- Android:混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 混淆文件proguard.cfg详解
- android 导出签名APK--混淆文件proguard.cfg详解
- android 导出签名APK--混淆文件proguard.cfg详解
- db2mtrk--db2内存使用查看工具
- 字符串移位包含问题
- IOS应用开发06——上拉下拉刷新(MJRefresh.h)
- Cocos2d-x3.1Vector的使用
- Android第三方开源框架之SlidingMenu详解
- android 混淆文件proguard.cfg详解
- MFC获取exe文件所在的路径
- 精通CSS(1)-图像背景那些事儿
- 强命名的有趣实验
- UVA-1583 - Digit Generator
- WiFi共享精灵:路由器的痛处
- Form中Trigger的执行顺序(转)
- java方法体超时设计
- edfdfdf