Android: Proguard NoSuchMethodError - PullRequest
       23

Android: Proguard NoSuchMethodError

3 голосов
/ 17 января 2011

Я недавно активировал ProGuard для своего проекта Eclipse Android.После добавления внешних библиотек и динамически ссылающихся классов в proguard.cfg я не получаю никаких ошибок при сборке apk.Однако я получаю NoSuchMethodError при попытке запустить установленное приложение.

Я сузил его до определенного метода, вызываемого в методе onCreate основного действия.Чтобы упростить ситуацию, вот как выглядят класс и метод (я пропустил много кода, но я думаю, что это должно проиллюстрировать это):

public class TestMain extends TabActivity implements OnSharedPreferenceChangeListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        testMethod();
    }
}

testMethod () определяется следующим образом:

private void testMethod() {
    int charsLeft = maxPostMessageLength - someEditText.length();
    ...
}

Когда я удаляю часть someEditText.length (), приложение запускается.Итак, как я вижу, метод, который не может быть найден, это метод EditText.length ().Странно, однако, приложение также запускается, когда я удаляю «someEditText.length ()» из testMethod и помещаю его непосредственно в метод onCreate:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        test = someEditText.length();
        testMethod();
    }

Кто-нибудь знает, как я могу избавиться от этой ошибкии почему я могу вызвать someEditText.length () непосредственно в методе onCreate, но не в методе, вызываемом методом onCreate?Конечно, без использования Proguard приложение работает нормально.

Редактировать: я пробовал опции -dontshrink, -dontobfuscate и -dontoptimzie в proguard.cfg.С -dontoptimize приложение запускается без ошибок.Тем не менее, было бы интересно, что именно вызывает эту конкретную ошибку.

Ответы [ 4 ]

1 голос
/ 02 марта 2011

Я случайно наткнулся на возможное решение. Ну, это полностью работает в моем случае, так что это решение исходной проблемы: Сегодня я реализовал некоторый код с аннотациями @Override, который сначала не работал. К счастью, у кого-то уже была такая же проблема и простое решение, связанное с Eclipse: «Необходимо переопределить метод суперкласса» Ошибки после импорта проекта в Eclipse

Теперь, я подумал, что если я раньше всегда использовал Java уровня 1.5, почему бы не попробовать ProGuard снова без опции -dontoptimize, теперь, когда я установил его на 1.6. Не повредит ...

И что я могу сказать, теперь приложение запускается, и я не получаю странную ошибку при вызове EditText.length () в методе.

1 голос
/ 17 января 2011

Документация Proguard с гордостью гласит: «Инструмент ProGuard сжимает, оптимизирует и запутывает ваш код, удаляя неиспользуемый код и переименовывая классы».

Что ж, я отказался от «уменьшающей» части послеполучать ошибки во время выполнения, как вы описали.Я добавил строку

-dontshrink

в proguard.cfg

. Вы можете увидеть, какие подпрограммы были удалены из вашего кода, проверив файл using.txt.Я счастлив сказать, что в моих проектах это всегда отсутствует, что означает, что код запутан, но ничего не удалено.Я не получаю никаких ошибок во время выполнения.

0 голосов
/ 17 августа 2011

У меня была проблема, похожая на OP, и она оказалась опцией конфигурации proguard, которую я установил -allowaccessmodification, устранение этой проблемы решило.

0 голосов
/ 07 февраля 2011

Оптимизатор может удалить вызов метода и метод, если он приходит к выводу, что метод не имеет побочных эффектов. Это никогда не должно создавать противоречивый код, хотя, и я не знаю такой проблемы, как эта. Вы должны проверить, сохраняется ли это с последней версией ProGuard. В противном случае вам следует отправить отчет об ошибке на сайте ProGuard, желательно с небольшим примером, иллюстрирующим проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...