В каком файле находятся все идентификаторы ресурсов

Обновлено: 21.11.2024

resource close rsrcRef Закрывает указанную ссылку на ресурс (полученную из ресурса open ). Ресурсы из этого файла ресурсов больше не будут доступны.

удалить ресурс? опции ? resourceType Эта команда удалит ресурс, указанный параметрами и типом resourceType (см. ТИПЫ РЕСУРСОВ ниже). Параметры дают вам несколько способов указать ресурс, который нужно удалить.

-id идентификатор_ресурса Если указан параметр -id, идентификатор ресурса (см. IDS RESOURCE ниже) используется для указания ресурса, подлежащего удалению. Идентификатор должен быть числом. Чтобы указать имя, используйте параметр -name.

-name имя_ресурса Если указано -name, ресурс с именем имя_ресурса будет удален. Если также указан -id, то должен быть ресурс с ОБА этим именем и этим идентификатором. Если имя не указано, идентификатор будет использоваться независимо от имени фактического ресурса.

-file resourceRef Если указана опция -file, ресурс будет удален из файла, на который указывает resourceRef. В противном случае первый ресурс с заданным именем ресурса и/или идентификатором ресурса, найденный в пути к файлу ресурса, будет удален. Чтобы проверить путь к файлу, используйте команду файлов ресурсов.

файлы ресурсов ? ссылка на ресурс ? Если resourceRef не указан, эта команда возвращает Tcl-список ссылок на ресурсы для всех открытых в данный момент файлов ресурсов. Список находится в обычном порядке поиска ресурсов Macintosh. Если указан параметр resourceRef, команда вернет путь к файлу, ветвь ресурса которого представлена ​​этим токеном.

список ресурсов resourceType ? ссылка на ресурс ? Перечислите все идентификаторы ресурсов типа resourceType (см. ТИПЫ РЕСУРСОВ ниже). Если указан параметр resourceRef, команда ограничит поиск этим конкретным файлом ресурсов. В противном случае будут выполняться поиски во всех файлах ресурсов, открытых в данный момент приложением. Будет возвращен Tcl-список либо имен ресурсов, либо идентификаторов найденных ресурсов. Дополнительные сведения о том, что такое идентификатор ресурса, см. в разделе RESOURCE IDS ниже.

ресурс открыть имя_файла ? доступ ? Откройте ресурс для файла fileName . Также могут быть указаны стандартные права доступа к файлам (подробности см. в разделе «Открыть»). Возвращается ссылка на ресурс ( resourceRef ), которую можно использовать другими командами ресурсов. Ошибка может возникнуть, если файл не существует или файл не имеет ответвления ресурса. Однако, если вы откроете файл с разрешениями на запись, будет создан файл и/или ответвление ресурса, а не ошибка.

чтение ресурса resourceType resourceId ? ссылка на ресурс ? Считайте весь ресурс типа resourceType (см. ТИПЫ РЕСУРСОВ ниже) и имя или идентификатор resourceId (см. ИД РЕСУРСОВ ниже) в память и верните результат. Если указан resourceRef, мы ограничиваем наш поиск этим файлом ресурсов, в противном случае мы ищем все открытые ветки ресурсов в приложении. Важно отметить, что большинство ресурсов Macintosh используют двоичный формат, и данные, возвращаемые этой командой, могут содержать встроенные значения NULL или другие данные, отличные от ASCII.

типы ресурсов ? ссылка на ресурс ? Эта команда возвращает Tcl-список всех типов ресурсов (см. ТИПЫ РЕСУРСОВ ниже), найденных в файле ресурсов, на который указывает resourceRef. Если resourceRef не указан, будут возвращены все типы ресурсов, найденные в каждом файле ресурсов, открытом в данный момент приложением.

ресурс пишет? опции ? datatype resourceType Эта команда запишет переданные данные как новый ресурс типа resourceType (см. ТИПЫ РЕСУРСОВ ниже). Доступно несколько параметров, описывающих, где и как хранится ресурс.

