2014-01-19 5 views
0

Я использую ProGuard во время сборки приложения J2ME. ProGruard не работает во время оптимизации с исключением ArrayIndexOutOfBoundsException (см. (1)).Ошибка ProGuard с ArrayIndexOutOfBoundsException

Код, вызывающий отказ, является «принудительным»: это метод, который копирует 23 поля из одного POJO в другой (см. (2)). Кроме того, когда я комментирую некоторые инструкции get/set, ProGruad не терпит неудачу (см. (3)).

(1) ProGruard журналы

[proguard] ProGuard, version 4.3 
[proguard] Reading input... 
[proguard] Reading program jar [...] (filtered) 
[proguard] Reading library jar [.../WTK2.5.2/lib/midpapi21.jar] 
[proguard] Reading library jar [.../WTK2.5.2/lib/cldcapi11.jar] 
[proguard] Reading library jar [.../WTK2.5.2/lib/wma20.jar] 
[proguard] Initializing... 
[proguard] Ignoring unused library classes... 
[proguard] Original number of library classes: 947 
[proguard] Final number of library classes: 87 
[proguard] Printing kept classes, fields, and methods... 
[proguard] Shrinking... 
[proguard] Removing unused program classes and class elements... 
[proguard] Original number of program classes: 223 
[proguard] Final number of program classes: 189 
[proguard] Inlining subroutines... 
[proguard] Optimizing... 
[proguard] Unexpected error while merging classes: 
[proguard] Class  = [.../TransactionEntityBuilder] 
[proguard] Target class = [.../TransactionEntity] 
[proguard] Exception = [java.lang.ArrayIndexOutOfBoundsException] (3113) 
[proguard] java.lang.ArrayIndexOutOfBoundsException: 3113 
[proguard]  at proguard.classfile.editor.CodeAttributeComposer.appendInstruction(CodeAttributeComposer.java:184) 
[proguard]  at proguard.classfile.editor.InstructionAdder.visitConstantInstruction(InstructionAdder.java:74) 
[proguard]  at proguard.classfile.instruction.ConstantInstruction.accept(ConstantInstruction.java:161) 
[proguard]  at proguard.classfile.attribute.CodeAttribute.instructionsAccept(CodeAttribute.java:138) 
[proguard]  at proguard.classfile.attribute.CodeAttribute.instructionsAccept(CodeAttribute.java:110) 
[proguard]  at proguard.classfile.editor.AttributeAdder.visitCodeAttribute(AttributeAdder.java:262) 
[proguard]  at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101) 
[proguard]  at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79) 
[proguard]  at proguard.classfile.editor.MemberAdder.visitProgramMethod(MemberAdder.java:234) 
[proguard]  at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71) 
[proguard]  at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:439) 
[proguard]  at proguard.optimize.peephole.ClassMerger.visitProgramClass0(ClassMerger.java:259) 
[proguard]  at proguard.optimize.peephole.ClassMerger.visitProgramClass(ClassMerger.java:116) 
[proguard]  at proguard.classfile.visitor.ProgramClassFilter.visitProgramClass(ProgramClassFilter.java:52) 
[proguard]  at proguard.classfile.ProgramClass.accept(ProgramClass.java:281) 
[proguard]  at proguard.classfile.LibraryClass.subclassesAccept(LibraryClass.java:370) 
[proguard]  at proguard.classfile.visitor.SubclassTraveler.visitLibraryClass(SubclassTraveler.java:58) 
[proguard]  at proguard.classfile.LibraryClass.accept(LibraryClass.java:248) 
[proguard]  at proguard.classfile.constant.ClassConstant.referencedClassAccept(ClassConstant.java:102) 
[proguard]  at proguard.classfile.visitor.ReferencedClassVisitor.visitClassConstant(ReferencedClassVisitor.java:128) 
[proguard]  at proguard.classfile.constant.ClassConstant.accept(ClassConstant.java:91) 
[proguard]  at proguard.classfile.ProgramClass.superClassConstantAccept(ProgramClass.java:402) 
[proguard]  at proguard.optimize.peephole.HorizontalClassMerger.visitProgramClass(HorizontalClassMerger.java:82) 
[proguard]  at proguard.classfile.ProgramClass.accept(ProgramClass.java:281) 
[proguard]  at proguard.classfile.ClassPool.classesAccept(ClassPool.java:114) 
[proguard]  at proguard.optimize.Optimizer.execute(Optimizer.java:301) 
[proguard]  at proguard.ProGuard.optimize(ProGuard.java:325) 
[proguard]  at proguard.ProGuard.execute(ProGuard.java:114) 
[proguard]  at proguard.ProGuard.main(ProGuard.java:499) 

