A felhasználói adatok biztonsági mentése az automatikus biztonsági mentéssel

Auto Backup for Apps automatikusan biztonsági mentést készít a felhasználói adatokról az Android 6.0 (API 23. szint) vagy újabb Android 6.0 (API 23) vagy újabb operációs rendszert használó alkalmazásokról. Az Android úgy őrzi meg az alkalmazásadatokat, hogy feltölti azokat a felhasználó Google Drive-jára, ahol a felhasználó Google-fiókjának hitelesítő adatai védik azokat. Az adatmennyiség az alkalmazás felhasználói számára 25 MB-ra korlátozódik, és a biztonsági másolat tárolásáért nem kell fizetni. Az alkalmazás testreszabhatja a biztonsági mentési folyamatot, vagy letilthatja a biztonsági mentést.

Az Android biztonsági mentési lehetőségeinek áttekintését és útmutatást arról, hogy mely adatokról érdemes biztonsági másolatot készíteni és visszaállítani, lásd az adatmentés áttekintése.

A biztonsági mentésre kerülő fájlok

Az automatikus biztonsági mentés alapértelmezés szerint a rendszer által az alkalmazáshoz rendelt legtöbb könyvtárban található fájlokat tartalmazza:

  • Megosztott beállításfájlok.
  • Az alkalmazás belső tárhelyére mentett fájlok, amelyeket a getFilesDir() vagy a getDir(String, int) segítségével érhet el.
  • A getDatabasePath(String) által visszaadott könyvtárban található fájlok, amely magában foglalja a SQLiteOpenHelper osztállyal létrehozott fájlokat is.
  • A getExternalFilesDir(String) által visszaadott könyvtárban lévő külső tárolón lévő fájlok.

Az automatikus biztonsági mentés kizárja a getCacheDir()getCodeCacheDir() vagy getNoBackupFilesDir() által visszaadott könyvtárakban lévő fájlokat. Az ezeken a helyeken mentett fájlokra csak ideiglenesen van szükség, vagy azokat szándékosan kizárja a mentési műveletekből.

Az alkalmazást úgy konfigurálhatja, hogy bizonyos fájlokat felvegyen és kizárjon. További információért lásd a Fájlok felvétele és kizárása című részt.

Megjegyzés: Az Android nem kezeli felhasználói adatként az összetevők konfigurációját. Ha az alkalmazás futás közben engedélyez vagy letilt bizonyos komponenseket a manifesztjében, ne számítson arra, hogy az AutoBackup elmenti és visszaállítja a konfigurációt. A konfigurációs állapot megőrzéséhez mentse azt a Megosztott beállításokban, és helyreállításkor állítsa vissza a Megosztott beállításokat. Ha azt szeretné, hogy az alkalmazás mentse az állapotát, tárolja az állapotot a Megosztott beállításokban, és állítsa vissza a visszaállításkor a Megosztott beállításokat.

A biztonsági mentés helye

A biztonsági mentés adatai a felhasználó Google Drive fiókjának egy privát mappájában kerülnek tárolásra,alkalmazásonként 25 MB-ra korlátozva. A mentett adatok nem számítanak bele a felhasználó személyes Google Drive kvótájába. Csak a legfrissebb biztonsági mentés kerül tárolásra. A biztonsági mentés elkészítésekor az előző biztonsági mentés (ha létezik) törlődik. A biztonsági másolat adatait sem a felhasználó, sem a készülék más alkalmazásai nem olvashatják.

A felhasználók a Google DriveAndroid alkalmazásban láthatják a biztonsági másolatokat készített alkalmazások listáját. Androidos készüléken a felhasználók ezt a listát a Driveapp navigációs fiókjában találják a Beállítások > Biztonsági mentés és visszaállítás > Alkalmazásadatok alatt.

Az egyes készülékekről készült biztonsági mentések az alábbi példák szerint külön adatállományokban tárolódnak:

  • Ha a felhasználó két készülékkel rendelkezik, akkor mindkét készülékhez létezik egy-egy biztonsági mentési adatállomány.
  • Ha a felhasználó gyárilag visszaállít egy eszközt, majd beállítja az eszközt ugyanazzal a fiókkal, akkor a biztonsági másolat egy új adatállományban tárolódik. Az elavult adatkészletek egy bizonyos inaktivitási időszak után automatikusan törlődnek.

