Приложение Android запоминает свои данные после удаления и переустановки

194

При разработке приложения для Android, предназначенного для всех версий выше 4.1, я заметил, что удаление моего приложения и его повторная установка не очищает его данные.

Приложение предназначено для хранения деталей, которые оно запрашивает на первом экране. После удаления и повторной установки в ОС версии 4.4.4, приложение предлагает пользователю заполнить данные, что является нормальным. Однако в версии 6.0 та же последовательность установки / удаления возвращает исходные данные.

Я попытался убедиться, посетив, /data/data/my package folderчтобы увидеть, что база данных исчезла после удаления, и действительно, эта папка удаляется во время удаления.

Я попытался удалить приложение, посетив страницу настроек через Titanium Backup и результаты такие же. На устройстве рутирован Nexus 5 под управлением v6.0.

В чем может быть причина этого странного поведения?

Нарайанан
источник

Ответы:

330

Это потому, что Android 6 имеет автоматическое резервное копирование. Вы должны настроить android:allowBackupи android:fullBackupContentв вашем манифесте <application>тега , если вы не хотите , чтобы ваши данные резервного копирования или если вы хотите включить или исключить некоторые ресурсы. Это не ошибка.

Подробнее об AutoBackup на Android здесь .

greywolf82
источник
28
Это правильный ответ, и он работает для меня (у меня была та же проблема). Чтобы избежать такого поведения, необходимо установить android: allowBackup = "false" и android: fullBackupContent = "false" в manifest.xml
frusso
33
В случае, если кому-то интересно, android: allowBackup и android: fullBackupContent - это свойства, которые нужно добавить в <application />
Jack '
2
Из документации: android: fullBackupContent указывает на файл XML, который содержит параметры резервного копирования. По умолчанию для большинства файлов выполняется резервное копирование. Хотя установка «false» не вызывает никаких ошибок, я думаю, это неправильно.
bajicdusko
3
Не уверен, почему они сохранили поведение по умолчанию для резервного копирования, поскольку поведение не синхронизировано с предыдущими версиями, поэтому становится раздражающим. Те, кто хочет, могут включить его.
Атул
7
Кто-нибудь знает, как удалить резервные копии?
1800 ИНФОРМАЦИЯ
31

Ответ greywolf82 правильный, но я хочу добавить к этому некоторую информацию.

При разработке моего приложения для Android (с использованием Xamarin) я заметил, что всякий раз, когда я перезапускаю приложение из Visual Studio, мои данные возвращаются к данным, полученным несколько месяцев назад. Не имело значения, если я просто остановился и перезапустил его из VS, или я полностью удалил приложение и переустановил его.

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

Резервное копирование также, по-видимому, перезаписывает новые данные при запуске из Visual Studio, и у нас есть отчеты о пользователях, использующих сборку релиза нашего приложения, а также получающих новые данные, перезаписываемые резервными копиями.

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

Мы изменили наш AndroidManifest, как показано в следующем XML:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.XXXXXXX" android:versionName="8.0.0" android:installLocation="auto" android:versionCode="439">
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="24" />
    <application 
               android:label="@string/appName" 
               android:icon="@drawable/icon_small" 
               android:installLocation="internalOnly" 
               android:largeHeap="true"
               android:allowBackup="false"
               android:fullBackupOnly="false"
               />
...
</manifest>

Как только мы явно установим значение в false, все будет работать. Я ожидал бы, что это будет опция отказа, но ... кажется, что она может быть включена по умолчанию для приложений, которые в любом случае не указывают значение.

Виктор Челару
источник
Спасибо. Я была такая же проблема.
Хади Фулади Талари
15

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

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

В моем случае я отключил функцию allowBackup, но, поскольку у меня уже была резервная копия предыдущей версии в облаке, она продолжала восстанавливаться.

Смотрите изображение в качестве ссылки для устройства Samsung на Android 6.0. Другие устройства и версии могут иметь другой экран. Смотрите изображение ниже.

Настройка автоматического восстановления в разделе «Резервное копирование и сброс»

Matcieou7th
источник
У меня та же проблема, мое приложение резервировало данные для нескольких пользователей, когда оно было включено. Есть ли возможность очистить / удалить синхронизированные данные?
Адитья Чаухан
5

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

Android: allowbackup - создает резервную копию данных локального приложения на устройстве, на котором оно находится.

Android: fullBackupContent - используется в сочетании с API восстановления резервных копий Google и МОЖЕТ управляться через файл xml для указания того, что именно должно быть сохранено, а также класс BackupManager, который вы можете реализовать для дальнейшего контроля над процессом.

Однако в документации говорится, и я подтвердил тестированием, что восстановление будет происходить только тогда, когда устройство восстанавливается и запускается процесс обработки данных приложения восстановления. ИЛИ также восстановится, когда приложение будет загружено через adb, что мы и делаем, когда запускаем приложение для тестирования или отладки на наших устройствах через Android Studio. Обратите внимание, что если вы установили android: allowbackup, но не настроили android: fullBackupContent с помощью API-кода Google, тогда данные приложений сохраняются только локально, тогда как если вы настроили его правильно, то, если ваше приложение было скопировано, и вы получили новое устройство, приложения данные были сохранены в облаке, чтобы их можно было восстановить на новом устройстве.

Xijukx
источник
3

Добавление android: allowBackup = "false" под тегом приложения в файле манифеста решило мою проблему.

Вот идет документация Android для резервного копирования пользовательских данных с помощью Auto Backup

Винай Джон
источник
2

Просто измените android: allowBackup = "true" на android: allowBackup = "false" в файле manifiest.xml. Это будет работать.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <application
        android:allowBackup="false"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
</manifest>
Наг Косанам
источник
2

Просто добавив к этому, мы обнаружили, что в Android 9 (на устройстве HMD Nokia) активы удерживались даже после удаления приложения через интерфейс и через adb.

Ответ добавления:

android:allowBackup="false" android:fullBackupOnly="false"

Очевидно, это не новый ответ - это наблюдение для людей, которые были в том же положении, что и мы.

JRK
источник
2

Если вы нацелены на Android 10, то вы должны поместить android:hasFragileUserData="true"в тег приложенияAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <application
    android:name=".MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:allowBackup="true"
    android:hasFragileUserData="true">

    .....

     </application>

 </manifest>

android: hasFragileUserData - это новая настройка манифеста (я думаю, на). «Если true, пользователю предлагается сохранить данные приложения при удалении». Это кажется готовым для злоупотреблений, но я могу видеть, где это могло бы быть полезно для некоторых приложений.

См. Https://commonsware.com/blog/2019/06/06/random-musings-q-beta-4.html.

Манохар Редди
источник