标签: android-backup-service

什么是"android:allowBackup"?

自从新的ADT预览版本(版本21)以来,它们有一个新的lint警告,它告诉我清单文件(在应用程序标记中)的下一件事:

应该明确地将android:allowBackup设置为true或false(默认情况下为true,这可能会对应用程序的数据产生一些安全隐患)

官方网站上,他们写道:

一些新检查:您必须明确决定您的应用是否允许备份和标签检查.有一个新的命令行标志用于设置库路径.编辑时增量lint分析的许多改进.

这警告是什么?什么是备份功能,以及如何使用它?

另外,为什么警告告诉我它有安全隐患?禁用此功能有哪些缺点和优点?


清单有两种备份概念:

  • "机器人:allowBackup "允许备份和通过ADB恢复,如图所示在这里:

是否允许应用程序参与备份和还原基础结构.如果此属性设置为false,则不会执行应用程序的备份或还原,即使是全系统备份也会导致所有应用程序数据都通过adb保存.此属性的默认值为true.

这被认为是一个安全问题,因为人们可以通过ADB备份您的应用,然后将您应用的私人数据导入他们的PC.

但是,我认为这不是一个问题,因为大多数用户不知道什么是adb,如果他们这样做,他们也会知道如何根设备.ADB功能仅在设备启用了调试功能时才有效,这需要用户启用它.

因此,只有将其设备连接到PC并启用调试功能的用户才会受到影响.如果他们的PC上有使用ADB工具的恶意应用程序,这可能会有问题,因为应用程序可以读取私有存储数据.

我认为Google应该在开发人员类别中添加默认禁用的功能,以允许通过ADB备份和恢复应用.

  • "机器人:backupAgent "允许使用的备份和恢复云的功能,如在这里这里:

实现应用程序备份代理的类的名称,BackupAgent的子类.属性值应该是完全限定的类名(例如"com.example.project.MyBackupAgent").但是,作为简写,如果名称的第一个字符是句点(例如,".MyBackupAgent"),则它将附加到元素中指定的包名称.没有默认值.必须指定名称.

这不是安全问题.

android adt compiler-warnings android-lint android-backup-service

252
推荐指数
3
解决办法
13万
查看次数

Android备份/恢复:如何备份内部数据库?

我已经实现了BackupAgentHelper使用提供FileBackupHelper的备份和恢复我拥有的本机数据库.这是您通常与之一起使用ContentProviders并驻留在其中的数据库/data/data/yourpackage/databases/.

人们会认为这是一个常见的情况.但是,文档不清楚该怎么做:http://developer.android.com/guide/topics/data/backup.html.这些典型的数据库并不BackupHelper专门.因此,我使用了FileBackupHelper,将它指向我在."中的.db文件,在我的/databases/任何数据库操作(例如db.insert)中引入了锁ContentProviders,甚至尝试创建" /databases/"目录,onRestore()因为它在安装后不存在.

我已经SharedPreferences在过去的不同应用程序中成功实现了类似的解决方案.但是,当我在模拟器2.2中测试我的新实现时,我看到正在LocalTransport从日志执行备份,以及正在执行(并onRestore()调用)恢复.然而,db文件本身永远不会被创建.

请注意,这是在安装之后,以及在首次启动应用程序之后,在执行还原之后.除此之外,我的测试策略基于http://developer.android.com/guide/topics/data/backup.html#Testing.

还请注意,我不是在谈论我自己管理的一些sqlite数据库,也不是要备份到SDcard,自己的服务器或其他地方.

我确实在文档中提到有关建议使用自定义的数据库,BackupAgent但它似乎并不相关:

但是,如果需要,可能需要直接扩展BackupAgent:*备份数据库中的数据.如果您在用户重新安装应用程序时有要还原的SQLite数据库,则需要构建一个自定义BackupAgent,在备份操作期间读取相应的数据,然后创建表并在还原操作期间插入数据.

请清楚一点.

如果我真的需要自己完成SQL级别,那么我担心以下主题:

  • 打开数据库和事务.我不知道如何在应用程序的工作流程之外从这样的单例类中关闭它们.

  • 如何通知用户正在进行备份并且数据库已锁定.这可能需要很长时间,所以我可能需要显示进度条.

  • 如何在恢复时执行相同操作.据我了解,恢复可能发生在用户已经开始使用应用程序(并将数据输入数据库)时.所以你不能假定只是恢复备份数据(删除空数据或旧数据).你必须以某种方式加入它,由于id的原因,任何非平凡的数据库都是不可能的.

  • 如何在恢复完成后刷新应用程序,而不会让用户卡在某个 - 现在 - 无法访问的点.

  • 我可以确定数据库是否已在备份或还原时升级?否则,预期的架构可能不匹配.