Biztonsági mentés ütemezése

A biztonsági mentés automatikusan megtörténik, ha az alábbi feltételek mindegyike teljesül:

  • A felhasználó engedélyezte a biztonsági mentést az eszközön. Az Android 9-ben ez a beállítás a Beállítások > Rendszer > Biztonsági mentés menüpontban található.
  • A legutóbbi biztonsági mentés óta legalább 24 óra eltelt.
  • A készülék nem üzemel.
  • A készülék csatlakozik egy Wi-Fi hálózathoz (ha a készülék felhasználója nem döntött a mobiladatok biztonsági mentése mellett).

A gyakorlatban ezek a feltételek nagyjából minden éjszaka bekövetkeznek, de előfordulhat, hogy egy készülék soha nem készít biztonsági mentést (például ha soha nem csatlakozik hálózathoz). A hálózati sávszélesség kímélése érdekében a feltöltésre csak akkor kerül sor, ha az alkalmazás adatai megváltoztak.

Az automatikus biztonsági mentés során a rendszer leállítja az alkalmazást, hogy megbizonyosodjon arról, hogy az már nem ír a fájlrendszerbe. Alapértelmezés szerint a biztonsági mentési rendszer figyelmen kívül hagyja az előtérben futó alkalmazásokat, mivel a felhasználók észrevennék az alkalmazásuk leállítását. Az alapértelmezett viselkedést felülbírálhatja, ha a backupInForeground attribútumot true-ra állítja.

A tesztelés egyszerűsítése érdekében az Android tartalmaz olyan eszközöket, amelyekkel manuálisan kezdeményezheti az alkalmazás biztonsági mentését. További információért lásd: Biztonsági mentés és visszaállítás tesztelése.

A visszaállítás ütemezése

Az adatok visszaállítása az alkalmazás telepítésekor történik, akár a Play áruházból, akár a készülék beállítása során (amikor a rendszer telepíti a korábban telepített alkalmazásokat), akár az adb install futtatásával. A visszaállítási művelet az APK telepítése után történik, de még azelőtt, hogy az alkalmazást a felhasználó elindíthatná.

A készülék kezdeti beállítási varázslója során a felhasználónak megjelenik a rendelkezésre álló biztonsági mentési adatkészletek listája, és megkérdezi, hogy melyikből kívánja visszaállítani az adatokat. Amelyik biztonsági mentési adatkészletet kiválasztja, az lesz az eszköz ősi adatkészlete. Az eszköz a saját biztonsági másolataiból vagy az ősi adatállományból is visszaállíthat. Az eszköz a saját biztonsági másolatát helyezi előtérbe, ha mindkét forrásból rendelkezésre állnak biztonsági másolatok. Ha a felhasználó nem ment keresztül az eszközbeállítási varázslón, akkor az eszköz csak a saját biztonsági mentéseiből tud visszaállítani.

A tesztelés egyszerűsítése érdekében az Android olyan eszközöket tartalmaz, amelyekkel manuálisan kezdeményezheti az alkalmazás visszaállítását. További információért lásd: Biztonsági mentés és visszaállítás tesztelése.

A biztonsági mentés engedélyezése és letiltása

Az Android 6.0 (23-as API-szint) vagy magasabb szintű Androidot célzó alkalmazások automatikusan részt vesznek az automatikus biztonsági mentésben. Az alkalmazás manifeszt fájljában állítsa be a boolean értéketandroid:allowBackupa biztonsági mentés engedélyezéséhez vagy letiltásához. Az alapértelmezett érték true, de a szándékok egyértelművé tétele érdekében javasoljuk, hogy az alábbiakban látható módon kifejezetten állítsa be az attribútumot a manifesztjében:

<manifest ... > ... <application android:allowBackup="true" ... > ... </application></manifest>

A mentést letilthatja a android:allowBackupfalse értékre történő beállításával. Ezt akkor érdemes megtenni, ha az alkalmazásod más mechanizmuson keresztül képes újra létrehozni az állapotát, vagy ha az alkalmazásod olyan érzékeny információkkal foglalkozik, amelyekről az Androidnak nem kellene biztonsági mentést készítenie.

Fájlok felvétele és kizárása

