在开发针对4.1以上版本的Android应用时,我发现卸载我的应用并再次安装它并不会清除其数据。
该应用程序旨在存储它在第一个屏幕中询问的详细信息。 在OS 4.4.4版中再次卸载并安装后,应用程序会提示用户填写数据,这是正常的。但是在6.0版中,相同的安装/卸载顺序会带回最初输入的数据。
我尝试通过访问/data/data/my package folder
来确保卸载后数据库已经消失,并且在卸载期间该文件夹确实被删除了。
我尝试通过访问设置页面,通过Titanium Backup删除应用程序,结果相同。该设备植根于运行v6.0的Nexus 5.
这种奇怪行为可能是什么原因?
答案 0 :(得分:251)
这是因为Android 6具有自动备份功能。如果您不希望备份数据或者想要包含或排除某些资源,则需要在清单android:allowBackup
标记中调整android:fullBackupContent
和<application>
。这不是一个错误。
有关Android here上的AutoBackup的更多信息。
答案 1 :(得分:16)
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>
一旦我们明确地将值设置为false,一切似乎都有效。我希望这是一个选择加入功能,但是......似乎默认情况下它可能会针对不指定值的应用程序启用。
答案 2 :(得分:12)
您应检查设备的备份和重置设置,并关闭自动恢复(重新安装应用程序时,将恢复备份的设置和数据。)
关闭自动备份与自动恢复不同。如果您认为为您的应用程序启用自动备份会有所帮助。但是,如果您认为这会使最终用户不知道其设备的自动恢复功能已打开,请随时将其关闭。
在我的情况下,我关闭了allowBackup功能,但由于我已经在云上备份了以前的版本,它仍然会继续恢复。
在Android 6.0上查看图像作为Samsung设备的参考。其他设备和版本可能具有不同的屏幕。见下图。
答案 3 :(得分:5)
我最近需要利用这些功能,我能够发现文档,经过广泛的测试,这是我能够推断的:
Android:allowbackup - 将备份其所在设备上的本地应用数据。
Android:fullBackupContent - 与Google的备份恢复api结合使用,可通过xml文件控制以指定要备份的内容,以及您可以实施的BackupManager类,以进一步控制该过程
但是,文档说明并且我已经通过测试确认,只有在设备恢复并且触发恢复应用程序数据进程时才会进行恢复。或者,当应用程序通过adb进行侧载时,它也会恢复,这是我们通过Android Studio在我们的设备上运行应用程序进行测试或调试时所执行的操作。请注意,如果您设置android:allowbackup但不使用Google api代码配置android:fullBackupContent,那么应用数据只会存储在本地,而如果您正确配置,那么如果您的应用已备份并且您获得了新设备数据存储在云上,因此可以在新设备上恢复。
答案 4 :(得分:3)
我还补充了:
tools:replace="android:allowBackup"
覆盖使用过的组件中的相同选项
答案 5 :(得分:1)
只需在manifiedt.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 :(得分:1)
如果您以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是一个新的清单设置(我在猜测)。 “如果为true,则提示用户在卸载时保留应用程序的数据”。对于滥用来说,这似乎已经成熟了,但我可以看到它在某些应用程序中可能有用。
请参见https://commonsware.com/blog/2019/06/06/random-musings-q-beta-4.html
答案 7 :(得分:0)
我认为您不是手动卸载应用程序,我也遇到了这个问题,这是因为我只是在设备上运行该应用程序,这样应用程序似乎是相同的,仅反映了我最近所做的更改,但是当我从设备上卸载应用程序并重新安装apk时,记录将被删除,并且我的应用程序就像新安装一样。
请勿尝试在设备模式下使用测试,构建apk,在设备上卸载当前应用程序,然后再次安装apk,启动您的应用程序并查看差异。希望对您有所帮助。
答案 8 :(得分:0)
在清单文件的应用程序标记下添加android:allowBackup =“ false”解决了我的问题。
答案 9 :(得分:0)
仅此而已,我们发现即使在通过界面和adb删除应用程序之后,Android 9(在HMD Nokia设备上)仍拥有资产。
添加的答案:
.data
显然,这不是一个新答案-而是对与我们处于同一位置的人们的观察。