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

该应用程序被设计成存储它在第一个屏幕中询问的详细信息。 在操作系统4.4.4版本卸载并重新安装后,app会提示用户填写数据,这是正常的。但是在6.0版本中,相同的安装/卸载顺序将带回最初输入的数据。

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

我试图通过访问设置页面删除该应用程序,通过Titanium Backup,结果是一样的。该设备是运行v6.0的Nexus 5。

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


当前回答

这是因为Android 6有自动备份。如果你不想备份你的数据或者你想包含或排除一些资源,你需要调优manifest <application>标签中的android:allowBackup和android:fullBackupContent。这不是一个bug。

更多关于Android上的AutoBackup的信息请点击这里。

其他回答

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

关闭自动备份和自动恢复是不同的。如果您认为为您的应用程序启用自动备份会有帮助,那么就这样做。但如果你认为这会让终端用户意识不到他们设备的自动恢复功能已经打开,那就把它关掉吧。

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

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

“备份和复位”下的“自动恢复设置”

如果你的目标是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 -思考- q -β- 4. - html

这是因为Android 6有自动备份。如果你不想备份你的数据或者你想包含或排除一些资源,你需要调优manifest <application>标签中的android:allowBackup和android:fullBackupContent。这不是一个bug。

更多关于Android上的AutoBackup的信息请点击这里。

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,一切似乎都可以工作。我希望这是一个可选择的功能,但是……似乎对于没有指定值的应用程序,默认情况下它是打开的。

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

添加的答案:

android:allowBackup=“false” android:fullBackupOnly=“false”

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