Как предотвратить автоматическое резервное копирование приложения Android?

Я сталкиваюсь с очень странной ситуацией на одном устройстве (Nexus 5x с Android 7): когда я очищаю его данные и удаляю его, а затем устанавливаю с помощью Studio, приложение не униализируется, но использует данные от 24 января! Я попробовал ту же процедуру с планшетом, и приложение не имеет данных.

Я повторял эту процедуру много раз, я очищал свой проект, перестраивал его несколько раз, и он всегда начинается с данных 24 января (как базы данных, так и общих настроек).

Я даже пробовал adb shell и запускал as для очистки данных:

bullhead:/data/data/lelisoft.com.lelimath.debug $ ls -l databases/
total 232
-rw-rw---- 1 u0_a259 u0_a259 98304 2017-02-05 11:03 lelimath.sqlite
-rw------- 1 u0_a259 u0_a259 16928 2017-02-05 11:03 lelimath.sqlite-journal

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

Это журнал, как это начинается:

$ adb shell am start -n "lelisoft.com.lelimath.debug/lelisoft.com.lelimath.activities.DashboardActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
Waiting for application to come online: lelisoft.com.lelimath.debug | lelisoft.com.lelimath.debug.test
I/InstantRun: Instant Run Runtime started. Android package is lelisoft.com.lelimath.debug, real application class is lelisoft.com.lelimath.helpers.LeliMathApp.
D/l.c.l.h.LeliMathApp: onCreate()
D/l.c.l.h.BalanceHelper: Current points balance: 234

Это расположение базы данных, полученной из отладчика:

/data/user/0/lelisoft.com.lelimath.debug/databases/lelimath.sqlite

Грейдл:

android {
signingConfigs {
}
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
    applicationId "lelisoft.com.lelimath"
    resValue 'string', 'app_name', 'LeliMath'
    minSdkVersion 16
    targetSdkVersion 24
    versionCode 300
    versionName '3.0.0'
    resValue "string", "app_build_number", getDate();
    resValue "string", "app_version", versionName;
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    debug {
        applicationIdSuffix ".debug"
        resValue 'string', 'app_name', 'LeliMath DEV'
    }
}

Часть манифеста:

<application
    android:name=".helpers.LeliMathApp"
    android:allowBackup="true"
    android:fullBackupContent="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    tools:ignore="GoogleAppIndexingWarning">

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


person Leos Literak    schedule 05.02.2017    source источник
comment
Можете ли вы уточнить, какие предыдущие данные вы получили?   -  person OBX    schedule 05.02.2017
comment
База данных и общие настройки. Я вижу, что нет инициализации ormlite.   -  person Leos Literak    schedule 05.02.2017
comment
И только на устройствах с API 23+ верно?   -  person OBX    schedule 05.02.2017
comment
Возникает ли эта проблема на любом устройстве ниже зефира?   -  person OBX    schedule 05.02.2017
comment
Я только что запустил эмулятор для планшета с SDK 18, и он работал, как и ожидалось. Обновление сохранило предыдущие данные устройства, новая установка (после удаления приложения) вообще не содержала данных. Затем я запустил эмулятор для другого планшета с SDK 23, и в нем не было данных. Действительно кажется, что проблема локальна для моего телефона.   -  person Leos Literak    schedule 05.02.2017
comment
Да я получил его. Можете ли вы также опубликовать свой манифест. Чтобы подтвердить проблему :)   -  person OBX    schedule 05.02.2017
comment
Добавлен раздел приложения. Вы имеете в виду резервные атрибуты? Странно, что у меня было несколько модификаций, так почему сохраняется конкретная дата?   -  person Leos Literak    schedule 05.02.2017
comment
хм, я отвечу причину этого!   -  person OBX    schedule 05.02.2017


Ответы (5)


Начиная с Android 6.0 (v 23) и выше, в Android появилась новая функция под названием Автоматическое резервное копирование для приложения . Что это делает, так это выполняет резервное копирование определенных файлов приложения на диск Google пользователя. Список файлов, которые он обновляет, включает:

  • Файлы общих настроек
  • Файлы в каталоге, возвращенные getFilesDir()
  • Файлы в каталоге, возвращенные getDatabasePath(String)
  • Файлы в каталогах, созданные с помощью getDir(String, int)
  • Файлы на внешнем хранилище в каталоге, возвращенном getExternalFilesDir(String)

Теперь за это отвечает эта строчка в manifest.xml:

android:allowBackup="true"

