【问题标题】:How to prevent auto-backup of an Android app?如何防止自动备份 Android 应用程序?
【发布时间】:2017-02-05 11:02:16
【问题描述】:

我在某些设备(带有 Android 7 的 Nexus 5x)上遇到了非常奇怪的情况:当我清理它的数据并卸载它,然后用 Studio 安装它时,应用程序没有统一化,但它使用 1 月 24 日的数据!我在平板电脑上尝试了相同的程序,但该应用程序没有数据。

我已经多次重复这个过程,我清理了我的项目,多次重建它,它总是从 1 月 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

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

我不想让我的手机恢复出厂设置以摆脱这些数据。我不认为这些数据在我的构建中。我没有添加它们,安装时平板电脑中的应用程序是空的。

【问题讨论】:

  • 你能具体说一下你之前得到了什么数据吗?
  • 数据库和共享首选项。可以看到没有ormlite初始化。
  • 而且只能在 API 23 + 的设备上使用吗?
  • marshmallow 下的任何设备都会出现这个问题吗?
  • 嗯,我会回答它的原因!

标签: java android android-manifest android-jobscheduler


【解决方案1】:

自 Android 6.0 (v 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 来实现此目的,这意味着用户无法控制数据传输的过程。

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

此外,您可以设置为&lt;include&gt;&lt;exclude&gt; 上传某些类型的数据,例如您可能不需要保存用户机密数据,因此它也很灵活,更多信息是可在:Android Auto Backup for Apps (100 Days of Google Dev)

【讨论】:

  • 太棒了。我可以在云端硬盘的管理备份中看到该应用程序,但无法删除它。我可以通过 gradle 配置 Manifest 以关闭此属性以进行调试发布吗?
  • 已确认,设置为 false 有帮助。我尝试将 resValue 'string', 'full_backup', 'false' 放入 gradle 并在清单中引用它:android:fullBackupContent="@string/full_backup,但这不起作用并且无论如何都加载了备份。
  • 我没有完全理解。尝试在调试版本时禁用备份?
  • 没错。我希望备份生产版本,但不备份调试版本。
  • 为什么不设置 android:allowBackup="false" 并将其设置为 true,然后再构建发布 apk ?
【解决方案2】:
<application ...
    android:allowBackup="false"
    android:fullBackupContent="false"
    tools:replace="android:allowBackup"
</application>

【讨论】:

  • 工具是什么:替换?
  • tools:replace 用于覆盖 AndroidManifest 设置。假设您使用的任何库具有 android:allowBackup="true" 它将覆盖该值。
【解决方案3】:

简单的改变

android:allowBackup="true"

android:allowBackup="false"

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

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

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,真的不得不挠头,因为谷歌没有强调应用备份功能的细微变化。从 API 级别 23 开始,所有应用数据将自动备份到谷歌驱动器中。当应用程序重新安装时,这些数据将被恢复。因此,即使您卸载应用程序,数据也不会消失。

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

    android:allowBackup="true"
    

    将值更改为false,或者按照以下链接配置一个xml,让备份服务知道要备份什么,不备份什么。

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 2012-11-20
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 2016-03-14
        相关资源
        最近更新 更多