Kompilieren mit Proguard gibt SimException: "local variable type mismatch"

Wenn ich meine Android-Anwendung mit Proguard aktiviert habe, bekomme ich folgende Fehlermeldung:

-dex: [echo] Converting compiled files and external libraries into /home/ka/dev/workspace/ImPress/build/classes.dex... [apply] [apply] UNEXPECTED TOP-LEVEL EXCEPTION: [apply] com.android.dx.cf.code.SimException: local variable type mismatch: attempt to set or access a value of type java.io.File using a local variable of type java.lang.Object[]. This is symptomatic of .class transformation tools that ignore local variable information. [apply] at com.android.dx.cf.code.BaseMachine.throwLocalMismatch(BaseMachine.java:550) [apply] at com.android.dx.cf.code.BaseMachine.getLocalTarget(BaseMachine.java:405) [apply] at com.android.dx.cf.code.BaseMachine.storeResults(BaseMachine.java:532) [apply] at com.android.dx.cf.code.ValueAwareMachine.run(ValueAwareMachine.java:197) [apply] at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:291) [apply] at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:608) [apply] at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:526) [apply] at com.android.dx.cf.code.Simulator.simulate(Simulator.java:99) [apply] at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:684) [apply] at com.android.dx.cf.code.Ropper.doit(Ropper.java:639) [apply] at com.android.dx.cf.code.Ropper.convert(Ropper.java:252) [apply] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:252) [apply] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131) [apply] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85) [apply] at com.android.dx.command.dexer.Main.processClass(Main.java:369) [apply] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:346) [apply] at com.android.dx.command.dexer.Main.access$400(Main.java:59) [apply] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:294) [apply] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244) [apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:130) [apply] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108) [apply] at com.android.dx.command.dexer.Main.processOne(Main.java:313) [apply] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:233) [apply] at com.android.dx.command.dexer.Main.run(Main.java:185) [apply] at com.android.dx.command.dexer.Main.main(Main.java:166) [apply] at com.android.dx.command.Main.main(Main.java:90) [apply] ...at bytecode offset 00000006 [apply] locals[0000]: Lcom/officemax/impress/ui/library/task/DocumentBrowserTask; [apply] locals[0001]: [Ljava/lang/Object; [apply] locals[0002]: <invalid> [apply] ...while working on block 0006 [apply] ...while working on method doTaskJob:([Ljava/lang/Object;)Lcom/kaciula/utils/ui/BasicTaskResponse; [apply] ...while processing doTaskJob ([Ljava/lang/Object;)Lcom/kaciula/utils/ui/BasicTaskResponse; [apply] ...while processing com/officemax/impress/ui/library/task/DocumentBrowserTask.class [apply] [apply] 1 error; aborting 

Wie kann ich dieses Problem beheben?

  • Glas-Sprachbefehl am nächsten aus der angegebenen Liste
  • Wie man Eclipse's "Export-Jar" aus der Kommandozeile macht
  • Android XML schneidet die Hälfte des Layouts ab
  • Wearable.NodeApi.getConnectedNodes Ergebnis nie aufgerufen
  • Wie kann ich das "mksdcard SDK Tool" bei der Installation von Android Studio auf Fedora 21 nicht ausführen?
  • Adb shell su funktioniert aber adb root nicht
  • Status sagt Entwurf in Prod
  • Arrayadapter.getcount Nullpunktausnahme
  • Libgdx seltsame Modellierung - Tiefenfehler?
  • Kampagnenmessung mit eigenem BroadcastReceiver
  • Wie benutzt man android exoplayer
  • Wie zeigt man einen Dialog an, um zu bestätigen, dass der Benutzer eine Android-Aktivität beenden möchte?
  • 4 Solutions collect form web for “Kompilieren mit Proguard gibt SimException: "local variable type mismatch"”

    Der eigentliche Proguard-Teil beendet, aber dann kann dex den resultierenden Bytecode nicht mehr umwandeln. Dex betrachtet die LocalVariableTable falsch. Eric Lafortune ist die bessere Quelle, um zu erklären, warum (siehe seine Antwort).

    Das Problem geht weg, wenn man nicht nur nicht verschleiern, sondern auch den Optimierungsschritt überspringen ( -dontoptimize ). Aber du willst das für die Größenreduktion haben. Ein weiterer Weg, um es zu lösen ist, die Debug-Flags in javac und in dex . Nur das Problem ist, dass du dann auch keine richtigen Stacktracks hättest. Sie erhalten Stacktrace-Linien ohne Quelldatei Info oder Zeilennummern wie:

     net.lp.collectionista.domain.items.book.BookItem.getCoverImageForFormField(Unkno‌​wn Source) 

    Sie können dies tun, indem Sie debug="false" im javac Tag in der ant main-rules.xml (Sie können das Teil zunächst in eine build.xml ). Dies wird eine Flagge javac -g:none . Sie müssen auch dex konfigurieren und das ist schwerer in der mitgelieferten Ant-Vorlage zu tun. Ich kopierte das dex-helper Makro, stellte sicher, dass es verwendet wurde, und fügte eine Bedingungs-Tag um die Dex-Anrufe:

      <echo>Converting compiled files and external libraries into ${intermediate.dex.file}...</echo> <if condition="debug"> <then> <apply executable="${dx}" failonerror="true" parallel="true"> <arg value="--dex" /> <arg value="--output=${intermediate.dex.file}" /> <extra-parameters /> <arg line="${verbose.option}" /> <arg path="${out.dex.input.absolute.dir}" /> <path refid="out.dex.jar.input.ref" /> <external-libs /> </apply> </then> <else> <apply executable="${dx}" failonerror="true" parallel="true"> <arg value="--dex" /> <arg value="--output=${intermediate.dex.file}" /> <arg value="--no-locals" /><!-- otherwise dex fails on the proguard bytecode --> <extra-parameters /> <arg line="${verbose.option}" /> <arg path="${out.dex.input.absolute.dir}" /> <path refid="out.dex.jar.input.ref" /> <external-libs /> </apply> </else> </if> 

    Es ist die – --no-locals , die es tut.

    Um den Verlust von Stacktrace-Informationen zu verringern, können Sie jeweils für Zeilennummerinformationen und Klassen- und Methodennameninformationen verwenden:

     -keepattributes SourceFile, LineNumberTable -keep,allowshrinking,allowoptimization class * { <methods>; } 

    Auf diese Weise können Sie partielle Verschleierung machen und haben immer noch gleich gute Stacktracks. Ich schlage noch vor, dass du die Mapping-Dateien bei der Freigabe erstellt und beibehältest.

    Darüber hinaus sollten Sie nicht spezifizieren -keepattributes LocalVariableTable,LocalVariableTypeTable und gleich -keepparameternames (wenn Sie obfuscate tun, könnte dies selbst Sie auch in Schwierigkeiten bringen). Beachten Sie, dass die zweite impliziert die erste, obwohl es nicht klar sein, aus seinem Namen, dass es Auswirkungen auf Attribute.

    Persönlich, und im Hinblick auf andere Probleme mit Proguard, entschied ich mich, die Verschleierung zu tun, aber den Verlust von Stacktrace-Informationen zu mildern. Ich habe noch nicht den Vorschlag des Pflügers versucht.

    Für weitere Details finden Sie hier meine versionsgesteuerten Projektdateien:

    • Proguard.cfg

    • Build.xml

    Ich lief in das gleiche Problem nach dem Hinzufügen der -dontobfuscate Flagge zu meinem proguard.cfg Datei.

    Die Lösung endete, dass ich diese zu meinen Optimierungen hinzufügen musste:

     !code/allocation/variable 

    Das macht meine komplette Optimierungsstring so aus:

     -optimizations !field/removal/writeonly,!field/marking/private,!class/merging/*,!code/allocation/variable 

    Dies ist ein Fehler in ProGuard. Der Optimierungsschritt aktualisiert die optionalen "LocalVariableTable" und "LocalVariableTypeTable" Debugattribute in Klassendateien nicht vollständig korrekt. Die Dalvik VM prüft explizit die Debug-Attribute und lehnt die Klassendateien ab, wenn sie inkonsistent sind.

    Sie sollten überprüfen, ob die neueste Version von ProGuard das Problem behebt. Andernfalls sollten Sie lokale Variablennamen und -typen aus den Klassendateien entfernen. Sie können den Java-Compiler bitten, sie nicht zu erzeugen (zB "javac -g: none"). Sie können auch ProGuard bitten, sie nicht zu behalten (nicht angeben "-keepattributes LocalVariableTable, LocalVariableTypeTable").

    Ich hatte gerade diese Uebersetzung auf Windows Android Studio, und deaktivieren Instant Run machte Dinge wieder arbeiten.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.