Если вы предпочитаете отключить резервное копирование, следует установить значение false.

Кроме того, данные резервируются с интервалом в 24 часа, и Android использует JobScheduler. API для этой цели, что означает, что пользователь не может контролировать процесс передачи данных.

Кроме того, пространство для автоматического резервного копирования ограничено 25MB и не учитывается в квоте пространства пользователя.

Кроме того, вы можете установить <include> и <exclude> определенный тип загружаемых данных, например, вам может не понадобиться сохранять конфиденциальные данные пользователя, так что это также гибко, дополнительная информация об этом доступна по адресу: Автоматическое резервное копирование Android для приложений (100 дней разработки Google)

person OBX    schedule 05.02.2017
comment
Отлично. Я вижу приложение в разделе «Управление резервными копиями на Диске», но не могу его удалить. Могу ли я настроить манифест через gradle, чтобы это свойство было отключено для выпуска отладки? - person Leos Literak; 05.02.2017
comment
Подтверждено, установка на false помогла. Я попытался поместить resValue 'string', 'full_backup', 'false' в gradle и сослаться на него в манифесте: android:fullBackupContent=@string/full_backup, но это не сработало, и резервная копия все равно была загружена. - person Leos Literak; 05.02.2017
comment
Я не понял это полностью. Пытаетесь отключить резервное копирование во время отладочных сборок? - person OBX; 05.02.2017
comment
Точно. Я хочу создать резервную копию рабочей сборки, а не отладочной сборки. - person Leos Literak; 05.02.2017
comment
Почему бы не установить android:allowBackup="false" и не установить для него значение true перед сборкой релиза apk? - person OBX; 05.02.2017
comment
Не очень элегантный, и его легко случайно закоммитить или забыть изменить перед сборкой. - person Leos Literak; 05.02.2017
comment
Хм, тогда в этом случае вы должны задать новый вопрос с этой конкретной проблемой, я считаю. Я не был с этой конкретной проблемой. :/ сожалею :/ - person OBX; 05.02.2017
comment
Одна неточность в отношении ограничения размера резервной копии: 25 МБ для каждого приложения на одного пользователя/устройство. Это означает, что если у пользователя есть 2 устройства, то ограничение будет составлять 25 МБ для каждого приложения пользователя на устройстве. - person ultraon; 15.08.2018
comment
Как разрешить пользователям моего приложения решать, хотят ли они включить резервное копирование или нет? Почему предпочтение отдается резервному копированию или отказу от резервного копирования во время компиляции? Почему Google не дает возможности разрешить это пользователю приложения. Я прошу позволить разработчику решить, что резервировать, а что нет, чтобы приложение вело себя так, как задумано, НО пусть пользователь приложения решит, произойдет ли это резервное копирование или нет. - person ashishsony; 19.09.2018
comment
Можно ли как-то очистить/удалить (не отключить) резервную копию? У нас возникли некоторые проблемы, связанные с процессом бета-тестирования. - person User; 17.06.2020

Просто измените

android:allowBackup="true"

to

android:allowBackup="false"

И если вы используете какую-либо зависимость, чтобы переопределить это свойство, используйте

tools:replace="android:allowBackup"
android:allowBackup="false"
person Vikash Bijarniya    schedule 20.09.2018

У меня была такая же проблема, и мне действительно пришлось почесать голову, потому что Google не выделил тонкое изменение в функции резервного копирования приложений. Начиная с уровня API 23, все данные приложения будут автоматически резервироваться на диске Google. Эти данные будут восстановлены, когда приложение будет установлено обратно. Таким образом, данные не исчезают даже при удалении приложения.

В основном в манифесте вашего приложения будет такая запись:

android:allowBackup="true"

Измените значение на false или перейдите по приведенной ниже ссылке и настройте XML, чтобы служба резервного копирования знала, что следует резервировать, а что нет.

https://developer.android.com/guide/topics/data/autobackup.html

person Dibzmania    schedule 05.02.2017

Я знаю, что это не идеальное решение, но оно сработало для меня.

после удаления определенного приложения я выключаю устройство и включаю устройство, ОС устройства не вызывает проверку резервного копирования из облака

person Mohd Qasim    schedule 25.11.2019

person    schedule
comment
Для чего нужны инструменты: заменить? - person AliAvci; 20.07.2019
comment
tools:replace используется для переопределения настроек AndroidManifest. Скажем, если какая-либо библиотека, которую вы используете, имеет android:allowBackup=true, она переопределит это значение. - person Danish Ansari; 05.06.2020