2011-08-19 1 views
1

나는 최적화 통과 중에 프로 가드를 깨는 큰 기능을 가지고 있습니다. 긴 함수와 최적화를 유지하고 싶습니다. 이것이 가능한가? 더 큰 기능을 처리하기 위해 프로 가드를 설득 할 수있는 방법이 있습니까?Proguard : 큰 기능을 처리하는 방법

코드는 Eclipse에서 컴파일되고 Android 장치에서 실행됩니다. 그것은 내 릴리스 빌드 스크립트의 프로 가드 최적화 단계입니다. 함수에서 30 개의 홀수 줄을 제거하면 제대로 빌드되지만 분명히 제대로 실행되지 않습니다.

내 큰 기능은 상태 시스템을 에뮬레이트하는 스위치 기능입니다. 상태 머신이 진행됨에 따라 다양한 방식으로 조정되는 약 5 개의 별개의 관련 변수가 있습니다. 내 기능을 해칠 수 있지만 하위 기능 간의 결합 바람직하지 것입니다.

귀무 포인터 예외에서 스택 추적 :

[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) 

답변

6

최적화 긴 방법은 시간이 오래 걸릴 수 있지만, 실패해서는 안된다. 이 오류 메시지는 ProGuard의 버그를 나타냅니다. latest version (수정 시점의 4.6)에서 수정되지 않았는지 확인해야합니다. 그렇지 않으면 ProGuard's bug tracker에 신고해야합니다. 내가 문제를 재현 할 수있는 테스트 케이스를 제공 할 수 있다면, 나는 그것을 조사 할 것이다.

+1

감사합니다. 현재 버전 4.4이므로 4.6으로 업그레이드하고 다시 시도하겠습니다. 그래도 작동하지 않으면 게시 할 수있는 재현 가능한 테스트 사례를 추출하려고합니다. – Colin

+1

버전 4.6이 내 문제를 해결했습니다! 업데이트 링크에 ​​많은 감사드립니다. Proguard는 Android Eclipse 설정 (최신 버전이라고 생각)의 일부로 제공되었으므로 업그레이드 할 수있는 별도의 구성 요소라는 것을 알지 못했습니다. 지금 할게. – Colin