O Backup automático para apps faz backup dos dados do usuário automaticamente de apps direcionados para o Android 6.0 (nível 23 da API) ou mais recente. O Android preserva os dados do app fazendo upload deles para o Google Drive, onde ficam protegidos pelas credenciais da Conta do Google do usuário. O backup tem criptografia de ponta a ponta em dispositivos com Android 9 ou versões mais recentes usando PIN, padrão ou senha. A quantidade de dados é limitada a 25 MB por usuário do app. Não há custos para armazenar os dados de backup. Os apps podem personalizar o processo de backup ou cancelar o uso dele desativando os backups.
Para ter uma visão geral das opções de backup do Android e ver uma orientação sobre quais dados você precisa armazenar em backup e restaurar, consulte a Visão geral do backup de dados.
Arquivos que são salvos em backup
Por padrão, o Backup automático inclui arquivos da maioria dos diretórios atribuídos ao seu app pelo sistema:
Arquivos de preferências compartilhadas.
Arquivos salvos no armazenamento interno do app, acessados por
getFilesDir()
ougetDir(String, int)
.Arquivos no diretório retornado por
getDatabasePath(String)
, que também inclui os arquivos criados pela classeSQLiteOpenHelper
.Arquivos do armazenamento externo no diretório retornado por
getExternalFilesDir(String)
.
O Backup automático exclui os arquivos nos diretórios retornados por
getCacheDir()
,
getCodeCacheDir()
e
getNoBackupFilesDir()
.
Os arquivos salvos nesses locais são necessários apenas temporariamente e são
excluídos intencionalmente das operações de backup.
É possível configurar seu app para incluir e excluir arquivos específicos. Para ver mais informações sobre isso, consulte a seção Incluir e excluir arquivos.
Local de backup
Os dados de backup são armazenados em uma pasta particular na conta do Google Drive do usuário, com o limite de 25 MB por app. Os dados salvos não contam para a cota pessoal do usuário no Google Drive. Apenas o backup mais recente é armazenado. Quando um backup é feito, o backup anterior (se existir) é excluído. Os dados de backup não podem ser lidos pelo usuário ou por outros apps do dispositivo.
O usuário pode ver uma lista dos apps que foram armazenados em backup no app Android Google Drive. Em um dispositivo com Android, o usuário pode ver essa lista na gaveta de navegação do app Drive em Configurações > Fazer backup e redefinir.
Os backups de cada ciclo de vida de configuração do dispositivo são armazenados em conjuntos de dados separados, conforme mostrado nos exemplos a seguir:
Se o usuário tiver dois dispositivos, haverá um conjunto de dados de backup para cada dispositivo.
Se o usuário redefinir um dispositivo para a configuração original e, em seguida, configurar o dispositivo usando a mesma conta, o backup será armazenado em um novo conjunto de dados. Os conjuntos de dados obsoletos serão automaticamente excluídos após um período de inatividade.
Programação do backup
Os backups ocorrem automaticamente quando todas as condições a seguir são atendidas:
- O usuário ativou o backup no dispositivo. No Android 9, essa configuração está em Configurações > Sistema > Backup.
- Pelo menos 24 horas se passaram desde o último backup.
- O dispositivo está ocioso.
- O dispositivo está conectado a uma rede Wi-Fi (se o usuário do dispositivo não tiver ativado os backups com dados móveis).
Na prática, essas condições ocorrem quase todas as noites, mas um dispositivo pode nunca fazer backup (por exemplo, se ele nunca se conectar a uma rede). Para preservar a largura de banda da rede, o upload acontecerá somente se os dados do app forem alterados.
Durante o Backup automático, o sistema desliga o app para garantir que ele não
esteja mais gravando no sistema de arquivos. Por padrão, o sistema de backup ignora
os apps que estão sendo executados em primeiro plano porque os usuários perceberiam quando os
apps fossem desligados. É possível substituir o comportamento padrão definindo o atributo
android;backupInForeground
como verdadeiro.
Para simplificar os testes, o Android inclui ferramentas que permitem iniciar manualmente um backup do app. Para mais informações, consulte Testar backup e restauração.
Programação de restauração
Os dados são restaurados sempre que o app é instalado, seja pela Play Store, durante a configuração do dispositivo (quando o sistema reinstalar os apps instalados anteriormente) ou durante a instalação do adb. A operação de restauração ocorre depois que o APK é instalado, mas antes que o app esteja disponível para ser iniciado pelo usuário.
Durante a execução do assistente de configuração inicial do dispositivo, o usuário verá uma lista de conjuntos de dados de backup disponíveis solicitando que ele escolha qual deles será usado para restaurar os dados. O conjunto de dados de backup selecionado se tornará o conjunto de dados ancestral do dispositivo. O dispositivo pode ser restaurado usando os próprios backups ou o conjunto de dados ancestral. O dispositivo priorizará o próprio backup se backups das duas fontes estiverem disponíveis. Se o usuário não tiver passado pelo assistente de configuração, o dispositivo só poderá ser restaurado usando os próprios backups.
Para simplificar o teste, o Android inclui ferramentas que permitem iniciar manualmente uma restauração do app. Para ver mais informações, consulte Testar backup e restauração.
Ativar e desativar o backup
Os apps voltados para o Android 6.0 (API de nível 23) ou versão mais recente são incluídos automaticamente
no Backup automático. No arquivo de manifesto do app, defina o valor booleano
android:allowBackup
para ativar ou desativar o backup. O valor padrão é true
, mas para deixar suas
intenções claras, recomendamos que você configure explicitamente o atributo no manifesto,
conforme mostrado abaixo:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Você pode desativar os backups definindo android:allowBackup
como false
. Faça isso
se seu app puder recriar o próprio estado usando outro mecanismo
ou se ele processar informações confidenciais que não devam ser armazenadas em backup pelo Android.
Incluir e excluir arquivos
Por padrão, o sistema faz backup de quase todos os dados dos apps. Para ver mais informações, consulte Arquivos que são salvos em backup. Esta seção mostra como definir regras XML personalizadas para controlar o que é salvo em backup. Caso seu app seja direcionado ao Android 12 (API de nível 31) ou versões mais recentes, é necessário especificar um conjunto adicional de regras de backup XML para oferecer compatibilidade com as mudanças na restauração de backup que foram introduzidos para dispositivos com o Android 12 ou mais recente.
Controlar o backup no Android 11 e em versões anteriores
Siga as etapas desta seção para incluir ou excluir arquivos que estejam em backup em dispositivos com o Android 11 (API de nível 30) ou versões anteriores.
.Em
AndroidManifest.xml
, adicione o atributoandroid:fullBackupContent
ao elemento<application>
. Esse atributo aponta para um arquivo XML que contém regras de backup. Por exemplo:<application ... android:fullBackupContent="@xml/backup_rules"> </application>
Crie um arquivo XML com o nome
@xml/backup_rules
no diretóriores/xml/
. No arquivo, adicione regras com os elementos<include>
e<exclude>
. O exemplo a seguir faz backup de todas as preferências compartilhadas, excetodevice.xml
:<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
Definir as condições do dispositivo necessárias para backup
Se o app salvar informações confidenciais no dispositivo, você poderá especificar as condições em que os dados do app serão incluídos no backup do usuário. Você pode adicionar as seguintes condições no Android 9 (API de nível 28) ou versão mais recente:
clientSideEncryption
: o backup do usuário é criptografado com um segredo do lado do cliente. Essa forma de criptografia é ativada em dispositivos com o Android 9 ou versão mais recente, desde que o usuário tenha ativado o backup no Android 9 ou mais recente e tenha definido um bloqueio de tela (PIN, padrão ou senha) para o dispositivo.deviceToDeviceTransfer
: o usuário está transferindo o backup para outro dispositivo compatível com a transferência local entre dispositivos (por exemplo, Google Pixel).
Se você fez upgrade dos seus dispositivos de desenvolvimento para o Android 9, será necessário desativar e reativar o backup de dados depois do upgrade. Isso ocorre porque o Android só criptografa os backups com um segredo do lado do cliente depois de informar os usuários nas configurações ou no assistente de configuração.
Para declarar as condições de inclusão, defina o atributo requireFlags
com os
valores que você quer usar ou os valores nos elementos <include>
dentro do conjunto de
regras de backup:
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>
Se o app implementar um sistema de backup de chave-valor
ou se você implementar
o BackupAgent,
também será possível aplicar essas condições necessárias à lógica de backup
fazendo uma comparação bit a bit entre um conjunto de sinalizações de transferência do objeto
BackupDataOutput
e as sinalizações
FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
ou
FLAG_DEVICE_TO_DEVICE_TRANSFER
do seu agente de backup personalizado.
O snippet de código a seguir mostra um exemplo de uso desse método:
Kotlin
class CustomBackupAgent : 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 CustomBackupAgent 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. }
Controlar o backup no Android 12 ou mais recente
Caso o app seja direcionado ao Android 12 (API de nível 31) ou versões mais recentes, siga as etapas desta seção para incluir ou excluir arquivos armazenados em backup em dispositivos com o Android 12 ou versões mais recentes.
.Em
AndroidManifest.xml
, adicione o atributoandroid:dataExtractionRules
ao elemento<application>
. Esse atributo aponta para um arquivo XML que contém regras de backup. Por exemplo:<application ... android:dataExtractionRules="backup_rules.xml"> </application>
Crie um arquivo XML com o nome
backup_rules.xml
no diretóriores/xml/
. No arquivo, adicione regras com os elementos<include>
e<exclude>
. O exemplo a seguir faz backup de todas as preferências compartilhadas, excetodevice.xml
:<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </cloud-backup> </data-extraction-rules>
Sintaxe de configuração XML
A sintaxe XML para o arquivo de configuração varia de acordo com a versão do Android em que o app é direcionado e está sendo executado:
Android 11 ou versão anterior
Use a seguinte sintaxe XML para o arquivo de configuração que controla o backup para dispositivos com o Android 11 ou versões anteriores.
<full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> </full-backup-content>
Android 12 ou versão mais recente
Caso o app seja direcionado ao Android 12 (API de nível 31) ou versões mais recentes, use a seguinte sintaxe XML para o arquivo de configuração que controla o backup em dispositivos com o Android 12 ou versões mais recentes.
<data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string"/> ... </cloud-backup> <device-transfer> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string"/> ... </device-transfer> </data-extraction-rules>
Cada seção da configuração (<cloud-backup>
, <device-transfer>
)
contém regras que se aplicam apenas a esse tipo específico de transferência. Essa
separação permite, por exemplo, excluir um arquivo ou diretório dos backups do Google
Drive enquanto ainda o estiver enviando em uma transferência
dispositivo para dispositivo (D2D). Isso poderá ser útil se você tiver arquivos muito grandes para fazer backup
na nuvem, mas que podem ser transferidos entre dispositivos sem problemas.
Se não houver regras para um modo de backup específico, como se a
seção <device-transfer>
estiver ausente, esse modo será totalmente ativado para todo
o conteúdo, exceto para os diretórios no-backup
e cache
, conforme descrito em Arquivos
armazenados em backup.
O app pode definir a sinalização disableIfNoEncryptionCapabilities
na
seção <cloud-backup>
para garantir que o backup aconteça apenas se puder
ser criptografado, como quando o usuário tem uma tela de bloqueio. A definição dessa restrição
impedirá que os backups sejam enviados à nuvem se o dispositivo do usuário não for compatível com
a criptografia. Porém, como as transferências D2D não são enviadas ao servidor, elas continuarão
funcionando até mesmo em dispositivos que não são compatíveis com criptografia.
Sintaxe para os elementos "incluir" e "excluir"
Dentro das tags <full-backup-content>
, <cloud-backup>
e <device-transfer>
,
dependendo da versão do Android do dispositivo e da targetSDKVersion
do app, é possível definir os elementos <include>
e <exclude>
:
<include>
Especifica um arquivo ou uma pasta para ser salva em backup. Por padrão, o Backup automático inclui quase todos os arquivos dos apps. Se você especificar um elemento
<include>
, o sistema não incluirá mais arquivos por padrão e fará o backup somente dos arquivos especificados. Para incluir vários arquivos, use vários elementos<include>
.No Android 11 e versões anteriores, esse elemento também pode conter o atributo
requireFlags
, discutido em mais detalhes na seção que descreve como definir requisitos condicionais para backup.<exclude>
Especifica um arquivo ou uma pasta a serem excluídos do backup. Veja alguns arquivos que costumam ser excluídos do backup:
Arquivos que têm identificadores específicos ao dispositivo, emitidos por um servidor ou gerados no dispositivo. Por exemplo, o Firebase Cloud Messaging (FCM) precisa gerar um token de registro toda vez que um usuário instalar o app em um novo dispositivo. Se o token de registro antigo for restaurado, o app poderá ter um comportamento inesperado.
Arquivos relacionados à depuração do app.
Arquivos grandes que fazem com que o app exceda a cota de backup de 25 MB.
Cada elemento <include>
e <exclude>
precisa incluir os dois
atributos a seguir:
domain
Especifica o local do recurso. Os valores válidos para esse atributo incluem:
root
: o diretório no sistema de arquivos em que todos os arquivos particulares pertencentes ao app são armazenados.file
: diretórios retornados porgetFilesDir()
.database
: diretórios retornados porgetDatabasePath()
. Os bancos de dados criados peloSQLiteOpenHelper
são armazenados neste elemento.sharedpref
: o diretório onde asSharedPreferences
são armazenadas.external
: o diretório retornado porgetExternalFilesDir()
.
path
Especifica um arquivo ou uma pasta a serem incluídos ou excluídos do backup. Observe o seguinte:
- Esse atributo não é compatível com a sintaxe de caractere curinga ou regex.
- É possível referenciar o diretório atual usando
./
, mas não é possível referenciar o diretório pai..
por motivos de segurança. - Se você especificar um diretório, a regra se aplicará a todos os arquivos que estiverem nele e nos subdiretórios recursivos.
Implementar o BackupAgent
Os apps que implementam o Backup automático não precisam implementar um
BackupAgent
. No entanto, você pode
implementar um BackupAgent
personalizado como uma opção. Normalmente, há duas
razões para fazer isso:
Você quer receber notificações de eventos de backup, como
onRestoreFinished()
eonQuotaExceeded(long, long)
. Esses métodos de callback são executados mesmo que o app não esteja em execução.Você não consegue expressar com facilidade o conjunto de arquivos que quer armazenar em backup usando regras XML. Nesses casos raros, é possível implementar um BackupAgent que substitui o método
onFullBackup(FullBackupDataOutput)
para armazenar o que você quer. Para manter a implementação padrão do sistema, chame o método correspondente na superclasse usandosuper.onFullBackup()
.
Se você implementar um BackupAgent, o sistema esperará, por padrão, que o app
faça o backup e a restauração de chave-valor. Para
usar o Backup automático baseado em arquivos, defina o atributo
android:fullBackupOnly
como true
no manifesto do app.
Durante as operações automáticas de backup e restauração, o sistema inicia o app em
um modo restrito para evitar que ele acesse arquivos que possam
causar conflitos e permitir que o app execute métodos de callback no BackupAgent
. No
modo restrito, a atividade principal do app não é iniciada automaticamente, os
provedores de conteúdo não são
inicializados e o
Application
de classe básica é instanciado, em vez de
qualquer subclasse declarada no manifesto
do app.
Seu BackupAgent
precisa implementar os métodos abstratos
onBackup()
e
onRestore()
,
que são usados para o backup de chave-valor. No entanto, se você não quiser fazer o backup
de chave-valor, poderá deixar a implementação desses métodos em branco.
Para mais informações, consulte Estender o BackupAgent.