Ошибка: не удается найти общий суперкласс - PullRequest
11 голосов
/ 07 апреля 2010

Я пытаюсь обработать с помощью Proguard настольное приложение MS Windows (Java 6 SE с использованием библиотеки SWT, предоставленной Eclipse). И я получаю следующую критическую ошибку:

Unexpected error while performing partial evaluation:
Class = [org/eclipse/swt/widgets/DateTime]
Method = [<init>(Lorg/eclipse/swt/widgets/Composite;I)V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR])
Error: Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR]
----------------------------

Когда я попытался прогуглить ошибку, она появилась только в двух местах во всей сети, что меня очень удивило. Я новичок в использовании инструментов оптимизации кода Proguard и Java. Любые мысли и предложения, как это исправить, будут оценены. Заранее спасибо.

Вышеназванная ошибка теперь исправлена, с использованием "-dontskipnonpubliclibraryclasses"

- окончательное обновление:

Я все еще получаю еще одну ошибку. Весь вывод теперь следующий:

D:\eclipse_projs\java_obfuscate\gci>gci.bat
ProGuard, version 4.4
Reading program jar [D:\eclipse_projs\java_obfuscate\gci\gci.jar]
Reading library jar [D:\jre1.6.0_07\lib\rt.jar]
Unexpected error while evaluating instruction:
  Class       = [org/eclipse/swt/widgets/Synchronizer]
  Method      = [runAsyncMessages(Z)Z]
  Instruction = [60] aload_1 v1
  Exception   = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
Unexpected error while performing partial evaluation:
  Class       = [org/eclipse/swt/widgets/Synchronizer]
  Method      = [runAsyncMessages(Z)Z]
  Exception   = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
 Error: Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue]

D:\eclipse_projs\java_obfuscate\gci>

Это проблема, которую я не могу понять наверняка :( любая помощь будет высоко ценится.

Опции, которые я использую, следующие:

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-optimizationpasses 3
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-dontnote

Ответы [ 4 ]

7 голосов
/ 07 апреля 2010

Попробуйте добавить параметр -dontskipnonpubliclibraryclasses в командную строку.

Из Руководства Proguard :

Ограничения

Для эффективностиProGuard всегда игнорирует любые закрытые или видимые библиотечные классы при чтении библиотечных jar-файлов.Если какой-либо из них расширяется классами публичной библиотеки, а затем снова расширяется классами ввода, ProGuard будет жаловаться, что не может их найти.В этом случае вам придется использовать параметр
-dontskipnonpubliclibraryclasses, а может быть, даже параметр -dontskipnonpubliclibraryclassmembers.Графический интерфейс пользователя имеет флажки для этих настроек.
1 голос
/ 02 мая 2012

У меня была та же проблема, но я не пытался указать -dontskipnonpubliclibraryclasses или какой-либо другой параметр, чтобы исправить. Моя проблема возникла в классе java.lang.StringBuffer, что было очень странно. StringBuffer класс использовался во всем проекте, и ошибка больше не возникала.

Чтобы исправить, все, что я сделал, это переместил область действия StringBuffer.

СТАРЫЙ код - с ошибкой:

function(){
   if(condition){
       StringBuffer buffer = new StringBuffer();
       //additional code
   }else if(condition){
       StringBuffer buffer = new StringBuffer();
       //additional code
   }
}

НОВЫЙ код - без проблем.

function(){
    StringBuffer buffer = new StringBuffer();

       if(condition){

           //additional code
       }else if(condition){

           //additional code
       }
    }

У меня такое ощущение, что это как-то связано с ProGuard и с тем, как он анализирует код.

0 голосов
/ 11 октября 2017

У меня была проблема с приложением в зависимости от различных других проектов. Я попробовал перечисленные решения, но ни одно из них не помогло. Судя по тестам, шаги сжатия и предварительной проверки выполнялись правильно, оптимизация вызвала ошибку:

> java.io.IOException: java.lang.IllegalArgumentException: Can't find common super class of [java/io/File] (with 2 known super classes) and [org/antlr/v4/runtime/tree/gui/TreeViewer] (with 1 known super classes)

Я пытался сохранить (-keep options) оба класса, но безуспешно. Основываясь на других потоках, я нашел минимальное решение - отключить оптимизацию переменных:

-optimizations !code/allocation/variable

Это позволяет мне успешно компилироваться, но имеет свои недостатки.

0 голосов
/ 07 апреля 2010

Попробуйте удалить параметр -dontnote.У вас могут быть дубликаты определений, для которых вы не получаете предупреждения, или вы игнорируете предупреждения.

...