(2) Способ, который потерпеть неудачу

public static TransactionEntityShadow convertFromLegacy(TransactionEntity legacy) { 
     TransactionEntityShadow result = new TransactionEntityShadow(legacy.getService(), legacy.getAliasCode()); 

     result.setAliasCode     (legacy.getAliasCode()); 
     result.setAmount     (legacy.getAmount()); 
     result.setBeneficiaryAccountNumber (legacy.getBeneficiaryAccountNumber()); 
     result.setBeneficiaryId    (legacy.getBeneficiaryId()); 
     result.setBeneficiaryIdTypeId  (legacy.getBeneficiaryIdTypeId()); 
     result.setBeneficiaryMSISDN   (legacy.getBeneficiaryMSISDN()); 
     result.setBeneficiaryName   (legacy.getBeneficiaryName()); 
     result.setBeta      (legacy.getBeta()); 
     result.setBillContractNumber  (legacy.getBillContractNumber()); 
     result.setBillNumber    (legacy.getBillNumber()); 
     result.setBillSecretCode   (legacy.getBillSecretCode()); 
     result.setContractBeta    (legacy.getContractBeta()); 
     result.setCustomerKey    (legacy.getCustomerKey()); 
     result.setFeesAmount    (legacy.getFeesAmount()); 
     result.setFreeByte1     (legacy.getFreeByte1()); 
     result.setFreeByte2     (legacy.getFreeByte2()); 
     result.setLanguageIndex    (legacy.getLanguageIndex()); 
     result.setMerchantCode    (legacy.getMerchantCode()); 
     result.setMerchantServiceCode  (legacy.getMerchantServiceCode()); 
     result.setPinDigest     (legacy.getPinDigest()); 
     result.setService     (legacy.getService()); 
     result.setSessionKey    (legacy.getSessionKey()); 
     result.setTransactionDate   (legacy.getTransactionDate()); 

     return result; 
    } 

(3) Комментируя несколько строк метода сделает ProGruad не потерпеть неудачу

public static TransactionEntityShadow convertFromLegacy(TransactionEntity legacy) { 
     TransactionEntityShadow result = new TransactionEntityShadow(legacy.getService(), legacy.getAliasCode()); 

     result.setAliasCode     (legacy.getAliasCode()); 
     result.setAmount     (legacy.getAmount()); 
     result.setBeneficiaryAccountNumber (legacy.getBeneficiaryAccountNumber()); 
     result.setBeneficiaryId    (legacy.getBeneficiaryId()); 
     result.setBeneficiaryIdTypeId  (legacy.getBeneficiaryIdTypeId()); 
     result.setBeneficiaryMSISDN   (legacy.getBeneficiaryMSISDN()); 
//  result.setBeneficiaryName   (legacy.getBeneficiaryName()); 
//  result.setBeta      (legacy.getBeta()); 
//  result.setBillContractNumber  (legacy.getBillContractNumber()); 
//  result.setBillNumber    (legacy.getBillNumber()); 
//  result.setBillSecretCode   (legacy.getBillSecretCode()); 
//  result.setContractBeta    (legacy.getContractBeta()); 
     result.setCustomerKey    (legacy.getCustomerKey()); 
     result.setFeesAmount    (legacy.getFeesAmount()); 
     result.setFreeByte1     (legacy.getFreeByte1()); 
     result.setFreeByte2     (legacy.getFreeByte2()); 
     result.setLanguageIndex    (legacy.getLanguageIndex()); 
     result.setMerchantCode    (legacy.getMerchantCode()); 
     result.setMerchantServiceCode  (legacy.getMerchantServiceCode()); 
     result.setPinDigest     (legacy.getPinDigest()); 
     result.setService     (legacy.getService()); 
     result.setSessionKey    (legacy.getSessionKey()); 
     result.setTransactionDate   (legacy.getTransactionDate()); 

     return result; 
    } 

ответ

0

Похоже, что это ошибка/ограничение в версии 4.3 ProGuard. Я перешел к версии 4.4, и проблема решена.

0

Использование -dontoptimize в вашем ProGuard

+0

Это не поможет, как мне нужно оптимизировать. И, как я упоминаю об этом в своем собственном ответе на этот вопрос, это ошибка в версии 4.3, которая была решена в 4.4. – Younes

Смежные вопросы