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

Nar*_*nan 171 android android-6.0-marshmallow

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

该应用程序旨在存储它在第一个屏幕中询问的详细信息.在OS 4.4.4版中再次卸载并安装后,应用程序会提示用户填写数据,这是正常的.但是在6.0版中,相同的安装/卸载顺序会带回最初输入的数据.

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

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

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

gre*_*f82 285

这是因为Android 6具有自动备份功能.你需要调整android:allowBackup,并android:fullBackupContent在您的清单<application>标签,如果你不想让你的数据备份,或者如果您要包含或排除一些资源做.这不是一个错误.

更多关于自动备份在Android 这里.

  • 如果有人想知道,android:allowBackup和android:fullBackupContent是要在<application />中添加的属性 (32认同)
  • 这是正确的答案,它对我有用(我遇到了同样的问题)为了避免这种行为,有必要在清单中放置**android:allowBackup ="false"**和**android:fullBackupContent ="false"**.XML (26认同)
  • 有人知道如何删除备份吗? (3认同)
  • 从文档:android:fullBackupContent指向包含备份选项的XML文件.默认情况下,大多数文件都已备份.虽然将此设置为"false"不会触发任何错误,但我认为设置错误. (2认同)
  • 不确定为什么他们保持默认行为来进行备份,因为行为与先前版本不同步因此变得烦人.那些想要它的人可以打开它. (2认同)
  • 我在 Flutter 应用程序中遇到了这种情况。我以前从未听说过...非常感谢! (2认同)

Vic*_*aru 22

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

在开发我的Android应用程序(使用Xamarin)时,我注意到每当我从Visual Studio重新启动应用程序时,我的数据将恢复到几个月前的数据.如果我只是停止并从VS重新运行它,或者如果我完全卸载了应用程序并重新安装它并不重要.

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

从Visual Studio启动时,备份似乎也会覆盖较新的数据,并且我们有用户使用我们应用程序的发布版本以及备份覆盖的新数据的报告.

由于我不确切知道何时发生备份和恢复,因此此功能似乎只会导致问题.

我们修改了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>
Run Code Online (Sandbox Code Playgroud)

一旦我们明确地将值设置为false,一切似乎都有效.我希望这是一个选择加入的功能,但是......对于没有指定值的应用程序,默认情况下可能会出现这种情况.


小智 14

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

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

在我的情况下,我关闭了allowBackup功能,但由于我已经在云上备份了以前的版本,它仍然在继续恢复.

在Android 6.0上查看图像作为Samsung设备的参考.其他设备和版本可能具有不同的屏幕.见下图.

备份和重置下的自动恢复设置


Man*_*ddy 7

如果您的目标是 android 10 那么您必须放入android:hasFragileUserData="true"应用程序标签AndroidManifest.xml

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest xmlns:android="http://schemas.android.com/apk/res/android">\n  <application\n    android:name=".MyApplication"\n    android:icon="@mipmap/ic_launcher"\n    android:label="@string/app_name"\n    android:theme="@style/AppTheme"\n    android:allowBackup="true"\n    android:hasFragileUserData="true">\n\n    .....\n\n     </application>\n\n </manifest>\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

android:hasFragileUserData 是一个新的清单设置(I\xe2\x80\x99m 猜测)。\xe2\x80\x9c如果为 true,则提示用户在卸载\xe2\x80\x9d 时保留应用程序\xe2\x80\x99s 数据。这似乎已经适合滥用,但我可以看到它对某些应用程序可能有用。

\n
\n\n

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

\n


Tom*_*ott 7

此答案总结了多个其他现有答案,包括截至引入 Android 12 的最新详细信息,以及清除设备生成的现有应用备份数据的说明。

有关详细信息,请参阅 https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup https://developer.android.com/about/versions/12/behavior-changes-12#backup-restore https ://developer.android.com/guide/topics/manifest/application-element http://android-doc.github.io/preview/backup/index.html(用于清除 Google Drive 中存储的现有应用程序备份数据)设备:设置 > 备份 > 关闭 Google One 备份然后再次打开,然后再次尝试卸载/重新安装)

作为旁注,其他一些答案表明android:fullBackupContent="false"但这似乎不再正确,因为它当前意味着指定特定格式的 xml 文件,而不是 true/false。

这些属性允许<application>禁用或配置 Android 自动备份功能的细节。

<application
tools:replace="android:label, android:icon, android:allowBackup, '...any other attribute you want to override with a value you set in this file for in case dependencies set them to other values...'"
'...your other attributes set here like android:label and android:icon...'
android:allowBackup="false" '...default is true, and setting this false prevents data backups of any kind (except device to device transfers if your app targets Android 11 (API 30) or higher)...'
android:fullBackupContent="@xml/backup_rules_android_11_and_below" '...optional, for Android 11 and below, referring to a file res/xml/backup_rules_android_11_and_below.xml you need to create...'
android:dataExtractionRules="@xml/backup_rules_android_12_and_above" '...optional, for Android 12 and above (fullBackupContent still needed along with this, assuming you support Android 11 and below), referring to a file res/xml/backup_rules_android_12_and_above.xml you need to create, with a slightly different required xml format...'
android:fullBackupOnly="false" '...optional, and default is false, but if set to true this field description says it enables auto backup on Android 6 (API 23) devices or higher (I am not sure how this matters compared to the more broadly reaching allowBackup)...'
android:hasFragileUserData="false" '...optional, and default is false, but if set to true this field description says it gives the user an option when they uninstall the app whether or not to backup their app data...'
>
'...contents of application element...'
</application>
Run Code Online (Sandbox Code Playgroud)

这些<application>更改仅影响未来应用程序备份的创建(或不创建);任何现有的应用程序备份数据仍将存在并使用,直到被覆盖或清除(请参阅上文以了解清除设备数据的说明)。


Xij*_*ukx 5

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

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

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

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


Vin*_*ohn 5

在清单文件中的应用程序标签下添加 android:allowBackup="false" 解决了我的问题。

是使用自动备份备份用户数据的 android 文档


JRK*_*JRK 5

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

添加答案:

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

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


小智 5

我还补充道:

tools:replace="android:allowBackup"
Run Code Online (Sandbox Code Playgroud)

覆盖已用组件中的相同选项