Как правильно исключить выбранный файл настроек из полной резервной копии? Я получаю предупреждение "Не в пути"

У меня есть данные о предпочтениях, которые не следует создавать из резервных копий, так как они недопустимы на разных устройствах.

Это мой Manifest.xml и файл правил резервного копирования.

manifest.xml

<application
    android:name=".WeNoteApplication"
    android:backupAgent="com.yocto.wenote.auto_backup.CustomBackupAgent"
    android:fullBackupOnly="true"
    android:allowBackup="true"
    android:fullBackupContent="@xml/my_backup_rules"

my_backup_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <include domain="sharedpref" path="com.yocto.wenote_preferences.xml" />

    <exclude domain="sharedpref" path="com.yocto.wenote.backup.Backuper.xml" />
</full-backup-content>

Я хочу явно исключить предпочтения с именем "com.yocto.wenote.backup.Backuper"

Я получаю следующую ошибку от IDE

enter image description here

com.yocto.wenote.backup.Backuper.xml не находится во включенном пути

Могу ли я знать, почему это так? Как я могу, конечно, исключить выбранный файл настроек XML из архива?

Подобная проблема поднималась раньше: полное резервное копирование Android: " файл file.xml не указан в пути;. Но решения не существует.

Ответы

Ответ 1

Вы получаете эту ошибку, потому что путь, который вы исключаете, находится вне пути, который включен в резервную копию. Если вы укажете какой-либо пользовательский include, то будут скопированы ТОЛЬКО эти вещи:

<include> - указывает файл или папку для резервного копирования. По умолчанию Auto Backup включает в себя практически все файлы приложения. Если вы укажете элемент, система больше не будет включать файлы по умолчанию и будет выполнять резервное копирование только указанных файлов. Чтобы включить несколько файлов, используйте несколько элементов.

Документация здесь.

В вашем случае exclude в com.yocto.wenote.backup.Backuper.xml не находится на пути include com.yocto.wenote_preferences.xml - отсюда ошибка.

Если вы изучите код правила lint, который генерирует сообщение об ошибке, он подтвердит, что, поскольку ваш путь исключения не имеет префикса какого-либо включения, вы попадете на случай !hasPrefix.

Соответствующая часть здесь:

    for (String includePath : included) {
        if (excludePath.startsWith(includePath)) {
            if (excludePath.equals(includePath)) {
                Attr pathNode = exclude.getAttributeNode(ATTR_PATH);
                assert pathNode != null;
                Location location = context.getValueLocation(pathNode);
                // Find corresponding include path so we can link to it in the
                // chained location list
                for (Element include : includes) {
                    Attr includePathNode = include.getAttributeNode(ATTR_PATH);
                    String includeDomain = include.getAttribute(ATTR_DOMAIN);
                    if (includePathNode != null
                        && excludePath.equals(includePathNode.getValue())
                        && domain.equals(includeDomain)) {
                        Location earlier = context.getLocation(includePathNode);
                        earlier.setMessage("Unnecessary/conflicting <include>");
                        location.setSecondary(earlier);
                    }
                }
                context.report(ISSUE, exclude, location,
                               String.format("Include '%1$s' is also excluded", excludePath));
            }
            hasPrefix = true;
            break;
        }
    }
    if (!hasPrefix) {
        Attr pathNode = exclude.getAttributeNode(ATTR_PATH);
        assert pathNode != null;
        context.report(ISSUE, exclude, context.getValueLocation(pathNode),
                       String.format("'%1$s' is not in an included path", excludePath));
    }

Полный список кодов

Таким образом, в вашем случае вам вообще не нужно исключать этот файл, так как ТОЛЬКО com.yocto.wenote_preferences.xml включен в вашу резервную копию.

Вы также можете включить подробное ведение журнала для резервного копирования транспорта и разбора XML, чтобы видеть, что происходит:

adb shell setprop log.tag.GmsBackupTransport VERBOSE
adb shell setprop log.tag.BackupXmlParserLogging VERBOSE

Ответ 2

Как объяснил @kenny_k explained, вы должны указать путь в <include/>, чтобы что-то исключить из него. Это означает, что у вас есть папка <include/> и файлы (или папки) <exclude/> из нее - вот как это работает.

Чтобы решить эту проблему - попробуйте полностью удалить тег <include/> - таким образом, система перебирает все файлы, которые она хочет сделать резервную копию, и найдет этот файл, который вы хотите исключить, и исключит его. С тегом <include/> вы ограничиваете видимость системы значением поля path.

Надеюсь, это поможет.

Ответ 3

Используйте Device File Explorer, чтобы просмотреть внутреннее хранилище приложения, чтобы увидеть, какие домены и имена файлов должны быть включены/исключены. Вероятно, это каталог /data/data/com.yocto.wenote/shared_prefs/ (доступен только для отладочных сборок или с правами root). . (текущий каталог) будет включать все файлы в shared_prefs - и com.yocto.wenote.backup.Backuper.xml исключается:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <include domain="sharedpref" path="."/>
    <exclude domain="sharedpref" path="com.yocto.wenote.backup.Backuper.xml"/>
</full-backup-content>

Если этот файл не находится в домене sharedpref, будут другие домены:

domain=["file" | "database" | "sharedpref" | "external" | "root"]

Codelab Настройка автоматического резервного копирования показывает, как выполнять резервное копирование & восстановить вручную.