Aplikacja na Androida zapamiętuje swoje dane po odinstalowaniu i ponownej instalacji

194

Podczas opracowywania aplikacji na Androida kierowanej na wszystkie wersje powyżej 4.1 zauważyłem, że odinstalowanie i ponowne zainstalowanie mojej aplikacji nie usuwa danych.

Aplikacja została zaprojektowana do przechowywania szczegółów, o które prosi na pierwszym ekranie. Po odinstalowaniu i ponownej instalacji w OS 4.4.4 aplikacja monituje użytkownika o podanie danych, co jest normalne. Jednak w wersji 6.0 ta sama sekwencja instalowania / odinstalowywania przywraca pierwotnie wprowadzone dane.

Próbowałem się upewnić, odwiedzając, /data/data/my package folderaby zobaczyć, że baza danych zniknęła po odinstalowaniu i rzeczywiście ten folder jest usuwany podczas odinstalowywania.

Próbowałem usunąć aplikację, odwiedzając stronę ustawień, za pomocą Titanium Backup, a wyniki są takie same. Urządzenie jest zrootowane Nexusem 5 z wersją 6.0.

Co może być przyczyną tego dziwnego zachowania?

Narayanan
źródło

Odpowiedzi:

329

To dlatego, że Android 6 ma automatyczne tworzenie kopii zapasowych. Musisz zmodyfikować android:allowBackupi umieścić android:fullBackupContentw tekście manifestu, <application>jeśli nie chcesz tworzyć kopii zapasowej danych lub jeśli chcesz uwzględnić lub wykluczyć niektóre zasoby. To nie jest błąd.

Więcej informacji o AutoBackup na Androida tutaj .

greywolf82
źródło
28
To jest prawidłowa odpowiedź i działa dla mnie (miałem ten sam problem) Aby uniknąć tego zachowania, konieczne jest umieszczenie Androida: allowBackup = "false" i android: fullBackupContent = "false" w manifest.xml
frusso
33
Jeśli niektórzy z was zastanawiają się, android: allowBackup i android: fullBackupContent są właściwościami do dodania w <application />
Jack '
2
Z dokumentacji: android: fullBackupContent wskazuje na plik XML zawierający opcje tworzenia kopii zapasowych. Domyślnie większość plików jest archiwizowana. Chociaż ustawienie na „fałsz” nie powoduje żadnego błędu, myślę, że ustawienie jest nieprawidłowe.
bajicdusko
3
Nie jestem pewien, dlaczego zachowali domyślne zachowanie w celu wykonania kopii zapasowej, ponieważ zachowanie nie jest zsynchronizowane z poprzednimi wersjami, więc staje się denerwujące. Ci, którzy tego chcą, mogą go włączyć.
Atul
7
Czy ktoś wie, jak usunąć kopie zapasowe?
1800 INFORMACJI
31

Odpowiedź greywolf82 jest poprawna, ale chcę dodać do tego trochę informacji.

Podczas opracowywania mojej aplikacji na Androida (za pomocą Xamarin) zauważyłem, że za każdym razem, gdy ponownie uruchamiam aplikację z Visual Studio, moje dane wracają do danych sprzed kilku miesięcy. Nie miało znaczenia, czy po prostu zatrzymałem się i uruchomiłem ponownie z VS, czy całkowicie odinstalowałem aplikację i ponownie ją zainstalowałem.

Warto również zauważyć, że nigdy nie mówiliśmy wyraźnie aplikacji, aby przechowała kopię zapasową.

Wydaje się, że kopia zapasowa również zastępuje nowsze dane podczas uruchamiania z Visual Studio, a my mamy raporty użytkowników korzystających z kompilacji wersji naszej aplikacji, a także nowsze dane zastępowane przez kopie zapasowe.

Ponieważ nie wiem dokładnie, kiedy mają miejsce kopie zapasowe i przywracanie, ta funkcja wydaje się powodować tylko problemy.

Zmodyfikowaliśmy nasz AndroidManifest, jak pokazano w poniższym pliku 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>

Gdy jawnie ustawimy wartość na false, wszystko wydaje się działać. Spodziewałbym się, że będzie to funkcja opcjonalna, ale ... wygląda na to, że może być domyślnie włączona dla aplikacji, które nie określają wartości w żaden sposób.

Victor Chelaru
źródło
Dzięki. Miałem ten sam problem.
Hadi Fooladi Talari,
15

