如何防止Android应用的自动备份?

时间:2017-02-05 11:02:17

标签: java android android-manifest android-jobscheduler

我在某些设备上面临非常奇怪的情况(Nexus 5x与Android 7):当我清理数据并卸载它,然后使用Studio安装时,该应用程序不是单元化的,但它使用的是1月24日的数据!我尝试使用平板电脑进行相同的操作,但应用程序没有数据。

我多次重复这个过程,我清理了我的项目,多次重建它,它始终以24th january数据(数据库和共享首选项)开始。

我甚至尝试过adb shell并运行以清理数据:

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

我删除了它们,应用程序似乎是空的 - 直到我删除它并再次安装 - 1月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">

我不希望工厂重置我的手机以摆脱这些数据。我不认为这个数据在我的构建中。我没有添加它们,安装时平板电脑中的应用程序是空的。

5 个答案:

答案 0 :(得分:21)

自从Android 6.0(第23版)开始,Android推出了一项名为Auto-backup for apps的新功能。它的作用是,它将应用程序的某些文件备份到用户的Google驱动器。它更新的文件列表包括:

  • 共享偏好设置文件
  • getFilesDir()
  • 返回的目录中的文件
  • getDatabasePath(String)
  • 返回的目录中的文件
  • 使用getDir(String, int)
  • 创建的目录中的文件
  • getExternalFilesDir(String)
  • 返回的目录中的外部存储上的文件

现在manifest.xml中的这一行负责:

android:allowBackup="true"

如果您想要禁用备份,是否应选择将值设置为false

此外,备份的数据是24小时间隔,Android为此目的使用JobScheduler API,这意味着用户无法控制正在传输的数据流程。

此外,自动备份的空间限制为25 MB,并且不计入用户的空间配额。

此外,您可以将<include><exclude>设置为上传某些类型的数据,例如您可能不需要保存用户机密数据,因此它也很灵活,更多有关信息,请访问:Android Auto Backup for Apps (100 Days of Google Dev)

答案 1 :(得分:1)

我遇到了同样的问题而且真的不得不抓住我的头脑,因为谷歌没有突出显示应用备份功能的细微变化。从API级别23开始,所有应用数据都将自动备份到Google云端硬盘中。安装应用程序后,将恢复此数据。因此,即使卸载应用程序,数据也不会消失。

大多数情况下,您的应用清单会有这样的条目 -

android:allowBackup="true"

将值更改为false,或者按照以下链接配置xml,让备份服务知道备份内容和不备份内容。

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

答案 2 :(得分:1)

<application ...
    android:allowBackup="false"
    android:fullBackupContent="false"
    tools:replace="android:allowBackup"
</application>

答案 3 :(得分:0)

只需更改

android:allowBackup="true"

android:allowBackup="false"

如果您使用任何依赖项,请使用

覆盖此属性。
tools:replace="android:allowBackup"
android:allowBackup="false"

答案 4 :(得分:0)

我知道这不是一个完美的解决方案,但它对我有用。

卸载特定应用程序后,我关闭设备并打开设备,设备操作系统未从云调用备份检查