Android 应用程序在卸载和重新安装后会记住其数据

Posted

技术标签:

【中文标题】Android 应用程序在卸载和重新安装后会记住其数据【英文标题】:An Android app remembers its data after uninstall and reinstall 【发布时间】:2016-01-15 03:44:20 【问题描述】:

在开发针对 4.1 以上所有版本的 android 应用时,我发现卸载我的应用并再次安装它并不会清除其数据。

该应用旨在存储它在第一个屏幕中询问的详细信息。 在OS 4.4.4版本卸载重新安装后,应用提示用户填写数据,正常。然而,在 6.0 版中,相同的安装/卸载顺序会恢复最初输入的数据。

我试图通过访问/data/data/my package folder 来确保卸载后数据库已消失,并且确实该文件夹在卸载期间被删除。

我尝试通过 Titanium Backup 访问设置页面来删除该应用程序,结果相同。该设备植根于运行 v6.0 的 Nexus 5。

这种奇怪行为的原因可能是什么?

【问题讨论】:

【参考方案1】:

这是因为 Android 6 具有自动备份功能。如果您不希望备份数据或者想要包含或排除某些资源,则需要在清单 <application> 标记中调整 android:allowBackupandroid:fullBackupContent。这不是错误。

更多关于 Android 上的 AutoBackup here。

【讨论】:

这是正确的答案,它对我有用(我有同样的问题)为了避免这种行为,有必要把 android:allowBackup="false"android:fullBackupContent="false" 在 manifest.xml 如果有些人想知道,android:allowBackup 和 android:fullBackupContent 是要添加到 中的属性 来自文档:android:fullBackupContent 指向包含备份选项的 XML 文件。默认情况下,大部分文件都已备份。虽然将此设置为“false”不会触发任何错误,但我想设置是错误的。 不知道他们为什么要保留默认行为来进行备份,因为该行为与以前的版本不同步,所以很烦人。需要的人可以打开它。 有人知道如何删除备份吗?【参考方案2】:

greywolf82 的回答是正确的,但我想为此添加一些信息。

在开发我的 Android 应用程序(使用 Xamarin)时,我注意到每当我从 Visual Studio 重新启动该应用程序时,我的数据都会恢复到几个月前的数据。是我简单地停止并从 VS 重新运行它,或者我完全卸载该应用程序并重新安装它都没有关系。

还值得注意的是,我们从未明确告诉应用存储备份。

从 Visual Studio 启动时,备份似乎也覆盖了较新的数据,我们有用户使用我们应用的发布版本的报告,并且更新的数据也被备份覆盖。

由于我不知道备份和恢复的确切时间,这个功能似乎只会导致问题。

我们通过添加以下两行来修改我们的 AndroidManifest:

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

添加它们后,我们的 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,一切似乎都可以正常工作。我希望这是一个选择加入的功能,但......似乎默认情况下对于没有指定值的应用程序来说它可能是启用的。

【讨论】:

谢谢。我有同样的问题。 除了Backup之外,你添加了哪些参数来解决它? “installLocation”是否也与此问题有关? 我发现这确实有效,但遗憾的是 AndroidManifest 被 VS 重新生成,这些属性丢失了。我在这里发布了一个后续问题:***.com/questions/68181172【参考方案3】:

您应该检查设备的备份和重置设置,并关闭自动恢复(重新安装应用程序时,备份的设置和数据将被恢复。)

关闭自动备份与自动恢复不同。如果您认为为您的应用程序打开自动备份会有所帮助,请这样做。但是,如果您认为这会使最终用户不知道其设备的自动恢复功能已打开,请随意将其关闭。

在我的例子中,我关闭了 allowBackup 功能,但由于我已经在云端备份了以前的版本,它仍然会继续恢复。

查看图片作为 Android 6.0 上三星设备的参考。其他设备和版本可能有不同的屏幕。见下图。

Automatic Restore Setting under Backup and Reset

【讨论】:

我遇到了同样的问题,我的应用在启动时为少数用户备份了数据。是否有可能清除/丢弃同步数据?【参考方案4】:

我最近需要利用这些功能,我能够发现文档,并且经过广泛的测试,这是我能够推断出的:

Android:allowbackup - 将在其所在设备上备份本地应用数据。

Android:fullBackupContent - 与 Google 的备份恢复 API 结合使用,可以通过 xml 文件控制以指定确切备份的内容,以及您可以实施的 BackupManager 类以进一步控制该过程。

但是文档指出,并且我已经通过测试确认,只有在设备恢复并且触发恢复应用程序数据过程时才会发生恢复。或者,当通过 adb 侧载应用程序时,它也会恢复,这是我们通过 Android Studio 在设备上运行应用程序以进行测试或调试时所做的。请注意,如果您设置 android:allowbackup 但未使用 Google api 代码配置 android:fullBackupContent 则应用程序数据只会存储在本地,而如果您正确配置它,那么如果您的应用程序已备份并且您获得了新设备应用程序数据存储在云端,因此可以在新设备上恢复。

【讨论】:

【参考方案5】:

只需在 manifiest.xml 中将 android:allowBackup="true" 更改为 android:allowBackup="false"。它会起作用的。

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

【讨论】:

【参考方案6】:

在 Manifest 文件的 application 标签下添加 android:allowBackup="false" 解决了我的问题。

Here 转到使用自动备份备份用户数据的 android 文档

【讨论】:

【参考方案7】:

除此之外,我们发现在 Android 9(在 HMD 诺基亚设备上)中,即使在通过界面和 adb 删除应用程序之后,资产仍被保留。

添加的答案:

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

显然,这不是一个新的答案 - 而是对与我们处于相同位置的人的观察。

【讨论】:

【参考方案8】:

如果您的目标是 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 是一个新的清单设置(我猜是)。 “如果为真,则会提示用户在卸载时保留应用程序的数据”。这似乎很容易被滥用,但我可以看到它可能对某些应用有用。

见https://commonsware.com/blog/2019/06/06/random-musings-q-beta-4.html

【讨论】:

【参考方案9】:

我还补充了:

tools:replace="android:allowBackup"

在使用过的组件中覆盖相同的选项

【讨论】:

以上是关于Android 应用程序在卸载和重新安装后会记住其数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥开电脑后会出现:无法启动此程序,因为计算机中丢失AppFace.dll.尝试重新安装该程序以解决此问题?

Linux Deploy Ubuntu安装MySQL

“APK被定义了多次”,app无法安装Android Studio

sublime text2卸载和重新安装(转载)

手机连接豌豆荚时提示驱动安装失败的解决方法

无法在 Windows 10 上卸载 Android Studio