2016-03-28 4 views
4

Испытывает новую функцию авто восстановления/восстановления Android 6 и сталкивается с проблемой сбой приложения сразу после восстановления. Дальнейшее исследование показало, что метод инициализации Application.onCreate() не вызывался перед основным методом Activity.onCreate(). Это кажется мне вероятной ошибкой в ​​новой логике autorestore. Но я думал, что попрошу совета здесь, прежде чем сообщить об этом в качестве официальной ошибки.Android 6 автоматическое восстановление не инициализирует приложение

Последовательность событий я пройти через это

  1. Запустите приложение, всегда открыть главное окно деятельности.
  2. Заставьте резервную копию данных приложения, введя

    ADB оболочки bmgr fullbackup net.anei.cadpage

  3. Используйте менеджер приложение, чтобы заставить закрыть приложение и удалить все данные приложения и кэш
  4. восстановление приложения информации с

    ADB оболочки bmgr восстановления

  5. Вручную запустите приложение

Результирующие журналы показывают, что метод Activity.onCreate() вызывается перед Application.onCreate(). Приложение аварийно завершает работу, потому что некоторая критическая инициализация не выполнялась методом Application.onCreate().

Есть ли что-то очевидное, что мне не хватает ???

FWIW, запуск приложения во второй раз после сбоя работает отлично.

ответ

2

Это на самом деле намеренный, хотя и навязчивый.

Для операций резервного копирования и восстановления полной информации пакет запускается с базовым классом экземпляром приложения, а не вашим подклассом манифеста. Это связано с тем, что, к сожалению, многие приложения открывают файлы или базы данных через подклассы приложений, и это блокирует способность механизма резервного копирования правильно читать/записывать базовые файлы. Точно так же поставщики контента вашего приложения автоматически не создаются для операций резервного копирования и восстановления с полным объемом данных. После этого процесс приложения будет уничтожен после операции, так как ваше приложение не сможет нормально работать без ожидаемого подкласса приложения или поставщиков контента.

Вы также не сказать точно, какую команду вы используете, чтобы выполнить тестовое восстановление, но я подозреваю, что вы используете команду bmgr с этим синтаксисом:

adb shell bmgr restore PACKAGE 

Это не делает то, что вы ожидаете. В частности, он вызывает путь кода, который происходит, когда ваше приложение вызывает BackupManager.requestRestore (observer). В этом конкретном коде кода приложение NOT выключается после операции восстановления, потому что приложение попросило наблюдать за самой операцией. Это означает, что вы остаетесь с процессом приложения, все еще запущенным, но с базовым классом Application. Это мощный пользовательский API, который в значительной степени безопасен только тогда, когда приложение использует оригинальный API резервного копирования ключей/значений.Вы должны проверить, а не с помощью другого синтаксиса bmgr:

adb shell bmgr restore TOKEN PACKAGE 

где TOKEN это идентификатор, который должен быть использован набор данных. По крайней мере, на самых последних версиях ОС вы можете видеть токены и предковые метки данных на выходе adb shell dumpsys backup.

Это все должно быть лучше документировано и сделано менее удивительно.

Приложение для подкласса обычно обескуражено; это одна из причин. Попытайтесь использовать свою собственную устаревшую статику вместо подкласса приложения.

+0

Каково ожидаемое поведение при установке приложения с помощью функции «Автоматическое восстановление»? Из некоторого беглого тестирования кажется, что поведение на Android 7, как описано выше, - приложение будет запущено с помощью приложения базового класса, а затем процесс будет уничтожен и перезагружен нормально после завершения восстановления. Однако на Android 6.0 процесс не закрывается, а приложение работает с базовым классом Application. – user3615737

+1

Возможно, что в Android 6 есть ошибка, так что после завершения восстановления он не смог убить экземпляр процесса base-Application? Также возможно, что это ошибка OEM-специфики; в общем, попытайтесь воспроизвести вещи на устройствах Nexus/Pixel, а также, если это возможно, других OEM-устройствах. – ctate

+0

Я видел это на Nexus 5 под управлением Android 6.0. Он работает правильно на Pixel C под управлением Android 7.0 – user3615737

Смежные вопросы