database android restore database-restore android-backup-service

86
推荐指数
5
解决办法
4万
查看次数

如何测试Android 6.0完全备份行为?

TL; DR:你如何成功地使用命令行工具(或其他任何东西)来测试Android 6.0备份和恢复行为,因为我无法让它们恢复任何东西?


由于我早些时候遇到了问题,我的书中有一个示例应用程序试图让这个工作,我从头开始为了这个问题的目的.

我从Android Studio 1.4.1新项目向导创建了一个全新的项目,接受所有相关的默认设置,除了我使用"空活动"模板并添加了2应用程序ID和显示名称.然后我在活动中添加了一些代码,以便为我提供有关内部存储的一些数据:

package com.commonsware.myapplication2;

import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PreferenceManager
      .getDefaultSharedPreferences(this)
      .edit()
      .putBoolean("foo", true)
      .apply();
  }
}
Run Code Online (Sandbox Code Playgroud)

我运行应用程序并确认,使用adb shell run-as com.commonsware.myapplication2 ...SharedPreferences文件存在.

然后我adb shell setprop log.tag.BackupXmlParserLogging VERBOSE根据文档跑了.没有明显的问题.

然后我adb shell bmgr run按照文档运行,它生成了大量的日志消息,但没有任何与我的应用程序有关的内容(正如预期的那样)(并且也没有暗示备份引擎的任何特殊问题).

然后我adb shell bmgr fullbackup com.commonsware.myapplication2根据文档运行,生成:

11-16 15:09:15.246 10372-10372/? D/AndroidRuntime: Calling main entry com.android.commands.bmgr.Bmgr
11-16 15:09:15.248 …
Run Code Online (Sandbox Code Playgroud)

android android-backup-service android-6.0-marshmallow

33
推荐指数
1
解决办法
3417
查看次数

Android - 在卸载时保留或删除应用程序创建的文件

我创建了一个创建文件并将文件存储到SD卡的应用程序.有没有办法将文件夹与应用程序绑定,以便在用户在Android设备上运行卸载时删除所有文件?

backup android uninstall android-lifecycle android-backup-service

24
推荐指数
3
解决办法
3万
查看次数

BackupManager未调用备份传输

好吧,所以我正在尝试将数据备份实施到我的应用程序中,并且一直在遵循本指南.我已经实现了我的BackupAgentHelper使用SharedPreferencesBackupHelper.我没有得到任何错误,并且我确定dataChanged()在所有首选项更改后调用,但是当我测试备份(`adb shell bmgr run)时,我在LogCat中获取此信息:

07-07 12:29:00.258: V/BackupManagerService(291): Scheduling immediate backup pass
07-07 12:29:00.258: V/BackupManagerService(291): Running a backup pass
07-07 12:29:00.258: V/BackupManagerService(291): clearing pending backups
07-07 12:29:00.258: V/PerformBackupTask(291): Beginning backup of 1 targets
07-07 12:29:00.289: V/BackupServiceBinder(291): doBackup() invoked
07-07 12:29:00.289: D/PerformBackupTask(291): invokeAgentForBackup on @pm@
07-07 12:29:00.297: I/PerformBackupTask(291): no backup data written; not calling transport
Run Code Online (Sandbox Code Playgroud)

所以为了参考,在我的清单中我添加了:

<application
        android:allowBackup="true"
        android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent"
Run Code Online (Sandbox Code Playgroud)

以及

<meta-data
        android:name="com.google.android.backup.api_key"
        android:value="my_key_goes_here" />
Run Code Online (Sandbox Code Playgroud)

我的BackupAgentHelper实现如下:

public class SudokuBackupAgent extends BackupAgentHelper {
    static final String …
Run Code Online (Sandbox Code Playgroud)

backup android sharedpreferences android-backup-service

22
推荐指数
1
解决办法
5690
查看次数

onRestore没有为我的自定义BackupAgent调用

我的Android应用中有一些数据要备份和恢复.为此我创建了一个自定义实现BackupAgent.

在我的清单中包含了备份代理,如下所示

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="auto"
    package="com.myapp"
    android:versionCode="14"
    android:versionName="1.13" >

    <application
        android:backupAgent="com.myapp.MyBackupAgent">

        <meta-data
            android:name="com.google.android.backup.api_key"
            android:value="my key" />
Run Code Online (Sandbox Code Playgroud)

我已经包含了备份服务api密钥,虽然我正在使用模拟器(Android 2.2)进行测试,但它并不是必需的,因为它使用本地备份传输.

为了进行备份和恢复的测试,我已经完成了以下操作:

  • 安装我的应用程序启动模拟器.
  • 启用备份

    adb shell bmgr enable true

  • 调用我的代码部分是调用BackupManager类中的dataChanged方法.

  • 手动启动备份操作

    adb shell bmgr run

  • 在日志中检查我的自定义BackupAgent的onBackup方法被调用.

  • 卸载应用程序
  • 重新安装该应用程序
  • 如果调用了onRestore方法,请检查日志.

问题是onRestore方法似乎没有被调用,我不知道为什么.重新安装应用程序或使用adb手动触发还原后,我在控制台中看到以下内容.

$adb shell bmgr restore com.myapp
restoreStarting: 2 packages
restoreFinished: 0
done
Run Code Online (Sandbox Code Playgroud)

和另一个在日志中

D/AndroidRuntime( 8259):
D/AndroidRuntime( 8259): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime( 8259): CheckJNI is ON
D/AndroidRuntime( 8259): --- registering native functions ---
D/BackupManagerService(   59): MSG_RUN_RESTORE observer=android.app.backup.IRestoreObserver$Stub$Proxy@450e16a8
V/LocalTransport(   59): start restore 1 …
Run Code Online (Sandbox Code Playgroud)

backup android restore android-backup-service

21
推荐指数
1
解决办法
2592
查看次数

在android中有任何方法可以在卸载后保留SharedPreferences

我保留了一些应用程序元数据SharedPreferences.每当我卸载应用程序并重新安装它时,都会SharedPreferences被删除.

有没有办法让它保留,以便如果用户进行卸载并重新安装,他们可以恢复他们的旧数据?

android android-preferences android-backup-service

21
推荐指数
2
解决办法
1万
查看次数

Android 23+ - 从备份中排除GCM注册ID

我有一个使用Azure发送推送通知的应用程序.Azure依次使用GCM发送到Android设备.

我注意到我的AndroidManifest.xml中有一个警告说明

在SDK版本23及更高版本中,您的应用数据将自动备份,并在应用安装时恢复.您的GCM注册表无法在恢复期间使用,因此您必须确保将其从备份集中排除.使用属性android:fullBackupContent指定一个@xml资源,该资源用于配置要备份的文件.

我按照https://developer.android.com/training/backup/autosyncapi.html?hl=in#configuring中的说明进行操作

但是我对如何从备份中排除GCM regID感到难过?这是我目前的设置.

表现

<application
        android:allowBackup="true"
        android:fullBackupContent="@xml/backup_scheme"
        ........
Run Code Online (Sandbox Code Playgroud)

RES/XML/backup_scheme.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="sharedpref" path=""/>
</full-backup-content>
Run Code Online (Sandbox Code Playgroud)

我把什么作为路径?我应该在某个地方放置一个物理文件吗?

UPDATE

所以我想我明白了.在我的RegistrationIntentService.java文件中,我将用户registrationID存储在字符串"registrationID"下的共享首选项中.所以我假设我使用以下内容......

<exclude domain="sharedpref" path="registrationID"/>
Run Code Online (Sandbox Code Playgroud)

对?

android google-cloud-messaging android-backup-service android-6.0-marshmallow

16
推荐指数
3
解决办法
2874
查看次数

Android备份服务 - 备份的时间和频率?

我想使用Android备份服务备份我的应用程序数据,但我担心网络使用情况.我有大约500KB的数据需要为每个备份操作上传.不多,但如果备份每天执行10次,它可以轻松达到5MB.

我的问题是,Android何时以及多久决定执行备份?我打电话后,文件只提到"在未来的适当时候" dataChanged().它没有解释什么条件构成"适当时机".

您可以随时通过呼叫请求备份操作 dataChanged().此方法通知备份管理器您要使用备份代理备份数据.然后,备份管理器将onBackup()在适当的时间调用备份代理的方法.

android android-backup-service

15
推荐指数
1
解决办法
1446
查看次数

默认共享首选项使用的文件名是什么?

Android备份服务需要一个文件名来备份共享首选项:

public static final String PREFS = "PrefFile";    
SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);
Run Code Online (Sandbox Code Playgroud)

如果在创建首选项期间给出了文件名,那么很清楚要使用什么

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

但我使用默认的共享首选项:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Run Code Online (Sandbox Code Playgroud)

我应该将什么作为PREFS价值传递给SharedPreferencesBackupHelper

android android-preferences sharedpreferences android-backup-service

14
推荐指数
2
解决办法
6526
查看次数