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

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

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

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

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


当前回答

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”

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

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

我还补充说:

tools:replace="android:allowBackup"

重写已使用组件中的相同选项