-id resourceId Если указана опция -id, для нового ресурса используется идентификатор resourceId (см. RESOURCE IDS ниже), в противном случае будет сгенерирован уникальный идентификатор, который не будет конфликтовать с каким-либо существующим ресурсом. Однако идентификатор должен быть числом. Чтобы указать имя, используйте параметр -name.

-name имя_ресурса Если указано -name, ресурс будет называться имя_ресурса , в противном случае в качестве имени будет использоваться пустая строка.

-file resourceRef Если указана опция -file, то ресурс будет записан в файл, на который указывает resourceRef, в противном случае будет использован самый последний открытый ресурс.

-force Если целевой ресурс уже существует, то по умолчанию Tcl не перезапишет его, а вместо этого вызовет ошибку. Используйте флаг -force, чтобы принудительно перезаписать существующий ресурс.

Для этой команды понятие идентификатора ресурса фактически относится к двум идеям в ресурсах Macintosh. В каждом месте, где вы можете использовать идентификатор ресурса, вы можете использовать либо имя ресурса, либо номер ресурса. Имена всегда ищутся или возвращаются вместо чисел. Например, команда списка ресурсов вернет имена, если они существуют, или числа, если имя равно NULL.

ResourceId является иерархическим и состоит из последовательности элементов имени каталога и файла, разделенных специальным разделителем или разделителем.

    , который принимает список имен ресурсов String или шаблонов, запрашивает файловую систему для ресурсов, соответствующих этим спецификациям, и возвращает MatchResult для каждого шаблона. Обычно это используется при чтении из файлов. , который принимает полное имя и тип ресурса String (файл или каталог) и создает для этого ресурса идентификатор ResourceId, специфичный для файловой системы. Этот вызов не проверяет наличие или отсутствие этого ресурса в файловой системе. Этот вызов обычно используется при создании новых каталогов или файлов для создания ResourceId для ресурсов, которые могут еще не существовать.

Краткое описание метода

Все методы Экземпляры Методы Абстрактные методы
Модификатор и тип Метод и описание
ResourceId getCurrentDirectory()

Сведения о методе

решить

Чтобы написать код, не зависящий от файловой системы, вызывающие объекты не должны включать разделители в другие и должны использовать ResolveOptions.StandardResolveOptions, чтобы указать, разрешать ли файл или каталог.

Этот ResourceId должен представлять каталог.

Каждая файловая система решает по-своему.

  • resourceId.resolve("..", StandardResolveOptions.RESOLVE_DIRECTORY) возвращает родительский каталог этого ResourceId .
  • resourceId.resolve("", StandardResolveOptions.RESOLVE_FILE) возвращает ResourceId, который соответствует всем файлам в этом ResourceId .
  • resourceId.resolve("", StandardResolveOptions.RESOLVE_DIRECTORY) возвращает ResourceId, который соответствует всем каталогам в этом ResourceId .

получить текущий каталог

Если это уже каталог, тривиально возвращает это.

получить схему

Схема должна соответствовать синтаксису схемы URI. См. RFC 2396

получитьимя_файла

Возвращает имя файла или каталога, обозначенного этим ResourceId . Имя файла — это самый дальний элемент от корня в иерархии каталогов.

После того как вы предоставите ресурс в своем приложении (как описано в разделе Предоставление ресурсов), вы можете применить его, указав его идентификатор ресурса. Все идентификаторы ресурсов определены в классе R вашего проекта, который автоматически генерирует инструмент aapt.

Когда ваше приложение скомпилировано, aapt создает класс R, который содержит идентификаторы ресурсов для всех ресурсов в вашем каталоге res/. Для каждого типа ресурса существует подкласс R (например, R.drawable для всех ресурсов, доступных для рисования), и для каждого ресурса этого типа существует статическое целое число (например, R.drawable.icon ). Это целое число является идентификатором ресурса, который вы можете использовать для получения своего ресурса.