Powinieneś sprawdzić ustawienia kopii zapasowej i zerowania urządzenia oraz wyłączyć automatyczne przywracanie (podczas ponownej instalacji aplikacji ustawienia kopii zapasowej i dane zostaną przywrócone).

Wyłączenie automatycznej kopii zapasowej różni się od automatycznego przywracania. Jeśli uważasz, że pomocne będzie włączenie automatycznego tworzenia kopii zapasowej dla swojej aplikacji, zrób to. Ale jeśli uważasz, że spowoduje to, że użytkownicy końcowi, którzy nie będą świadomi, że funkcja automatycznego przywracania ich urządzenia jest włączona, możesz ją wyłączyć.

W moim przypadku wyłączyłem funkcję allowBackup, ale ponieważ miałem już kopię zapasową poprzedniej wersji w chmurze, nadal trwa przywracanie.

Zobacz obraz jako odniesienie dla urządzenia Samsung na Androidzie 6.0. Inne urządzenia i wersje mogą mieć inny ekran. Zobacz zdjęcie poniżej.

Ustawienie automatycznego przywracania w obszarze Kopia zapasowa i reset

Matcieou7th
źródło
Mam ten sam problem, moja aplikacja utworzyła kopię zapasową danych dla kilku użytkowników, gdy była włączona. Czy istnieje możliwość usunięcia / odrzucenia zsynchronizowanych danych?
Aditya Chauhan,
5

Niedawno potrzebowałem skorzystać z tych funkcji, udało mi się odkryć dokumentację i po obszernych testach udało mi się wydedukować:

Android: allowbackup - tworzy kopię zapasową danych aplikacji lokalnej na urządzeniu, na którym się znajduje.

Android: fullBackupContent - jest używany w połączeniu z interfejsem API przywracania kopii zapasowych Google i MOŻE być kontrolowany za pomocą pliku xml, aby określić, co dokładnie ma być archiwizowane, a także klasę BackupManager, którą możesz wdrożyć w celu dalszej kontroli nad procesem.

Jednak dokumentacja stwierdza i potwierdziłem podczas testów, że przywracanie nastąpi tylko wtedy, gdy urządzenie zostanie przywrócone i proces przywracania danych aplikacji zostanie uruchomiony. LUB przywróci również, gdy aplikacja zostanie załadowana bocznie przez adb, co robimy, gdy uruchamiamy aplikację do testowania lub debugowania na naszych urządzeniach za pośrednictwem Android Studio. Pamiętaj, że jeśli ustawisz Androida: allowbackup, ale nie konfigurujesz Androida: fullBackupContent za pomocą kodu Google API, dane aplikacji są zapisywane tylko lokalnie, a jeśli odpowiednio skonfigurowałeś, to jeśli twoja kopia zapasowa została utworzona, a otrzymasz nowe urządzenie, aplikacje dane były przechowywane w chmurze, dzięki czemu można je przywrócić na nowym urządzeniu.

Xijukx
źródło
3

Dodanie Androida: allowBackup = "false" pod tagiem aplikacji w pliku manifestu rozwiązało mój problem.

Oto dokumentacja Androida dotycząca tworzenia kopii zapasowych danych użytkownika za pomocą funkcji Automatyczna kopia zapasowa

Vinay John
źródło
2

Po prostu zmień androida: allowBackup = „true” na Androida: allowBackup = „false” w pliku manifiest.xml. To będzie działać.

<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>
Nag Kosanam
źródło
2

Po prostu dodając do tego, stwierdziliśmy, że w Androidzie 9 (na urządzeniu Nokia HMD), że zasoby były przechowywane, nawet po usunięciu aplikacji przez interfejs i przez adb.

Odpowiedź dodania:

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

Oczywiście nie jest to nowa odpowiedź - ale spostrzeżenie dla osób, które były w tej samej pozycji co my.

JRK
źródło
2

Jeśli celujesz w Androida 10, musisz wstawić android:hasFragileUserData="true"tag aplikacjiAndroidManifest.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 to nowe ustawienie manifestu (chyba tak). „Jeśli to prawda, użytkownik zostanie poproszony o zachowanie danych aplikacji podczas odinstalowywania”. Wydaje się to dojrzałe do nadużyć, ale widzę, gdzie może być przydatne w niektórych aplikacjach.

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

Manohar Reddy
źródło