2017-07-31 46 views
11

Rozwijamy aplikację na komputery stacjonarne. Uruchamiając PROGUARD (wersja 5.3.3) na kod stosując następujące flagi konfiguracyjne:Proguard - Nie można znaleźć wspólnej super klasy/java.lang.VerifyError

-dontoptimize 
-allowaccessmodification 
-dontusemixedcaseclassnames 
-dontwarn 

Proguard daje następujący błąd:

Unexpected error while performing partial evaluation: 
    Class  = [com/code/backend/e/b/b] 
    Method  = [b(Ljava/lang/String;)Ljava/nio/file/Path;] 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes)) 
Unexpected error while preverifying: 
    Class  = [com/code/backend/e/b/b] 
    Method  = [b(Ljava/lang/String;)Ljava/nio/file/Path;] 
    Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes)) 


FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task 'proguard'. 
> Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes) 

Jeśli flaga -dontpreverify jest dodawany do konfiguracji kompilacji odniesie sukces. Jednak podczas uruchamiania pliku JAR-my wtedy pojawia się następujący błąd:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 11 
Exception Details: 
    Location: 
    com/code/code2/MainWindow.b(Lcom/code/code2/ClientAPIProtos$SoftwareStatus;)V @1: ifnull 
    Reason: 
    Expected stackmap frame at this location. 
    Bytecode: 
    0x0000000: 2bc6 000a 2ab4 00bc c700 04b1 2bb2 00a4 
    0x0000010: a500 0a2b b800 f599 0018 2ab4 00bc b601 
    0x0000020: 9299 0020 2ab4 00bc 03b6 0193 a700 152a 
    0x0000030: b400 bcb6 0192 9a00 0b2a b400 bc04 b601 
    0x0000040: 932b b800 f699 0012 1225 4db8 0138 4e2a 
    0x0000050: 04b5 00c8 a700 0f12 1e4d b801 3a4e 2a03 
    0x0000060: b500 c82a b400 bcb6 0191 3a04 1904 c600 
    0x0000070: 0c2c 1904 b601 799a 000b 2ab4 00bc 2cb6 
    0x0000080: 0195 2ab4 00bc b601 903a 0519 05c6 0009 
    0x0000090: 2d19 05a5 000b 2ab4 00bc 2db6 0194 b1 

    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048) 
    at java.lang.Class.getMethod0(Class.java:3018) 
    at java.lang.Class.getMethod(Class.java:1784) 
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) 

których można uniknąć za pomocą flag JVM -noverify. Czytając wątek:

Obfuscation causes VerifyError: Expecting a stackmap frame

Chcielibyśmy uniknąć tych flagi „nie weryfikacja”, jeśli to możliwe.

Uwaga: Błąd kompilacji występuje nawet podczas dodawania

-dontobfuscate 
-dontshrink 

Odpowiedz

6

Podajesz opcję -dontwarn, aby pominąć ostrzeżenia o nierozwiązanych referencjach. Może to powodować problemy podczas przetwarzania kodu. ProGuard potrzebuje tych referencji, np. w etapie wstępnej weryfikacji. Błąd rzeczywiście sugeruje, że dane wejściowe nie zawierają wszystkich niezbędnych zależności: brakuje wspólnej wspólnej nadklasy lub interfejsu ImmutableList i UnmodifiableIterator. W przypadku aplikacji na pulpicie, należy sprawdzić, czy jesteś określając Java Runtime słoik ze wszystkimi niezbędnymi klas:

-libraryjars <java.home>/lib/rt.jar 

Zobacz instrukcję PROGUARD> Rozwiązywanie problemów>Warning: can't find superclass or interface

2

inicjalizacji weryfikacji i walidacji są częścią projektu budowlanego. Wierzę, że flaga -następna modulacja ma pozwolić na modyfikację podczas budowania projektu, tzn. Twoje klasy są modyfikowane z oryginalnej struktury. Kiedy oryginalna struktura klasowa zostanie zmodyfikowana niż ich stosy, klatki zostają zakłócone. To prowadzi do niepowodzenia weryfikacji. Jeśli chcesz zignorować błąd weryfikacji, to jak wspomniano, musisz użyć flagi, która zawiesza weryfikację.

1

Troubleshooting

ProGuard może drukować kilka uwag i ostrzeżeń niekrytycznych:

Uwaga: nie można znaleźć klasy z dynamicznym odwołaniem ProGuard nie może znaleźć klasy lub interfejsu, do którego uzyskuje dostęp twój kod s introspekcji. Powinieneś sprawdzić, czy chcesz dodać słoik zawierający tę klasę.

Uwaga: ... wywołania '(...) Class.forName (variable) .newInstance()' ProGuard wyświetla wszystkie klasy rzuceń dynamicznie tworzonych wystąpień klas, takich jak "(MyClass) Class.forName (variable) .newInstance() ". W zależności od aplikacji, może być konieczne utrzymywanie wspomnianych klas za pomocą opcji takiej jak "-keep class MyClass" lub ich implementacji z opcją taką jak "-keep class * implementuje MyClass". Możesz wyłączyć te notatki, określając opcję -dontnote.

Uwaga: ... dynamicznie korzysta z pola/metody "..." ProGuard wymienia wiele konstrukcji, takich jak ".getField (" myField ")".W zależności od aplikacji może zajść potrzeba wykrycia, gdzie wspomniani członkowie klasy są zdefiniowani i utrzymania ich za pomocą opcji, takiej jak "-keep class MyClass {MyFieldType myField;}". W przeciwnym razie ProGuard może usunąć lub zaciemnić członków klasy, ponieważ nie może wiedzieć, którzy z nich są dokładnie. Zawiera listę potencjalnych kandydatów, dla twoich informacji. Możesz wyłączyć te notatki, określając opcję -dontnote.