Несмотря на то, что идентификаторы ресурсов указываются в классе R, вам никогда не придется заглядывать туда, чтобы обнаружить идентификатор ресурса. Идентификатор ресурса всегда состоит из:

  • Тип ресурса. Каждый ресурс сгруппирован по «типу», например string , drawable и layout . Дополнительные сведения о различных типах см. в разделе Типы ресурсов.
  • имя ресурса, которое может быть: именем файла без расширения; или значение атрибута XML android:name, если ресурс представляет собой простое значение (например, строку).

Есть два способа доступа к ресурсу:

    В коде: использование статического целого числа из подкласса вашего класса R, например:

string — это тип ресурса, а hello — это имя ресурса. Существует множество Android API, которые могут получить доступ к вашим ресурсам, если вы предоставите идентификатор ресурса в этом формате. См. Доступ к ресурсам в коде.

string — это тип ресурса, а hello — это имя ресурса. Вы можете использовать этот синтаксис в ресурсе XML в любом месте, где ожидается значение, которое вы предоставляете в ресурсе. См. Доступ к ресурсам из XML.

Доступ к ресурсам в коде

Вы можете использовать ресурс в коде, передав идентификатор ресурса в качестве параметра метода. Например, вы можете настроить ImageView на использование ресурса res/drawable/myimage.jpg с помощью setImageResource() :

Вы также можете получить отдельные ресурсы, используя методы Resources , экземпляр которых можно получить с помощью getResources() .

Доступ к исходным файлам

В редких случаях вам может потребоваться доступ к исходным файлам и каталогам. Если вы это сделаете, сохранение ваших файлов в res/ не сработает для вас, потому что единственный способ прочитать ресурс из res/ — это идентификатор ресурса. Вместо этого вы можете сохранить свои ресурсы в каталоге assets/.

Файлам, сохраненным в каталоге assets/, не присваивается идентификатор ресурса, поэтому вы не можете ссылаться на них через класс R или из ресурсов XML. Вместо этого вы можете запрашивать файлы в каталоге assets/, как в обычной файловой системе, и считывать необработанные данные с помощью AssetManager .

Однако, если все, что вам нужно, — это возможность считывать необработанные данные (например, видео- или аудиофайл), сохраните файл в каталоге res/raw/ и прочитайте поток байтов с помощью openRawResource() .

Синтаксис

Вот синтаксис ссылки на ресурс в коде:

Дополнительную информацию о каждом типе ресурсов и о том, как ссылаться на них, см. в разделе Типы ресурсов.

Случаи использования

Существует много методов, которые принимают параметр идентификатора ресурса, и вы можете получать ресурсы, используя методы в Resources . Вы можете получить экземпляр Resources с помощью Context.getResources() .

Вот несколько примеров доступа к ресурсам в коде:

Внимание! Никогда не изменяйте файл R.java вручную — он создается инструментом aapt при компиляции проекта. Любые изменения переопределяются при следующей компиляции.

Доступ к ресурсам из XML

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

Например, если вы добавляете кнопку в свой макет, вы должны использовать строковый ресурс для текста кнопки:

Синтаксис

Вот синтаксис для ссылки на ресурс в XML-ресурсе:

Дополнительную информацию о каждом типе ресурсов и о том, как ссылаться на них, см. в разделе Типы ресурсов.

Случаи использования

В некоторых случаях вы должны использовать ресурс для значения в XML (например, чтобы применить рисуемое изображение к виджету), но вы также можете использовать ресурс в XML в любом месте, которое принимает простое значение. Например, если у вас есть следующий файл ресурсов, который включает ресурс цвета и ресурс строки:

Вы можете использовать эти ресурсы в следующем файле макета, чтобы задать цвет текста и текстовую строку:

