Может ли обфускация (прогард) привести к неисправности мидлета?

Я пытаюсь запутать Java-мидлет с помощью proguard. Он нормально работает на ПК, однако, когда я запускаю его на телефоне, программа открывается, подключается к серверу, а затем зависает. Если я отключу обфускацию, она снова будет нормально работать на телефоне. Я пробовал все уровни обфускации для приложений (7, 8 и 9 в NetBeans), и, похоже, ни один из них не работает должным образом, и я не могу выпустить это приложение для коммерческого использования без обфускации. Также компилятор выдает некоторые предупреждения:

Note: duplicate definition of library class [java.io.ByteArrayOutputStream]
Note: there were 14 duplicate class definitions.

Но я не знаю, действительно ли это проблема. Кто-нибудь знает, что не так? Аргументы обфускатора перечислены ниже:

Obfuscator Arguments (7):
    -dontusemixedcaseclassnames
    -default package ''
    -keep public class ** {
        public *;
    }

Obfuscator Arguments (8): same as (7) plus -overloadaggressively.

Obfuscator Arguments (9): same as (8) but
    -keep public class ** extends javax.microedition.midlet.MIDlet {
        public *;
    }
instead.

Спасибо.


person eMgz    schedule 20.05.2010    source источник


Ответы (1)


Обфускация может что-то сломать. Без кода примера в горшке трудно сказать, что именно может быть не так. Пример того, что может пойти не так, - это если вы загрузите класс в свой код по имени - обфусцированный класс будет иметь другое имя и, следовательно, не будет найден.

Упомянутые вами сообщения могут указывать на проблему - у вас должны быть эти классы не раз на вашем пути. Этот класс, который вы упомянули, имеет отношение к соединению, с которым у вас проблемы? Внимательно посмотрите на используемые jar-файлы и убедитесь, что в ваше приложение включен правильный (и минимальный) набор классов. ByteArrayOutputStream в CLDC не то же самое как на рабочем столе JDK.

person martin clayton    schedule 20.05.2010
comment
Да, я знаю, что без кода трудно найти проблему, но я не знаю, какая часть кода вызывает это, так как в системе много классов, и я не могу вставить их сюда. Я показываю только две последние строки предупреждений, потому что классы кажутся слишком общими, чтобы дать мне подсказку о том, где находится ошибка, например: Примечание: повторяющееся определение класса библиотеки [javax.microedition.media.control.VolumeControl], и у меня даже нет звука или каких-либо носителей в моем приложении ... Я посмотрю, есть ли какой-то внешний вызов, который может вызвать это, как вы указали, спасибо. - person eMgz; 21.05.2010
comment
@eMgz - можно ли свести код к очень короткому фрагменту, который демонстрирует такое же зависание? (Может помочь вам разобраться в проблеме, даже если слишком много кода для публикации.) - person martin clayton; 21.05.2010
comment
Я так не думаю, есть много классов для обработки хранилища записей, соединений, потоков, изображений и так далее, но я пытаюсь отлаживать один за другим, используя параметр -keep. Спасибо, в любом случае. - person eMgz; 22.05.2010
comment
хорошо, для записи: proguard.sourceforge.net/manual/troubleshooting.html#runtime Проблема была из-за оптимизации. По какой-то причине он облажался с потоком, который должен вызвать другой экран, поэтому использование -dontoptimize решает проблему. - person eMgz; 24.05.2010