Не удается заставить BackupAgent работать при переустановке из Android Market - PullRequest
1 голос
/ 31 августа 2011

Я реализовал BackupAgentHelper в соответствии с документацией, включая обратную совместимость для 1.6, для резервного копирования всех моих SharedPreferences. Он отлично работает при тестировании в эмуляторе Android 2.2 и на моем устройстве с Android 2.3.3 через USB. В обоих этих тестовых случаях я выдаю: adb shell bmgr run, который запускает резервное копирование.

Однако при переустановке моего приложения из Android Market все SharedPreferences пропало. В документации сказано, что после этого dataChanged() был вызван: «Диспетчер резервного копирования затем вызывает метод onBackup () вашего агента резервного копирования в подходящий момент в будущем». Хорошо, но кто-нибудь знает, что делает систему на самом деле делать резервное копирование? Я подозреваю, что это не происходит в моем случае.

В документации сказано: «Если вы используете устройство, откройте Системные настройки, выберите« Конфиденциальность », затем включите« Резервное копирование моих данных »и« Автоматическое восстановление ».» но этого варианта нет в моем устройстве (SE Xperia Mini). Я могу только догадываться, что эта опция всегда включена и не может быть отключена. Я использую Telia в Швеции в качестве моего оператора (если это имеет значение).

Кто-нибудь получил представление о том, почему резервная копия не работает при переустановке из Маркета, но полностью функционирует при использовании эмулятора и на устройстве через USB?

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Резервное копирование и восстановление настроек в настройках конфиденциальности зависит от поставщика.См. Этот фрагмент кода, взятый из Класса конфиденциальности :

    // Vendor specific
    if (getPackageManager().resolveContentProvider(GSETTINGS_PROVIDER, 0) == null) {
        screen.removePreference(findPreference(BACKUP_CATEGORY));
    }

Sony Ericsson заменил условное заявление своим содержимым, и оно безоговорочно удаляет это Предпочтение.

Этот код распространяется Лицензия Apache , поэтому SE не нужно предоставлять вам исходный код.Если вы живете в стране, где реверс-инжиниринг для этой цели является законным, я считаю (я не юрист), вы можете:

  1. Извлечь пакет настроек с вашего устройства:

    adb pull /system/app/Settings.apk Settings.apk
    
  2. Декодирование settings.apk с использованием apktool :

    apktool d -s Settings.apk
    
  3. Во вновь созданном каталоге Settings вы найдете classes.dex.Чтобы декомпилировать его с помощью Smali (можно найти на code.google.com):

    baksmali classes.dex -o classes
    
  4. Наконец, вам интересны classes / com / android / settings / PrivacySettings.smali

Вы можете сделать то же самое с Settings.apk, взятым из эмулятора Android, и сравнить эти два файла.

У меня есть Xperia mini pro ( SK17i ) и этого предпочтения тоже нет.

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

Моя предыдущая попытка протестировать функциональность при использовании Маркета состояла в том, чтобы сделать все это в (относительно быстрой?) Последовательности.Я даже перезапустил свой телефон после изменения некоторых параметров в SharedPreferences, а затем удалил мое приложение, думая, что завершение работы приведет к выполнению ожидающих действий по синхронизации резервного копирования.К сожалению, это не привело к синхронизации с серверами резервного копирования, и SharedPreferences были потеряны.

Теперь к хорошей и информативной части.Я изменил некоторые SharedPreferences и оставил телефон на пару часов перед удалением моего приложения.В следующий раз, когда я установил его с Маркета, SharedPreferences были восстановлены из облачной резервной копии!Таким образом, решение состояло в том, чтобы просто наступить «подходящий момент в будущем».Мне не нравится это поведение, но я могу принять его, так как я понимаю, что оно не может синхронизироваться с серверами каждый раз, когда вызывается dataChanged ().

По крайней мере, теперь мы знаем, что даже если "Резервное копированиеПараметр «Мои данные и автоматическое восстановление» в разделе «Конфиденциальность» отсутствует на вашем устройстве, он все равно будет выполнять резервное копирование с помощью BackupAgent.Просто нужно некоторое (неопределенное количество) время, чтобы сделать это.

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