混淆编译及参数说明

来源:互联网 发布:生产法工业增加值算法 编辑:程序博客网 时间:2024/05/16 08:25
之前我曾经写过一篇如何为用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.   
  3. -include {filename}    从给定的文件中读取配置参数  
  4.   
  5. -basedirectory {directoryname}    指定基础目录为以后相对的档案名称  
  6.   
  7. -injars {class_path}    指定要处理的应用程序jar,war,ear和目录  
  8.   
  9. -outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称  
  10.   
  11. -libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件  
  12.   
  13. -dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。  
  14.   
  15. -dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。  
  16.   
  17.   
  18. 保留选项  
  19. -keep {Modifier} {class_specification}    保护指定的类文件和类的成员  
  20.   
  21. -keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好  
  22.   
  23. -keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。  
  24.   
  25. -keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)  
  26.   
  27. -keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)  
  28.   
  29. -keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)  
  30.   
  31. -printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件  
  32.   
  33. 压缩  
  34. -dontshrink    不压缩输入的类文件  
  35.   
  36. -printusage {filename}  
  37.   
  38. -whyareyoukeeping {class_specification}      
  39.   
  40. 优化  
  41. -dontoptimize    不优化输入的类文件  
  42.   
  43. -assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用  
  44.   
  45. -allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员  
  46.   
  47. 混淆  
  48. -dontobfuscate    不混淆输入的类文件  
  49.   
  50. -printmapping {filename}  
  51.   
  52. -applymapping {filename}    重用映射增加混淆  
  53.   
  54. -obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称  
  55.   
  56. -overloadaggressively    混淆时应用侵入式重载  
  57.   
  58. -useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆  
  59.   
  60. -flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中  
  61.   
  62. -repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中  
  63.   
  64. -dontusemixedcaseclassnames    混淆时不会产生形形色色的类名  
  65.   
  66. -keepattributes {attribute_name,}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.  
  67.   
  68. -renamesourcefileattribute {string}    设置源文件中给定的字符串常量  
原创粉丝点击