Для чего нужен файл 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, и использовать один файл для хранения всех значений? Может кто-нибудь дать больше информации об этом?
3 ответа
Файл 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 Asset Packaging Tool (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 и идентификатора ресурсов?
https://developer.android.com/studio/projects/android-library.html
public.xml полезен для библиотечных проектов в целом. Если вы включаете public.xml, предполагается, что остальные ваши ресурсы предназначены для частного использования.
Хотя частные ресурсы по-прежнему будут использоваться другими проектами, линтер будет предупреждать об их использовании, и они не будут включены в автодополнение AndroidStudio.
Вот суть для генерации public.xml https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303
Разве это не файл, предназначенный только для использования авторами кода ОС для определения соответствия между символическими именами и идентификаторами системных ресурсов?
Вы найдете его в своем SDK по адресу YOUR_SDK_LOCATION\platform \android-??\data\res\values.
Это возглавляется
Этот файл определяет базовые публичные ресурсы, экспортируемые платформой, которые должны всегда существовать
и имеет оговорку:
ВАЖНОЕ ЗАМЕЧАНИЕ ДЛЯ ЛЮБОГО ИЗМЕНЕНИЯ ЭТОГО ФАЙЛА ПРОЧИТАЙТЕ ЭТО ПРЕЖДЕ, ЧЕМ ВЫ МОЖЕТЕ ИЗМЕНИТЬ
Этот файл определяет бинарную совместимость для ресурсов. Таким образом, вы должны быть очень осторожны при внесении изменений здесь, или вы полностью нарушите обратную совместимость со старыми приложениями
Он имеет записи, такие как
<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />
в нем - все системные идентификаторы ресурсов, поэтому любой, кто изменяет записи, будет нарушать свой код, поскольку он не будет работать на стандартном устройстве.