В этом случае вам не нужно указывать имя пакета в ссылке на ресурс, поскольку ресурсы взяты из вашего собственного пакета. Чтобы сослаться на системный ресурс, вам нужно будет указать имя пакета. Например:

Примечание. Вы всегда должны использовать строковые ресурсы, чтобы ваше приложение можно было локализовать для других языков. Сведения о создании альтернативных ресурсов (например, локализованных строк) см. в разделе Предоставление альтернативных ресурсов.

Вы даже можете использовать ресурсы в XML для создания псевдонимов. Например, вы можете создать ресурс для рисования, который является псевдонимом для другого ресурса для рисования:

Это звучит излишне, но может быть очень полезно при использовании альтернативного ресурса. Подробнее о создании ресурсов псевдонима.

Ссылка на атрибуты стиля

Ресурс атрибута стиля позволяет ссылаться на значение атрибута в текущей теме. Ссылка на атрибут стиля позволяет настраивать внешний вид элементов пользовательского интерфейса, стилизуя их в соответствии со стандартными вариантами, предоставляемыми текущей темой, вместо того, чтобы указывать жестко закодированное значение. Ссылка на атрибут стиля, по сути, говорит: «Используйте стиль, определенный этим атрибутом, в текущей теме».

Чтобы сослаться на атрибут стиля, синтаксис имени почти идентичен обычному формату ресурса, но вместо символа at ( @ ) используется вопросительный знак ( ? ), а часть типа ресурса является необязательной. Например:

Например, вот как можно сослаться на атрибут, чтобы установить цвет текста в соответствии с "основным" цветом текста системной темы:

Здесь атрибут android:textColor указывает имя атрибута стиля в текущей теме. Android теперь использует значение атрибута стиля android:textColorSecondary в качестве значения для android:textColor в этом виджете. Поскольку инструмент системных ресурсов знает, что в этом контексте ожидается ресурс атрибута, вам не нужно явно указывать тип (который будет ?android:attr/textColorSecondary ) — вы можете исключить тип attr.

Доступ к ресурсам платформы

Android содержит ряд стандартных ресурсов, таких как стили, темы и макеты. Чтобы получить доступ к этому ресурсу, укажите ссылку на ресурс с именем пакета Android. Например, Android предоставляет ресурс макета, который можно использовать для элементов списка в ListAdapter:

В этом примере simple_list_item_1 — это ресурс макета, определенный платформой для элементов в ListView . Вы можете использовать это вместо создания собственного макета для элементов списка. Дополнительные сведения см. в руководстве разработчика по представлению списка.

В этом документе описывается, как ресурсы Android создаются в системе сборки Chromium. В нем не упоминаются нативные ресурсы, которые обрабатываются по-другому.