Alapértelmezés szerint a rendszer szinte az összes alkalmazásadatról biztonsági mentést készít. További információért lásd a Biztonsági mentésre kerülő fájlok című részt. Ez a szakasz bemutatja, hogyan határozhat meg egyéni XML-szabályokat annak ellenőrzésére, hogy mi kerüljön biztonsági mentésre.

  1. A AndroidManifest.xml-ben adja hozzá a android:fullBackupContent attribútumot a <application> elemhez. Ez az attribútum a biztonsági mentési szabályokat tartalmazó XML-fájlra mutat. For example:
    <application ... android:fullBackupContent="@xml/my_backup_rules"></application>
  2. Create an XML file called my_backup_rules.xml in theres/xml/ directory. Inside the file, add rules with the<include> and <exclude> elements.The following sample backs up all shared preferences exceptdevice.xml
    <?xml version="1.0" encoding="utf-8"?><full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/></full-backup-content>

XML config syntax

The XML syntax for the configuration file is shown below:

<full-backup-content> <include domain= path="string" requireFlags= /> <exclude domain= path="string" /></full-backup-content>

Inside the <full-backup-content> tag, you can define <include> and <exclude> elements:

  • <include> – Specifies a file or folder to backup. By default, Auto Backup includes almost all app files. If you specify an <include> element, the system no longer includes any files by default and backs up only the files specified. Több fájl felvételéhez használjon több <include> elemet.

    Megjegyzés: A getCacheDir()getCodeCacheDir() vagy getNoBackupFilesDir() által visszaadott könyvtárakban lévő fájlok mindig kizárásra kerülnek, még akkor is, ha megpróbálja őket bevonni.

  • <exclude> – A mentés során kizárandó fájl vagy mappa megadása. Íme néhány olyan fájl, amelyet jellemzően kizárunk a biztonsági mentésből:
    • Azok a fájlok, amelyek eszközspecifikus azonosítókkal rendelkeznek, amelyeket vagy egy kiszolgáló ad ki, vagy az eszközön generálnak. A Google Cloud Messaging (GCM) például minden alkalommal, amikor egy felhasználó új eszközre telepíti az alkalmazást, regisztrációs tokent kell generálnia. Ha a régi regisztrációs tokent visszaállítják, az alkalmazás váratlanul viselkedhet.
    • Fiók hitelesítő adatok vagy más érzékeny információk. Fontolja meg, hogy a visszaállított alkalmazás első indításakor a felhasználótól újbóli hitelesítést kérjen, ahelyett, hogy lehetővé tenné az ilyen információk tárolását a biztonsági mentésben.
    • Az alkalmazás hibakeresésével kapcsolatos fájlok.
    • Large files that cause the app to exceed the 25MB backup quota.

Note: If your configuration file specifies both elements, then the backup contains everything captured by the <include> elements minus the resources named in the <exclude> elements. In other words, <exclude> takes precedence.

Each element must include the following two attributes:

  • domain – specifies the location of resource. Valid values for this attribute include the following:
    • root – the directory on the filesystem where all private files belonging to this app are stored.
    • file – directories returned by getFilesDir().
    • database – directories returned by getDatabasePath(). Databases created with SQLiteOpenHelper are stored here.
    • sharedpref – the directory where SharedPreferences are stored.
    • external the directory returned by getExternalFilesDir()
  • Note: You cannot back up files outside of these locations.

  • path: Specifies a file or folder to include in or exclude from backup. Note that:
    • This attribute does not support wildcard or regex syntax.
    • You can use . to reference the current directory, however, you cannot reference the parent directory .. for security reasons.
    • If you specify a directory, then the rule applies to all files in the directory and recursive sub-directories.

The include element can also contain the requireFlags attribute, which thesection describing how to define conditional requirements forbackup section discusses in more detail.

A biztonsági mentéshez szükséges eszközfeltételek meghatározása

