Подтвердить что ты не робот

Каково использование файла res/values ​​/public.xml на Android?

Я искал в Google, но не нашел подходящих результатов.

Я также проверил официальные документы для Android и на этой странице (для всех доступные ресурсы) было всем, что я мог найти. релевантные ссылки (в каталог res/values/), которые я нашел на этой странице:

Эти страницы ничего не сообщают о файле res/values/public.xml.
Вот пример, который я нашел для этого типа файла.

Малый фрагмент

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="commentTextColor" id="0xAA010007" />
    <public type="drawable" name="add_icon_bl" id="0xAA020000" />
    <public type="layout" name="act_date_picker" id="0xAA030001" />
    <public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
    <public type="xml" name="pref_menu" id="0xAA050000" />
    <public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
    <public type="array" name="taskRepeat" id="0xAA070000" />
    <public type="color" name="theme_main_color_bl" id="0xAA080000" />
    <public type="string" name="no_internet" id="0xAA0a0001" />
    <public type="id" name="page1" id="0xAA0d0015" />
</resources>

Как вы можете видеть из атрибута type, он содержит в значительной степени все стандартные типы ресурсов, которые обычно помещаются в отдельные каталоги в каталоге res...


Зачем нужно злоупотреблять каталогами, которые предоставляет Android, и использовать один файл для хранения всех значений? Может кто-нибудь дать больше информации об этом?

4b9b3361

Ответ 1

Файл res/values ​​/public.xml используется для назначения фиксированных идентификаторов ресурсов для ресурсов Android.

Рассмотрим этот набор строковых ресурсов в res/values ​​/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>

Средство упаковки активов Android (aapt) может назначить следующие идентификаторы ресурсов для этих ресурсов при компиляции приложения:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string3=0x7f040001;
    }
}

Теперь измените набор строковых ресурсов на

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string2">String 2</string>
    <string name="string3">String 3</string>
</resources>

и вы заметите, что идентификатор ресурса для @string/string3 изменился:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040001;
        public static final int string3=0x7f040002; // New ID! Was 0x7f040001
    }
}

Чтобы предотвратить это, вы можете использовать res/values ​​/public.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>

который приведет к присвоению идентификаторов ресурсов следующим образом:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040002;
        public static final int string3=0x7f040001; // Resource ID from public.xml
    }
}

Приложения редко используют для res/values ​​/public.xml, поскольку идентификаторы ресурсов, назначенные ресурсам, не имеют значения. Когда они меняются, все приложение перестраивается в любом случае, поэтому любые ссылки в Java-коде на ресурсы по идентификатору ресурса будут обновлены.

Самым значительным пользователем res/values ​​/public.xml является сама платформа Android. Приложения, созданные против старых версий Android, предполагают, что определенный ресурс имеет определенный идентификатор ресурса. Например, ресурс Android @android:style/Theme должен всегда иметь идентификатор ресурса 0x01030005, чтобы платформа была обратно совместима с приложениями, созданными против старых версий платформу.

Если вам интересно узнать больше о том, как назначаются идентификаторы ресурсов, обратитесь к этому ответу: Как выполняется сопоставление между ресурсами и ресурсами android ресурсов?

Ответ 2

Разве это не файл, предназначенный только для авторов использования кода ОС для определения сопоставления между символическими именами и идентификаторами системных ресурсов?

Вы найдете его в своем SDK по адресу YOUR_SDK_LOCATION\platform\android -??\data\res \.

Он возглавлял

Этот файл определяет базовые публичные ресурсы, экспортируемые платформой, которые всегда должны существовать

и имеет оговорку:

ВАЖНОЕ ЗАМЕЧАНИЕ ДЛЯ ЛЮБОГО ИЗМЕНЕНИЯ ЭТОГО ФАЙЛА ПРОЧИТАЙТЕ ЭТО ПЕРЕД ВАМИ СДЕЛАТЬ ЛЮБЫЕ ИЗМЕНЕНИЯ

Этот файл определяет двоичную совместимость ресурсов. Как таковой, вы должны быть очень осторожны при внесении изменений здесь, или вы будете полностью нарушить совместимость со старыми приложениями

Он имеет такие записи, как

<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />

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

Ответ 3

https://developer.android.com/studio/projects/android-library.html#PrivateResources

public.xml полезен для проектов библиотек в целом. Если вы включили public.xml, он предположил, что остальные ваши ресурсы должны быть частными.

Хотя частные ресурсы будут по-прежнему использоваться другими проектами, linter будет предупреждать об их использовании, и они не будут включены в автозаполнение AndroidStudio.

Вот суть для автогенерации public.xml https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303