Proguard: как справляться с большими функциями - PullRequest
1 голос
/ 19 августа 2011

У меня есть большая функция (я знаю, см. Ниже), которая ломает Proguard во время прохода оптимизации.Я хотел бы сохранить как длинную функцию, так и оптимизацию.Это возможно?Есть ли способ убедить proguard обрабатывать большие функции?

Код компилируется в Eclipse и работает на устройстве Android.Это неудачный шаг оптимизации моего сценария сборки выпуска.Если я удаляю 30 нечетных строк из функции, она строится нормально, но, очевидно, работает неправильно.

Моя большая функция - это функция переключения, которая эмулирует конечный автомат.Существует около пяти отдельных, но связанных переменных, которые по-разному корректируются по мере продвижения конечного автомата.Я мог бы разбить мою функцию, но связь между подфункциями была бы нежелательна.

Трассировка стека из исключения Null Pointer:

 [proguard] Shrinking...
 [proguard] Removing unused program classes and class elements...
 [proguard]   Original number of program classes: 176
 [proguard]   Final number of program classes:    173
 [proguard] Optimizing...
 [proguard] Unexpected error while evaluating instruction:
 [proguard]   Class       = [com/.../Screen]
 [proguard]   Method      = [switchToView$26d62a66(Lcom/...;Ljava/lang/String;)V]
 [proguard]   Instruction = [20] iload v4
 [proguard]   Exception   = [java.lang.NullPointerException] (null)
 [proguard] Unexpected error while performing partial evaluation:
 [proguard]   Class       = [com/.../Screen]
 [proguard]   Method      = [switchToView$26d62a66(Lcom/.../View;Ljava/lang/String;)V]
 [proguard]   Exception   = [java.lang.NullPointerException] (null)

BUILD FAILED
/Users/colin/Android/.../build.xml:527: java.lang.NullPointerException
    at proguard.evaluation.Variables.iload(Variables.java:228)
    at proguard.evaluation.Processor.visitVariableInstruction(Processor.java:645)
    at proguard.classfile.instruction.VariableInstruction.accept(VariableInstruction.java:306)
    at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:729)
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:575)
    at proguard.optimize.evaluation.PartialEvaluator.visitExceptionInfo(PartialEvaluator.java:1063)
    at proguard.classfile.visitor.ExceptionHandlerFilter.visitExceptionInfo(ExceptionHandlerFilter.java:67)
    at proguard.classfile.attribute.CodeAttribute.exceptionsAccept(CodeAttribute.java:186)
    at proguard.optimize.evaluation.PartialEvaluator.evaluateExceptionHandlers(PartialEvaluator.java:1003)
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:540)
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:221)
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:180)
    at proguard.optimize.evaluation.LivenessAnalyzer.visitCodeAttribute(LivenessAnalyzer.java:195)
    at proguard.optimize.evaluation.VariableOptimizer.visitCodeAttribute(VariableOptimizer.java:102)
    at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
    at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79)
    at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95)
    at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91)
    at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71)
    at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:439)
    at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47)
    at proguard.classfile.ProgramClass.accept(ProgramClass.java:281)
    at proguard.classfile.ClassPool.classesAccept(ClassPool.java:114)
    at proguard.optimize.Optimizer.execute(Optimizer.java:764)
    at proguard.ProGuard.optimize(ProGuard.java:325)
    at proguard.ProGuard.execute(ProGuard.java:114)
    at proguard.ant.ProGuardTask.execute(ProGuardTask.java:279)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
    at com.android.ant.IfElseTask.execute(IfElseTask.java:120)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:809)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

1 Ответ

6 голосов
/ 20 августа 2011

Оптимизация длинных методов может занять много времени, но не должна завершиться неудачей. Это сообщение об ошибке указывает на ошибку в ProGuard. Вы должны проверить, не было ли это исправлено в последней версии (4.6 на момент написания статьи). В противном случае вы должны сообщить об этом на трекере ошибок ProGuard . Если вы можете предоставить контрольный пример, который позволит мне воспроизвести проблему, я рассмотрю ее.

...