Proguard 4.x error - java.lang.ArrayIndexOutOfBoundsException

这几天被Proguard 搞郁闷了

一混淆就报  java.lang.ArrayIndexOutOfBoundsException, 折腾了很多办法,网上搜的一堆也都没用

最后发现是-optimizations 不对引起的,

android默认是:-optimizations  !code/simplification/arithmetic,!field/*,!class/merging/* 

增加了一项!method/removal/* (不移除任何方法)就好了

 

但还是会碰到可能只在xml里用到的类, 在代码文件里根本没用过的,  Proguard 因为不会检查android的xml引用, 在优化的时候会把这样的类直接干掉, 解决的办法是在随便一个地方增加对该类的一个调用即可。(Proguard 的这个优化策略本身没有问题,不需要去掉)

 

proguard的网址:

http://proguard.sourceforge.net 

各种优化选项的说明: 

http://proguard.sourceforge.net/index.html#/manual/usage.html#optimizationoptions 

 

 

因为sdk tools reversion12 的问题,降到reversion11后就没有问题了,更好的解决方法也有人给出了:

找到[Android SDK Installation Directory]\tools\proguard\bin\proguard.bat文件,用编辑器打开(我用的是Editplus),将这句话:

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %*

改为

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9

就ok了。

 

 

 

 

参数:

-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}    设置源文件中给定的字符串常量
 

 

posted @ 2011-09-16 21:02  jacktu  阅读(1417)  评论(0编辑  收藏  举报