web-dev-qa-db-fra.com

Une application Android garde ses données en mémoire après la désinstallation et la réinstallation.

Lors du développement d'une application Android ciblant toutes les versions supérieures à 4.1, j'ai constaté que désinstaller et réinstaller mon application n'effaçait pas ses données. 

L'application est conçue pour stocker les détails qu'elle demande dans son premier écran. Après avoir désinstallé et réinstallé la version 4.4.4 du système d'exploitation, l'application invite l'utilisateur à saisir les données, ce qui est normal. Cependant, dans la version 6.0, la même séquence d'installation/désinstallation ramène les données entrées à l'origine. 

J'ai essayé de vérifier en visitant /data/data/my package folder de voir que la base de données avait disparu après la désinstallation et effectivement ce dossier est supprimé lors de la désinstallation. 

J'ai essayé de supprimer l'application en visitant la page des paramètres, via Titanium Backup et les résultats sont identiques. Le périphérique est rooté Nexus 5 sous la v6.0.

Quelle pourrait être la raison de ce comportement étrange?

125
Narayanan

C'est parce qu'Android 6 dispose d'une sauvegarde automatique. Si vous ne souhaitez pas que vos données soient sauvegardées ou si vous souhaitez inclure ou exclure certaines ressources, vous devez paramétrer Android:allowBackup et Android:fullBackupContent dans la balise <application> du manifeste. Ce n'est pas un bug.

En savoir plus sur AutoBackup sur Android ici .

218
greywolf82

la réponse de greywolf82 est correcte mais je souhaite ajouter quelques informations à cela.

Lors du développement de mon application Android (à l'aide de Xamarin), j'ai remarqué que chaque fois que je le relançais depuis Visual Studio, mes données revenaient à des données d'il y a quelques mois. Peu importait si je l'arrêtais simplement et que je le réexécutais à partir de VS ou si je désinstallais complètement l'application et la réinstallais.

Il est également intéressant de noter que nous n'avons jamais explicitement demandé à l'application de stocker une sauvegarde.

La sauvegarde semblait également écraser les données les plus récentes lors du lancement à partir de Visual Studio. Nous avons également des rapports d'utilisateurs qui utilisent la version validée de notre application et qui écrasent également les nouvelles données.

Étant donné que je ne sais pas exactement quand les sauvegardes et les restaurations ont lieu, cette fonctionnalité ne semble poser que des problèmes.

Nous avons modifié notre manifeste AndroidManifest comme indiqué dans le code XML suivant:

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

Une fois que nous avons explicitement défini la valeur sur false, tout semble fonctionner. Je m'attendrais à ce que ce soit une fonctionnalité d'adhésion, mais ... semble être activé par défaut pour les applications qui ne spécifient pas la valeur de toute façon.

12
Victor Chelaru

Vous devez vérifier les paramètres de sauvegarde et de réinitialisation de votre appareil et désactiver la restauration automatique (lors de la réinstallation d'une application, les paramètres sauvegardés et les données sauvegardées seront restaurés).

La désactivation de la sauvegarde automatique est différente de la restauration automatique. Si vous pensez qu'il est utile d'activer la sauvegarde automatique pour votre application, faites-le. Toutefois, si vous pensez que les utilisateurs finaux ne sachant pas que la fonctionnalité de restauration automatique de leur appareil est activée, n'hésitez pas à la désactiver.

Dans mon cas, j'ai désactivé la fonctionnalité allowBackup, mais comme je disposais déjà d'une sauvegarde de la version précédente sur le nuage, la restauration était toujours en cours.

Voir l'image comme référence pour un appareil Samsung sous Android 6.0. D'autres appareils et versions peuvent avoir un écran différent. Voir l'image ci-dessous.

Paramètre de restauration automatique sous Sauvegarde et réinitialisation

11
Matcieou7th

J'ai récemment eu besoin de tirer parti de ces fonctionnalités, j'ai pu découvrir la documentation et, après de nombreux tests, voici ce que j'ai pu déduire:

Android: allowbackup - sauvegarde les données d'application locales sur le périphérique sur lequel il se trouve.

Android: fullBackupContent - est utilisé conjointement avec l'API de restauration de sauvegarde de Google et peut être contrôlé via un fichier xml afin de spécifier le contenu exact de la sauvegarde, ainsi qu'une classe BackupManager que vous pouvez implémenter pour mieux contrôler le processus.

Cependant, la documentation indique, et j'ai confirmé par des tests, qu'une restauration ne sera effectuée que lorsque le périphérique est restauré et que le processus de restauration des données de l'application est déclenché. OR il sera également restauré lorsque l'application est chargée de manière indirecte via adb, ce que nous faisons lorsque nous exécutons l'application à des fins de test ou de débogage sur nos appareils via Android Studio. Notez que si vous définissez Android: allowbackup mais ne configurez pas Android: fullBackupContent avec un code api Google, les données des applications ne sont stockées que localement, alors que si vous les avez configurées correctement, si votre application est sauvegardée et que vous obtenez un nouvel appareil, les applications les données ont été stockées sur le nuage pour pouvoir être restaurées sur un nouvel appareil. 

3
Xijukx

L'ajout d'Android: allowBackup = "false" sous la balise d'application dans le fichier manifeste a résolu mon problème.

1
Vinay John

Il suffit de changer Android: allowBackup = "true" pour Android: allowBackup = "false" dans le fichier manifest.xml. Ce sera travaillé.

<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>
1
Nag Kosanam

En ajoutant simplement ceci, nous avons constaté que, dans Android 9 (sur un appareil Nokia HMD), les actifs étaient conservés, même après la suppression de l'application via l'interface et via adb.

La réponse d'ajouter:

Android:allowBackup="false" Android:fullBackupOnly="false"

De toute évidence, il ne s’agit pas d’une nouvelle réponse, mais d’une observation pour les personnes qui se trouvaient dans la même situation que nous.

0
JRK

Je pense que vous ne désinstallez pas manuellement l’application, j’avais ce problème aussi, c’était parce que j’exécutais simplement l’application du périphérique. Ainsi, l’application semble être identique, seules les modifications récentes que j’ai apportées sont prises en compte, mais quand Je désinstalle l'application moi-même à partir de l'appareil et installe à nouveau l'apk. Les enregistrements sont supprimés et mon application est comme une nouvelle installation.

N'essayez pas d'utiliser le test en mode appareil, construisez l'apk, désinstallez l'application actuelle sur votre appareil, puis réinstallez l'apk, lancez votre application et voyez la différence. J'espère que ça aide.

0
Anana Aristotle