2017-07-31 32 views
11

Bir masaüstü uygulaması geliştiriyoruz.Proguard - Ortak süper sınıf bulunamadı/java.lang.VerifyError

-dontoptimize 
-allowaccessmodification 
-dontusemixedcaseclassnames 
-dontwarn 

Proguard aşağıdaki hatayı veriyor: Aşağıdaki yapılandırma bayraklarını kullanarak kod üzerinde ProGuard (versiyon 5.3.3) çalıştırırken

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) 

bayrak -dontpreverify yapılandırmasına inşa eklenirse başarılı olacak.

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) 

JVM bayrak -noverify kullanılarak önlenebilir: kavanoz dosyası çalıştıran Ancak biz sonra aşağıdaki hatayı alıyorum. parçacığı Okuma:

Obfuscation causes VerifyError: Expecting a stackmap frame

Mümkünse bu 'hayır doğrulama' bayraklarını önlemek istiyoruz.

Not: yapı projesi parçası

-dontobfuscate 
-dontshrink 

cevap

6

Çözümlenmemiş referanslar hakkındaki uyarıları bastırmak için -dontwarn seçeneğini belirtiyorsunuz. Bu, kod işlenirken sorunlara yol açabilir. ProGuard'ın bu referanslara, ör. önleyici adımda. Hata aslında girişin gerekli tüm bağımlılıkları içermediğini gösterir: Bazı ortak süper sınıf veya ImmutableList ve UnmodifiableIterator arabirimi eksik. bir masaüstü uygulaması için, gereken tüm sınıfları ile Java Runtime kavanoz belirterek olduğunuzu kontrol etmelidir:

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

ProGuard kılavuzuna bakın> Sorun Giderme>Warning: can't find superclass or interface

2

Başlatma, doğrulama ve doğrulama edilir eklerken yapı hata da oluşur. Ben flag -allowaccessmodification projeyi oluştururken, yani sınıflarınızın orijinal yapısından değiştirilirken değişiklik yapmaya izin verdiğine inanıyorum. Orijinal sınıf yapısı, yığınlarından daha modifiye edildiğinde çerçeveler bozulur. Bu doğrulama başarısızlığına yol açar. Doğrulama hatasını yok saymak istiyorsanız, söz konusu şekilde doğrulama işlemini askıya alan bayrağı kullanmanız gerekir.

1

Troubleshooting

ProGuard yazdırabilirsiniz bazı notlar ve ölümcül olmayan uyarılar:

Not: Dinamik olarak başvurulan sınıfı bulamıyor ProGuard kodunuzun eriştiği bir sınıfı veya arabirimi bulamıyor iç gözlem. Bu sınıfı içeren bir jar eklemek isteyip istemediğinizi kontrol etmelisiniz.

Not: ... aramaları '(...) Class.forName (variable) .newInstance()' ProGuard, dinamik olarak oluşturulan sınıf örneklerinin "(MyClass) Class.forName (değişken) gibi tüm sınıf yayınlarını listeler. .newInstance()". Uygulamanıza bağlı olarak, söz konusu sınıfları "-keep class MyClass" gibi bir seçenekle veya "-keep sınıfı * MyClass uygular" gibi bir seçenekle uygulamalarında tutmanız gerekebilir. -dontnote seçeneğini belirterek bu notları kapatabilirsiniz.

Not: ... dinamik olarak ProGuard ".getField (" myField ") gibi bir dizi yapıyı listeler.Uygulamanıza bağlı olarak, söz konusu sınıf üyelerinin nerede tanımlandığını bulup bunları "-keep class MyClass {MyFieldType myField;}" gibi bir seçenekle tutturmanız gerekebilir. Aksi takdirde, ProGuard sınıf üyelerini kaldırabilir veya engelleyebilir, çünkü tam olarak hangileri olduğunu bilemez. Bilgileriniz için olası adayları listeliyor. -dontnote seçeneğini belirterek bu notları kapatabilirsiniz.

İlgili konular