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

22

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

我已经重复了这个过程很多次,清理了我的项目,多次重新构建它,但它总是从1月24日的数据开始(数据库和共享首选项都是如此)。

我甚至尝试了adb shell和run 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

Gradle:

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">

我不想恢复出厂设置来清除这些数据。我认为这些数据不在我的构建中。当安装时,我的平板电脑上的应用程序为空,我也没有添加它们。


你能具体说明你获取了哪些先前的数据吗? - OBX
数据库和共享偏好设置。我可以看到没有ormlite初始化。 - Leos Literak
仅适用于API 23及以上的设备,对吗? - OBX
是的,我明白了。您能把您的清单也发布一下吗?以确认问题 :) - OBX
1
嗯,我会回答它的原因! - OBX
显示剩余3条评论
6个回答

37
自 Android 6.0(版本号23)起,Android 引入了一个名为应用自动备份的新功能。其作用是将应用程序的某些文件备份到用户的 Google Drive 上。它更新的文件列表包括:
  • Shared preferences 文件
  • 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)


太好了。我可以在Drive的备份管理中看到该应用程序,但我无法删除它。我能否通过gradle配置清单,使此属性在调试版本中关闭? - Leos Literak
不是非常优雅的,并且很容易在不经意间犯错或忘记在构建前更改它。 - Leos Literak
嗯,那么在这种情况下,我认为你应该提出一个新问题,针对那个具体的问题。我没有遇到过那个具体的问题。 :/ 遗憾 :/ - OBX
备份大小限制的一个不准确之处:每个用户/设备每个应用程序的限制为25MB。这意味着如果用户有2个设备,则每个用户在每个设备上的应用程序限制为25MB。 - ultraon
我该如何让我的应用程序用户决定是否启用备份?为什么备份或不备份的偏好在编译时完成?为什么谷歌没有提供选项让应用程序的用户来决定这个问题。我的意思是让开发人员决定备份哪些内容,不备份哪些内容,以便应用程序按预期运行。但是,让应用程序的用户决定是否进行此备份。 - ashishsony
显示剩余5条评论

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

工具:replace是用来做什么的? - AliAvci
2
tools:replace用于覆盖AndroidManifest设置。假设您正在使用的库具有android:allowBackup =“true”,它将覆盖该值。 - Danish Ansari

7

只需简单更改

android:allowBackup="true"

转化为

android:allowBackup="false"

如果您正在使用任何依赖项,要覆盖此属性,请使用

tools:replace="android:allowBackup"
android:allowBackup="false"

1
我曾经遇到过同样的问题,不得不仔细思考,因为Google没有强调应用备份功能中微小的更改。从API 23级开始,所有应用数据将自动备份到Google Drive中。当重新安装应用时,这些数据会被恢复。因此,即使卸载了应用程序,数据也不会消失。
大多数情况下,您的应用程序清单将包含以下条目 -
android:allowBackup="true"

将值更改为false,否则请按照下面的链接进行配置xml,让备份服务知道需要备份什么和不需要备份什么。

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


0

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

卸载特定应用程序后,我关闭设备并重新开启设备,设备操作系统没有从云端调用备份检查。


0

清除应用程序备份的一种方法是:

清除该应用程序的数据和缓存。

注意:这只是一个临时解决方案,卸载并重新安装应用程序会自动恢复备份。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接