Шаги используют следующие файлы в качестве входных данных:

  • AndroidManifest.xml
    • Включая файлы AndroidManifest.xml из библиотек, которые объединяются вместе

    Эти шаги создают следующие промежуточные файлы:

    • R.srcjar (содержит файлы R.java)
    • R.txt
    • .resources.zip

    Эти шаги создают следующие файлы в формате .АПК:

    • AndroidManifest.xml (двоичный XML-файл)
    • resources.arsc (содержит все значения и метаданные конфигурации)
    • res/** (чертежи и макеты)
    • classes.dex (лишь небольшая часть классов из сгенерированных файлов R.java)

    Этапы сборки

    Всякий раз, когда вы пытаетесь скомпилировать целевой файл apk или библиотеки, ресурсы проходят следующие этапы:

    1. Создает файлы .build_config:

    • Целевые метаданные GN
    • Другие файлы .build_config.json

    write_build_config.py запускается для записи целевых метаданных, необходимых для будущих шагов. Дополнительные сведения см. в файле build_config.md.

    2. Готовит ресурсы:

    • Целевой файл .build_config.json
    • Файлы указаны как источники
    • Целевые ресурсы.zip (содержит все ресурсы, перечисленные в источниках).
    • Целевой файл R.txt (список всех ресурсов, включая зависимости).

    prepare_resources.py архивирует файлы ресурсов для конкретной цели и генерирует R.txt . Ресурсы не подвергаются оптимизации, перегрузке и т. д.

    Следующие шаги применимы только к целевым файлам apk и пакетов (но не к целевым библиотекам).

    3. Создание целевых файлов R.java

    R.java для каждой цели создается для каждой цели android_library(), которая устанавливает resources_package . Идентификаторы ресурсов на этом этапе неизвестны, поэтому все значения устанавливаются в качестве заполнителей. Эта копия классов R отбрасывается и заменяется новыми копиями на шаге 4.

    Пример файла-заполнителя R.java:

    4. Завершает ресурсы apk:

    • Целевой файл .build_config.json
    • Файлы зависимостей R.txt
    • Файлы resources.zip зависимостей
    • ZIP-файл с упакованными ресурсами (с именем foo.ap_ ), содержащий:
      • AndroidManifest.xml (в виде двоичного файла XML)
      • resources.arsc
      • разрешение/**
      • Содержит список ресурсов и их идентификаторов (включая зависимости).
      • Узнайте, что такое файлы R.java и как они создаются.

      4(а). Компилирует ресурсы:

      Для каждой библиотеки/ресурсов, от которых зависит ваш apk, происходит следующее:

      • Используйте регулярное выражение (определенное в целевом файле apk) для удаления выбранных ресурсов (необязательно).
      • Преобразование изображений png в формат webp для двоичного размера (необязательно).
      • Переместить чертежи в mdpi в каталог, отличный от mdpi (почему?)
      • Используйте компиляцию aapt2 для компиляции ресурсов xml в двоичный xml (ссылки на другие ресурсы теперь будут использовать идентификатор, а не имя для более быстрого поиска во время выполнения).
      • Компиляция aapt2 добавляет заголовки/метаданные к изображениям с 9 исправлениями о том, какие части изображения являются растягиваемыми, а какие статичными.
      • Компиляция aapt2 выводит ZIP-файл со скомпилированными ресурсами (по одному для каждой зависимости).

      4(б). Ссылки на ресурсы:

      После компиляции каждой зависимости в промежуточный ZIP-файл все эти ZIP-файлы связываются с помощью команды aapt2 link, которая выполняет следующие действия:

      • Используйте порядок предоставления зависимостей, чтобы некоторые ресурсы закрывали друг друга.
      • Скомпилируйте файл AndroidManifest.xml в двоичный файл xml (ссылки на ресурсы теперь используют идентификаторы, а не имена строк)
      • Создайте файл resources.arsc, содержащий имя и значения строковых ресурсов, а также имя и путь к нестроковым ресурсам (например, макетам и чертежам).
      • Объедините скомпилированные ресурсы в один пакет apk ресурсов (zip-файл с расширением .ap_), содержащий все файлы, связанные с ресурсами.

      4(с). Оптимизирует ресурсы:

      Цели могут выбрать следующие оптимизации:

      1. Свертывание имени ресурса: все ресурсы сопоставляются с одним и тем же именем. Доступ к ресурсам через Resources.getIdentifier() больше не работает, если ресурсы не включены в белый список.
      2. Обфускация имен файлов ресурсов: пути к файлам ресурсов переименовываются, например, с res/drawable/something.jpg на res/a . Сопоставление переименования хранится вместе с APK/пакетами в файле .pathmap. Переименования основаны на хэшах, поэтому они стабильны между сборками (если только не произойдет новый конфликт хэшей).
      3. Удаление неиспользуемых ресурсов. Ссылочные ресурсы извлекаются из оптимизированных файлов .dex и AndroidManifest.xml . Ресурсы, прямо или косвенно используемые этими файлами, удаляются.

      Наборы приложений и модули:

      Обработка ресурсов для пакетов и модулей немного отличается. Каждый модуль имеет свои ресурсы, скомпилированные и связанные отдельно (т.е. он проходит весь процесс для каждого модуля). Затем модули объединяются в пакет. Более того, на этапе «Завершение работы над ресурсами apk» модули пакетов создают файл resources.proto вместо файла resources.arsc.

      Ресурсы в модуле динамических функций могут ссылаться на ресурсы в базовом модуле. На этапе связывания ресурсов функционального модуля передаются связанные ресурсы базового модуля.Однако в настоящее время связывание с ресурсами работает только с форматом resources.arsc. Таким образом, при сборке базового модуля ресурсы компилируются как resources.arsc, так и resources.proto .

      Отладка ошибок, связанных с ресурсами, когда имена ресурсов запутаны

      Пример сообщения из трассировки стека может быть примерно таким:

      0_resource_name_obfuscated — это имя ресурса для всех ресурсов, имена которых были замаскированы/удалены на этапе оптимизации ресурсов. Для облегчения отладки файл R.txt заархивирован. Файл R.txt содержит сопоставление идентификаторов ресурсов с именами ресурсов и может использоваться для получения исходного имени ресурса из идентификатора. В приведенном выше сообщении идентификатор равен 0x7f0a02ad .

      Для локальных сборок файлы R.txt выводятся в каталоге out/*/apks.

      Для официальных сборок сотрудники Google могут получить заархивированные файлы R.txt рядом с заархивированными APK-файлами.

      Добавление ресурсов в белый список

      Если доступ к ресурсу осуществляется через getIdentifier(), он должен быть разрешен в файле конфигурации ресурсов aapt2. Файл конфигурации выглядит следующим образом:

      Файл конфигурации aapt2 передается цели ниндзя через переменную resources_config_paths. Чтобы добавить ресурс в белый список, проверьте, где находится конфигурация для вашей цели, и добавьте новую строку для вашего ресурса. Если такового нет, создайте новый файл конфигурации и передайте его путь в свою цель.

      Идентификаторы ресурсов веб-просмотра

      Первые два байта идентификатора ресурса — это идентификатор пакета. Для обычных APK это 0x7f. Однако Webview — это общая библиотека, которая загружается в другие apk. Идентификатор пакета для ресурсов веб-просмотра назначается динамически во время выполнения. Когда веб-просмотр загружается, он вызывает функцию onResourcesLoaded() этого файла R, чтобы иметь правильный идентификатор пакета. При деобфускации идентификаторов ресурсов веб-просмотра игнорируйте первые два байта идентификатора при поиске в файле R.txt.

      Monochrome при загрузке в качестве веб-просмотра перезаписывает идентификаторы пакетов ресурсов, используемых частью веб-просмотра, на правильное значение во время выполнения, в противном случае его ресурсы имеют идентификатор пакета 0x7f при запуске как обычный APK.

      Как создаются файлы R.java

      R.java содержит набор вложенных статических классов, каждый со статическими полями, содержащими идентификаторы. Эти идентификаторы используются в коде Java для ссылки на ресурсы в APK.

      В Chrome есть три типа файлов R.java.

      1. Корневой/базовый модуль R.java Files
      2. Файлы DFM R.java
      3. Файлы R.java для каждой библиотеки

      Корневой/базовый модуль R.java Files

      Содержит базовые ресурсы Android. Все файлы R.java могут получать доступ к ресурсам базового модуля посредством наследования.

      Пример файла корневого/базового модуля R.java:

      Файлы DFM R.java

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

      Пример корневого файла DFM R.java

      Файлы R.java для каждой библиотеки

      Создается для каждой цели android_library(), которая устанавливает resources_package . Сначала на этапе android_library() создается копия-заполнитель, а затем во время финализации создается окончательная копия.

      Читайте также: