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

23

我有一个应用程序,使用Azure发送推送通知。Azure又使用GCM向Android设备发送推送通知。

我注意到在我的AndroidManifest.xml中有一个警告:

在SDK版本23及以上,您的应用数据将自动备份,并在应用安装时还原。您的GCM regid不会跨恢复工作,因此必须确保排除它从备份集。使用属性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"
        ........

备份方案的路径为 res/xml/backup_scheme.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="sharedpref" path=""/>
</full-backup-content>

路径应该填什么?我是否需要在某个地方放置一个物理文件来进行排除?

更新

所以我想我弄清楚了。在我的RegistrationIntentService.java文件中,我将用户的registrationID存储在共享偏好中的字符串“registrationID”下面。所以我假设我使用以下内容...

<exclude domain="sharedpref" path="registrationID"/>

对吗?


根据您提供的信息,在包括或排除数据文档中,应该将registrationID从备份中排除。您可以尝试一下,如果有效,请发布答案以造福社区。 - Mr.Rebot
4个回答

19

在进一步研究了@Simon的答案后,我认为当从Android Studio中的quickfix自动生成备份描述符xml文件时,我们仍需要替换Path中指定的文件名。 我检查了我一个已实现Firebase云消息传递的应用程序中的shared_prefs目录,并找到了以下GCM设置首选项文件:

输入图像描述

因此,backup_descriptor.xml将是:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- Exclude the shared preferences file that contains the GCM registrationId -->
    <exclude
        domain="sharedpref"
        path="com.google.android.gms.appid.xml"/>
    <exclude
        domain="sharedpref"
        path="com.google.android.gms.measurement.prefs.xml"/>
</full-backup-content>

这是正确的答案。根据Android文档,应从备份中排除以下文件的示例:具有设备特定标识符的文件,无论是由服务器发出还是在设备上生成。例如,Google云消息传递(GCM)需要每次用户在新设备上安装您的应用程序时生成注册令牌。如果恢复旧的注册令牌,则应用程序可能会出现意外行为。 - jwitt98
老实说,我希望这个内容能够出现在“入门指南”文档中。我一直在围绕 FCM 的 SQLite 数据库寻找 bug,然后发现了这个。 - Jeremy Jao
想知道他们是如何找出这些值的吗?在Android Studio中打开设备文件浏览器,找到您的应用程序位于“data”文件夹下。查看“shared_prefs”文件夹下,您将找到它们。 - jj.

7

我遇到了同样的问题,本来要按照接受答案的步骤进行操作,但是事实证明这似乎不是正确的做法。

我在创建backup_scheme.xml文件之前,在我的清单文件中设置了fullBackupContentProperty。当然,Android Studio会发出警告,但提供了快速修复功能,自动生成了该文件。

应用快速修复功能后,生成了以下文件:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- Remove the following "exclude" elements to make them a part of the auto backup -->
    <exclude
        domain="database"
        path="attendee.db" />
    <exclude
        domain="database"
        path="whova_messages.db" />
    <exclude
        domain="database"
        path="photo.db" />
    <exclude
        domain="database"
        path="agenda.db" />
    <exclude
        domain="database"
        path="ebb.db" />
    <exclude
        domain="database"
        path="vertical.db" />
    <exclude
        domain="database"
        path="whova.db" />
    <!-- Exclude the shared preferences file that contains the GCM registrationId -->
    <exclude
        domain="sharedpref"
        path="WhovaMessagePrefFile.xml" />
    <exclude
        domain="sharedpref"
        path="APP_RATER.xml" />
    <exclude
        domain="sharedpref"
        path="WhovaPrefFile.xml" />
</full-backup-content>

请注意<!-- 排除包含GCM注册ID的共享首选项文件 -->
所以我的猜测是你需要排除包含GCM ID的整个共享首选项文件,而不仅仅是密钥。
很遗憾文档没有明确说明,我们还需要从备份中排除整个文件。

我认为这应该是正确的答案,而不是被接受的那个。 - CodePlay

5

我已经想出来了。在我的RegistrationIntentService.java文件中,我将用户的registrationID存储在共享首选项中的字符串“registrationID”下。因此,请在backup_scheme.xml文件中使用以下内容...

<exclude domain="sharedpref" path="registrationID"/>

4
路径元素应该是整个 .xml 文件,例如: - frapeti
请问一下,这个“registrationID”是什么意思?我收到了这个警告,但我的应用程序中没有任何注册。我只是使用了一些Google/Firebase服务(广告、分析、IAP等)...如果我忽略这个警告会发生什么? - android developer
@androiddeveloper - registrationID是我存储应用程序Firebase Cloud Messaging注册ID的内部变量。它存储在设备上SharedPrefs区域下的“registrationID”键下。您可以安全地忽略它,我相信它只是意味着如果应用程序从备份中恢复,则您的设备将重新注册。 - Phil
我不明白。你的意思是说这是你的应用程序中的某些特定功能,而不是通用的并存在于其他应用程序中? - android developer
这不是正确的答案。@CodePlay在下面给出了正确的答案。 - jwitt98

0
回答你的问题,你应该将文件指定为路径。 所以对于GCM regid来说,它是在sharedpref域中的一个XML文件,名为com.google.android.gms.appid.xml
<exclude
    domain="sharedpref"
    path="com.google.android.gms.appid.xml"/>

但是由于我找不到任何文档记录,因此这可能会在未来发生变化而没有任何通知。

因此,更好的方法是仅指定您实际想要备份的内容。

我曾经遇到过同样的问题,并写了一篇小文章。 https://medium.com/@dahlberg.bob/what-i-learned-from-lint-today-57c46b5f3225


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接