Jak wykonać kopię zapasową danych Twojej aplikacji w chmurze

Typowa aplikacja dla systemu Android zawiera wiele informacji, które użytkownicy będą chcieli przenieść na nowe urządzenie. Począwszy od nazwy użytkownika i hasła, a skończywszy na wszelkich zmianach wprowadzonych w ustawieniach. Jako programista powinieneś zadbać o to, aby użytkownik był wstanie kontynuować prace zaraz po jej zainstalowaniu na nowym telefonie zamiast ustawiać wszystko od nowa. Przyjrzyjmy się w jaki sposób tworzyć automatyczne kopie zapasowe danych użytkownika w chmurze.

Zapisywanie danych aplikacji na Dysku Google

Od wersji Androida 6.0 możesz użyć automatycznej kopii zapasowej, by zapisać dane aplikacji na koncie użytkownika. Maksymalnie możesz zapisać 25 MB — nie będzie miało to wpływu na limit miejsca na Dysku Google. Za każdym razem, gdy aplikacja zostanie ponownie zainstalowana, dane te zostaną automatycznie przywrócone. Automatyczna kopia zapasowa jest domyślnie włączona, ponieważ atrybut android:allowBackup ma wartość true. Jednak w przyszłości może się to zmienić dlatego warto sprawdzić tę opcję w pliku Manifestu:

<application
    android:allowBackup="true"
    ....

Uwzględniaj to co potrzebujesz

Domyślnie automatyczna kopia zapasowa przechowuje prawie całą zawartość Twojej aplikacji, w tym udostępnione pliki preferencji, dane niestandardowe zapisane w pamięci wewnętrznej aplikacji oraz pliki zapisane w pamięci zewnętrznej.
Ze względu na modyfikacje wprowadzone przez producentów urządzeń automatyczna kopia zapasowa może się różnić między urządzeniami, co utrudnia zagwarantowanie bezpieczeństwa danych. Na przykład mogą wystąpić problemy z treściami z unikalnym identyfikatorem, takie jak identyfikatory rejestracji Google Cloud Messaging (GCM). Jeśli system przywróci tego typu treści na nowym urządzeniu. Dlatego w niektórych przypadkach warto wskazać, które elementy mają zostać synchronizowane z chmurą.
Jeśli chcesz określić, jakie dane mają zostać wysłane musisz utworzyć plik zawierający zasady tworzenia kopii. Utwórz folder XML w zasobach res, a następnie plik o nazwie backup_rules.xml. Plik może mieć następująca postać:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!--Specify the file(s) or folder(s) that you want to include in your backups-->
    <include domain="sharedpref" path="."/>
    <!--Specify the file(s) or folder(s) that you want to exclude from your backups-->
    <exclude
    domain="sharedpref"
    path="net.myenv.myapplication.API.xml" />
</full-backup-content>

Element <include> określa plik lub folder do utworzenia kopii zapasowej. Pliki w katalogach zwrócone przez getCacheDir(), getCodeCacheDir() lub getNoBackupFilesDir() są zawsze wykluczone, nawet jeśli spróbujesz je uwzględnić. 

Element <exclude> określa plik lub folder do wykluczenia podczas tworzenia kopii zapasowej. Tutaj warto dodać takie wartości jak

    • pliki z identyfikatorami na przykład z Google Cloud Messaging (GCM)
    • dane logowania do konta lub inne poufne informacje
    • pliki związane z debugowaniem aplikacji
  • duże pliki powodujące przekroczenie limitu kopii zapasowej o 25 MB

Każdy element powinien zawierać następujące dwa atrybuty: domain i path. Domain– określa lokalizację zasobu. Inne wartości tego atrybutu to:

  • root – katalog, w którym przechowywane są wszystkie prywatne pliki aplikacji
  • file – katalog zwrócony przez getFilesDir()
  • database – katalog zwrócony przez getDatabasePath()
  • external – katalog zwracany przez getExternalFilesDir()
  • sharedpref– katalog. w którym są przechowywane dane SharedPreferencessą.

Atrybut Path określa plik lub folder do włączenia lub wykluczenia z kopii zapasowej. Ten atrybut nie obsługuje wyrażeń regularnych.
Po utworzeniu reguł wystarczy odwołać się do tego pliku w Manifeście:

<application
    android:fullBackupContent="@xml/my_backup_rules"
    ...

W Androidzie 9 wprowadzono atrybut clientSideEncryption. Ustawienie tego atrybutu oznacza, że kopia zapasowa użytkownika jest szyfrowana za pomocą hasła po stronie klienta. Ta forma szyfrowania jest włączona na urządzeniach z Androidem 9.0 lub nowszym, o ile użytkownik uruchomił kopię zapasową w systemie Android 9.0 lub nowszym i ustawił blokadę ekranu (PIN, wzór lub hasło) dla swojego urządzenia.

<include 
    domain="file" 
    path="."
    requireFlags="clientSideEncryption"
/>

Testowanie automatycznej kopii zapasowej

Kopie zapasowe tworzą się automatycznie, gdy poniższe warunki są spełnione:

  • automatyczna kopia zapasowa jest włączona na urządzeniu
  • minęły co najmniej 24 godziny od ostatniej utworzonej kopii zapasowej
  • dane aplikacji uległy zmianie od czasu poprzedniej kopii zapasowej
  • urządzenie jest bezczynne i ładuje się, z aktywnym połączeniem Wi-Fi

Podczas testowania aplikacji nie trzeba czekać 24 godzin, aby kopia zapasowa wykonała się. Możesz sprawdzić mechanizm działania automatycznej kopii zapasowej swojej aplikacji na żądanie za pomocą poleceń adb (Android Debug Bridge). W tym celu upewnij się, że włączyłeś automatyczną kopię zapasową i zarejestrowałeś konto Google na urządzeniu lub emulatorze, którego używasz do testowania. Włącz aplikację i umieść w niej kilka danych. Następnie wydaj polecenie:

adb shell bmgr backupnow

Po chwili polecenie powinno zwrócić informacje, że proces zakończył się sukcesem. Aby przywrócić tę kopię zapasową, odinstaluj aplikację, a następnie zainstaluj ją ponownie. Po uruchomieniu aplikacji wszystkie dane uwzględnione w kopii zapasowej powinny zostać przywrócone.
Tworzenie automatycznej kopii zapasowej pozwala na przenoszenie danych między urządzeniami bez ingerencji programisty, wszystko odbywa się w tle. Użytkownik widząc takie udogodnienia na pewno nie zrezygnuje z korzystania z Twojej aplikacji. Czy korzystasz z techniki niewymienionej w tym artykule? Daj znać w komentarzach poniżej!

Co dalej?

  • Polub stronę MYENV na Facebooku oraz śledź mnie na Twitterze
  • Zachęcam do komentowania i pisania propozycji tematów, o których chcesz przeczytać
  • Poleć ten wpis za pomocą poniższych przycisków. Będę Ci za to bardzo wdzięczny 🙂
  • Życzę Ci miłego dnia i miłego kodowania 🙂