混淆编译及参数说明

之前我曾经写过一篇如何为用ADT创建的Android项目添加Proguard混淆支持的文章(
为Eclipse ADT创建的android项目通过ant添加proguard混淆支持
),当时我就说过,相信随着Google Android的不断更新发展以及Eclipse ADT插件的不断改进,总有一天,做Android项目时能够和J2ME项目一样方便的一键打包混淆。现在新版的SDK和ADT就已经添加了这样的功能(SDK Tools中已经整合了Proguard的发行包,连这步配置都省了!),虽然还不是一键,但也就是小改一个配置文件的事,相对以前的手改ant xml build file的做法来说已经是极大的简化了添加混淆支持的难度了。

先说说我写这篇文章时用的开发环境:Eclipse 3.5.2+ADT 9.0.0+SDK Tools R9+SDK Platform-tools R2。

声明我不保证在其他版本的IDE ADT和SDK Tools下我的方法是否可行且不会产生问题!


有一个问题需要先注意一下,就是现在版本的SDK和ADT的整合Proguard混淆对有空格的SDK路径和项目路径支持不好,所以混淆之前先把空格路径的问题解决一下,虽然我记得之前的手改xml方法好像不太会有空格路径问题,不过这次还是不要在SDK和项目路径中出现空格为好,免得自找没趣。

其实在用比较新版的SDK和ADT创建Android项目时,你会发现生成的项目结构里多了一个以前没有的文件:proguard.cfg,这就是SDK整合了Proguard的一个重要标志(具体从哪版开始变成这样我还真没注意),有兴趣你可以打开看一下,做过原来ant xml方式混淆的朋友可以看出来这里面写的就是当初Proguard混淆target里的混淆设置参数,什么keep啊之类的,当时是要自己写,这次是SDK直接生成好了!

虽然有proguard.cfg,但是默认情况下,混淆是没有启用的,想打开混淆支持,只需要在default.properties中加入这样一段参数:proguard.config=proguard.cfg就可以了(注意:这个文件里的注释写着类似这个文件是自动生成的,所作修改可能会被覆盖等等,让把自定义的东西加到额外的build.properties里,其实也无所谓,盖了也就是一句话的事!),简单明了。

然后在执行项目打包apk时sdk就会自动添加Proguard混淆支持了,可以右键项目->Android Tools->Export Signed (或Unsigned) Application Package…,生成的apk包可以用如apktool解包看看混淆效果。

PS:其实以前懒得弄Android混淆的一个原因是改xml太麻烦,加点外部lib就得更麻烦的加一些参数,同时还有另一个原因就是混淆的apk发布到market上,如果有用户的机器在程序出错时支持上传trace信息的话,那么你在market上看到的记录都是不可读的混淆后的名字,也是一件麻烦事。后来发现market上提了一句如果用proguard混淆后的apk可以有方法将trace信息反映射回去,成为可读信息的方法,查了一下,发现官方开发网站中就有提到,有兴趣的朋友可以研究一下:http://developer.android.com/guide/developing/tools/proguard.html (有墙,你懂),这样Proguard在Android上的实用性就更好了!


Java代码 收藏代码
  1. 参数:
  2. -include{filename}从给定的文件中读取配置参数
  3. -basedirectory{directoryname}指定基础目录为以后相对的档案名称
  4. -injars{class_path}指定要处理的应用程序jar,war,ear和目录
  5. -outjars{class_path}指定处理完后要输出的jar,war,ear和目录的名称
  6. -libraryjars{classpath}指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
  7. -dontskipnonpubliclibraryclasses指定不去忽略非公共的库类。
  8. -dontskipnonpubliclibraryclassmembers指定不去忽略包可见的库类的成员。
  9. 保留选项
  10. -keep{Modifier}{class_specification}保护指定的类文件和类的成员
  11. -keepclassmembers{modifier}{class_specification}保护指定类的成员,如果此类受到保护他们会保护的更好
  12. -keepclasseswithmembers{class_specification}保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
  13. -keepnames{class_specification}保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
  14. -keepclassmembernames{class_specification}保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
  15. -keepclasseswithmembernames{class_specification}保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
  16. -printseeds{filename}列出类和类的成员-keep选项的清单,标准输出到给定的文件
  17. 压缩
  18. -dontshrink不压缩输入的类文件
  19. -printusage{filename}
  20. -whyareyoukeeping{class_specification}
  21. 优化
  22. -dontoptimize不优化输入的类文件
  23. -assumenosideeffects{class_specification}优化时假设指定的方法,没有任何副作用
  24. -allowaccessmodification优化时允许访问并修改有修饰符的类和类的成员
  25. 混淆
  26. -dontobfuscate不混淆输入的类文件
  27. -printmapping{filename}
  28. -applymapping{filename}重用映射增加混淆
  29. -obfuscationdictionary{filename}使用给定文件中的关键字作为要混淆方法的名称
  30. -overloadaggressively混淆时应用侵入式重载
  31. -useuniqueclassmembernames确定统一的混淆类的成员名称来增加混淆
  32. -flattenpackagehierarchy{package_name}重新包装所有重命名的包并放在给定的单一包中
  33. -repackageclass{package_name}重新包装所有重命名的类文件中放在给定的单一包中
  34. -dontusemixedcaseclassnames混淆时不会产生形形色色的类名
  35. -keepattributes{attribute_name,}保护给定的可选属性,例如LineNumberTable,LocalVariableTable,SourceFile,Deprecated,Synthetic,Signature,andInnerClasses.
  36. -renamesourcefileattribute{string}设置源文件中给定的字符串常量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值