Ha az alkalmazás érzékeny adatokat ment az eszközön, megadhatja azokat a feltételeket, amelyek mellett az alkalmazás adatai bekerülnek a felhasználói biztonsági mentésbe. A következő feltételeket adhatja meg az Android 9-ben (28. API-szint) vagy annál magasabb szinten:

  • clientSideEncryption: A felhasználó biztonsági mentése ügyféltitkosítással van titkosítva. A titkosításnak ez a formája az Android 9 vagy magasabb operációs rendszert futtató eszközökön engedélyezett, amennyiben a felhasználó engedélyezte a biztonsági mentést az Android 9 vagy magasabb operációs rendszerben, és képernyőzárat (PIN-kódot, mintát vagy jelszót) állított be a készülékén.
  • deviceToDeviceTransfer: A felhasználó átviszi a biztonsági másolatát egy másik készülékre, amely támogatja a helyi eszköz-eszköz átvitelt (például Google Pixel).

Ha a fejlesztői eszközeit Android 9-re frissítette, akkor a frissítés után ki kell kapcsolnia, majd újra engedélyeznie kell az adatmentést. Ennek az az oka, hogy az Android csak azután titkosítja a biztonsági mentéseket egy ügyféloldali titokkal, miután tájékoztatta a felhasználókat a Beállításokban vagy a Beállítási varázslóban.

A felvételi feltételek deklarálásához állítsa a requireFlags attribútumot a kívánt értékre vagy értékekre a <include> elemekben a biztonsági mentési szabálykészletén belül:

my_backup_rules.xml

<?xml version="1.0" encoding="utf-8"?><full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /><full-backup-content>

Ha az alkalmazása kulcs-érték mentési rendszert valósít meg, vagy ha maga implementálja aBackupAgent,akkor is alkalmazhatja ezeket a feltételes követelményeket a mentési logikájára úgy, hogy bitenkénti összehasonlítást végez egyBackupDataOutput objektum szállítási zászlókészlete és az egyéni mentési ügynökFLAG_CLIENT_SIDE_ENCRYPTION_ENABLEDvagy FLAG_DEVICE_TO_DEVICE_TRANSFERzászlók között.

A következő kódrészlet egy példát mutat ennek a módszernek a használatára:

Kotlin

class MyCustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here.}

Java

public class MyCustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here.}

Implement BackupAgent

Apps that implement Auto Backup do not need to implement a BackupAgent. However, you can optionally implement a custom BackupAgent. Typically, there are two reasons for doing this:

  • You want to receive notification of backup events such as, onRestoreFinished() or onQuotaExceeded(long, long). These callback methods are executed even if the app is not running.
  • You can’t easily express the set of files you want to backup with XML rules. In these rare cases, you can implement a BackupAgent that overrides onFullBackup(FullBackupDataOutput) to store what you want. To retain the system’s default implementation, call the corresponding method on the superclass with super.onFullBackup().

If you implement a BackupAgent, by default the system expects your app to perform key/value backup and restore. Ha ehelyett a fájlalapú automatikus biztonsági mentést szeretné használni, állítsa be az android:fullBackupOnly attribútumot true-re az alkalmazás manifesztjében.

Az automatikus biztonsági mentési és visszaállítási műveletek során a rendszer korlátozott módban indítja el az alkalmazást, hogy egyrészt megakadályozza, hogy az alkalmazás hozzáférjen olyan fájlokhoz, amelyek konfliktusokat okozhatnak, másrészt lehetővé teszi, hogy az alkalmazás a BackupAgent-ben lévő callback-módszereket hajtsa végre. Ebben a korlátozott módban az alkalmazás fő tevékenysége nem indul el automatikusan, a tartalomszolgáltatók nem inicializálódnak, és a Application alaposztálya instanciálódik az alkalmazás manifesztjében deklarált bármely alosztály helyett.

Vigyázat: A hibák elkerülése érdekében győződjön meg arról, hogy az alkalmazás korlátozott módban futtatott részei (főként a BackupAgent) nem férnek hozzá ugyanabban az alkalmazásban lévő tartalomszolgáltatókhoz, és nem próbálják meg a Application objektumot önteni. Ha nem tudja elkerülni ezeket a mintákat, akkor fontolja meg a kulcs-érték mentés megvalósítását vagy a mentés teljes kikapcsolását.

A BackupAgent-nek implementálnia kell a onBackup() és onRestore() absztrakt metódusokat, amelyeket a kulcs-érték mentéshez használnak. Ha azonban nem akar kulcs-érték mentést végrehajtani, akkor egyszerűen üresen hagyhatja ezeknek a metódusoknak az implementációját.

További információért lásd: Extending BackupAgent.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.