Различия в экспортированном, подписанном apk и версии, запущенной в отладчике Eclipse? Сериализуемый класс, вызывающий проблемы

Надеюсь, это не будет слишком многословно, но попытка будет завершена:

Итак, у меня есть приложение на Android Market. В приложении есть несколько сериализуемых классов. Приложение отлично работает везде (в эмуляторе, на телефоне для отладки, на телефонах, которые загружают приложение).

Я принял решение добавить некоторые функции. Эти функции включают реализацию Comparable на одном из моих сериализуемых классов. В Eclipse (эмулятор или подключенный телефон) изменения кажутся действительными. Также в соответствии с этим документом Java, я думаю, что изменения являются действительными изменениями в Serializable классе.

Теперь к проблеме. Кажется, что после экспорта подписанного apk у меня происходит сбой в приложении. Сбои происходят при первом прикосновении к измененному классу. Трассировка стека запутана, и детали не слишком важны (я думаю), но это исключение NullPointerException, вызывающее сбой приложения.

Вот измененный код из моих экспериментов:

Сравнимая версия:

public class Card implements Serializable, Comparable<Card>{

с добавленным методом:

public int compareTo(Card another) {
        if( another.getName() == null ) return -1;
        if( this.getName() == null ) return 1;
        return this.getName().compareTo(another.getName());
    }

Обычная / оригинальная версия:

public class Card implements Serializable/*, Comparable<Card>*/{

без добавления метода.

Классы идентичны в противном случае. Обратите внимание, что getName() возвращает строку.

Я выполнил следующий эксперимент:

  1. Удалить приложение полностью с моего телефона.
  2. Создайте приложение без сопоставимого изменения кода и запустите на моем телефоне через Eclipse. (работает нормально).
  3. Реализуйте изменение Comparable и запустите на моем телефоне через Eclipse. (работает нормально).

Здесь нет проблем. Теперь я экспортировал подписанную версию каждой сборки, описанной выше.

  1. Удалить приложение полностью с моего телефона.
  2. Экспорт подписанной версии приложения без сопоставимых изменений. Загрузить на телефон используя: adb install com.myapp (работает нормально).
  3. Экспорт подписанной версии приложения с сопоставимым изменением. Загрузить с помощью ADB. Сбой при доступе к ранее сохраненному (NullPointerException).

И в качестве проверки работоспособности я сделал следующее:

  1. Удалить приложение полностью с телефона.
  2. установите экспортированную подписанную версию приложения с сопоставимым изменением. Нет проблем.

Обратите внимание, что причина НЕ деинсталляции между шагами 1. и 2. заключается в том, чтобы симулировать конечного пользователя, сохраняющего его / ее данные между обновлениями (важная функция здесь). Также обратите внимание, что последняя проверка работоспособности, приведенная выше, дает мне уверенность, что это проблема с переходом на класс Serializeable.

Итак, фундаментальные вопросы: каковы различия между подписанным, экспортированным приложением и версией, запущенной из Eclipse? Есть ли причина, по которой корректное изменение класса Serializable может нарушить работу приложения после экспорта?

1 ответ

Решение

Похоже, это проблема, вызванная запутыванием. Приложение, которое вы запускаете через Eclipse, также подписано, просто с другим ключом / сертификатом, так что никакой реальной разницы нет. Если вы используете ProGuard, экспорт версии 'release' также запутывает код, и в процессе некоторые классы или методы могут быть удалены (если ProGuard считает, что они не используются). Так что трассировка стека важна, и вам нужно выяснить, где именно происходит NPE. Затем настройте ProGuard, чтобы игнорировать этот класс / метод, и повторите тестирование.

Другие вопросы по тегам