что такое файл манифест
Зачем Win32-приложению манифест?
Недавно на руборде в разделе Программирование был задан вопрос: «Зачем Win32-приложению манифест? На что он влияет?». Первое, что сразу приходит в голову большинству программистов — это темы оформления. Но на самом деле в современных виндах манифест нужен не только для этого. Я подумал и написал пять ключевых аспектов, на которые влияет манифест или его отсутствие. После этого сразу несколько человек попросили оформить этот пост в виде более развернутой статьи.
Для начала предлагаю вспомнить, как вообще в Windows появились манифесты, и как они развивались.
История манифеста
В древние времена в мире Win95/98 царил ад, точнее DLL hell. Возник он из-за того, что Windows задумывалась как идеальная система. Все приложения в ней всегда должны были писаться с использованием самых свежих версий системных библиотек. А различные версии самих библиотек должны были быть взаимозаменяемыми. Реальность быстро доказала всем, что для популярной операционки это несбыточная мечта, так и возник ад. Каждое второе приложение во время инсталляции перезаписывало системные библиотеки нужными ему версиями. В результате после установки приложения X установленное ранее приложение Y начинало глючить. А после переустановки приложения Y глючить начинало приложение X. В общем юзерам жилось весело.
Всем был хорош SxS кроме одного — он был ужасно неудобен для программиста. В 99% случаев манифест применялся только для включения тех самых тем оформления, и ни для чего больше. Разработчикам винды стало ясно, что нужен новый, более простой в использовании способ указать поддерживаемые версии системных библиотек. Тогда они придумали простое правило: в пределах одной версии системы интерфейс и поведение этих библиотек не изменяется. Нужно было только каким то образом научится определять какая их версия требуется конкретному приложению. Так в Windows 7 в манифесте появилась секция Compatibility, где можно указать с какими версиями ОС тестировалось приложение.
Также в манифесте начиная с Windows Vista появилось еще несколько секций, обо всех о них ниже.
Функции манифеста
Справа тоже самое приложение без манифеста:
Запрос разрешения пользователя:
Виртуализация файловой системы в деле:
Разработчики Висты не стерпели подобного безобразия, и заложили в DWM возможность производить масштабирование самостоятельно, а приложениям врать, что DPI по прежнему равен 96. Причем зависящие от него системные настройки, разрешение монитора и даже положение мыши, также пересчитываются. К сожалению разработчики Висты небыли волшебниками, поэтому масштабирование DWM производит с помощью простых алгоритмов растягивания изображений. И если интерфейс приложения нужно увеличить, то происходит замыливание картинки. Представьте что было бы, если бы разработчики Фотошопа не могли это отключить. Таких бунтов на корабле никто не хотел, поэтому появилась возможность указать в манифесте, что ваше приложение таки умеет нормально масштабировать свой интерфейс, и помощь DWM ему не нужна. За это отвечает параметр dpiAware. Тут правда следует отметить, что по умолчанию масштабирование силами DWM включается при увеличении 150% и выше. Видимо в Microsoft посчитали, что при масштабировании 125% артефакты как на скриншоте выше вполне терпимы.
Слева масштабирование силами DWM, а справа — самого приложения:
В Windows 8.1 появилась возможность указывать разный масштаб разным мониторам, если подключено сразу несколько. Соответственно у ключа dpiAware появилось новое значение «True/PM». Оно означает, что приложение умеет динамически изменять масштаб своего интерфейса при переносе окон с одного монитора на другой.
Наиболее интересен вопрос: «На что влияют эти GUID-ы?» Пока что список различий в поведении системных библиотек невелик. Наиболее интересно упоминание об оптимизации RPC. Получается что приложения, задекларировавшие совместимость с семеркой, будут работать быстрее.
В будущем этот раздел манифеста наверняка будет играть большую роль чем сейчас. Ведь в винде полно разных хаков призванных обеспечивать совместимость. И теперь есть возможность оградить от них нормальные приложения.
Если GUID-ы полностью отсутствуют в манифесте, то к приложению применяются правила как к совместимому с Вистой:
Манифест приложения
Основное содержимое манифеста:
Основные правила манифеста:
Структура файла
Ниже представлена структура манифеста со всеми возможными элементами. А далее рассмотрим каждый элемент отдельно. Для быстрого перехода к интересующему элементу кликайте по содержанию справа.
Пространство имен Android, оно всегда одно и то же.
Корневой элемент манифеста. Является обязательным.
Разрешения, которые должны быть запрошены при установке приложения для его нормального функционирования.
Атрибуты:
Разрешения, которые должны запросить другие приложения для получения доступа к вашему приложению. Можно использовать существующие, либо создать собственные.
Атрибуты:
Элемент позволяет приложению объявлять пространство имён разрешений, в которое оно может динамически во время выполнения добавлять новые разрешения.
Атрибуты:
Объявляет имя категории, в которую можно сгруппировать все логически связанные разрешения. Добавить разрешение в группу можно с помощью атрибута permissionGroup элемента
. Разрешения из одной группы в пользовательском интерфейсе отображаются вместе.
Атрибуты:
Объявляет класс Instrumentation, который дает возможность отслеживать все взаимодействия, которые система выполняет с приложением. Обычно используется при отладке и тестировании приложения и удаляется из release-версии приложения.
Атрибуты:
Совместимость приложения с указанной версией Android. Когда приложение будет устанавливаться, система сравнит указанный уровень API с API устройства. Также Google Play использует этот элемент, чтобы отфильтровывать устройства, которые не соответствуют указанному уровню API.
Атрибуты:
Требуемая для приложения аппаратная и программная конфигурация устройства. Например, можно указать, что для работы приложения требуется физическая клавиатура. Таким образом можно избежать ситуаций, когда приложение будет установлено на устройство, где оно не сможет работать. Как правильно без этого элемента можно обойтись и его даже не рекомендуют использовать, потому что приложение должно стремится к универсальности и совместимости на большинстве устройствах, а некоторые ограничения можно указать с помощью других атрибутов (менее жестких в плане ограничения устройств).
Атрибуты:
Объявляет одну или несколько аппаратных или программных функций, требуемых для работы приложения.
Атрибуты:
Позволяет указать размеры экрана, которые поддерживаются приложением. Если размер экрана будет больше, чем поддерживается приложением, то включится режим совместимости, что не очень хорошо, так как этот режим может вызвать размытие интерфейса из-за неправильного масштабирования. Поэтому рекомендуется создавать свои макеты под каждый размер экрана. Кроме того, с помощью отдельного макета можно оптимизировать интерфейс, например, чтобы на экране отображалось два окна (двупанельный интерфейс). Как поддерживать разные размеры экранов описано документации здесь.
Атрибуты:
Данные атрибуты были добавлены в API 13 (Android 3.2):
Позволяет задать все возможные размеры экранов, с которыми совместимо приложение. Данный элемент может быть указан в манифесте только один раз, зато внутри него можно добавлять тег с указанием поддерживаемого размера экрана.
Этот элемент носит исключительно информационный характер. С помощью него Google Play фильтрует устройства с неподдерживаемыми экранами.
Конфигурация экрана, которая не указана в этом элементе, считается неподдерживаемой приложением.
Определяет формат сжатия текстур GL. Элемент является информационным, т.е. необходим Google Play для фильтрации устройств, которые не поддерживают заданные параметры.
Дочерние элементы:
Атрибуты:
Дочерние элементы:
Атрибуты:
Когда мы разрабатываем приложение, то периодически можем менять названия классов, изменять activity, которая будет запускаться первой итд. И вроде ничего в этом страшного нет, но пользователя может смутить, например, исчезновения иконки приложения с главного экрана (потому что мы ранее изменили имя стартовой activity). Чтобы этого избежать используется данный элемент. Т.е. мы можем стартовой activity присвоить псевдоним и при запуске приложения система будет осуществлять поиск этой activity именно по псевдониму, а не по имени класса, который ее реализует. И если мы назначим стартовой другую activity, то пользователь уже не потеряет иконку на главном экране, так как псевдоним остался без изменений.
На эту тему есть интересная статья.
Дочерние элементы:
Атрибуты:
Данный элемент позволяет записать какие-либо данные по типу “ключ-значение”. Доступ к этим данным можно получить из всего приложения (если объявлены в внутри тега ), либо можно передать необходимые для работы данные конкретной activity (объявляется внутри тега ).
Например, в приложении используются уникальные шрифты. Чтобы избежать задержек при запуске приложения, хотелось бы загружать их предварительно. Для этого создается файл в ресурсах, в котором перечисляются эти шрифты:
Файл манифеста AndroidManifest.xml
Файл манифеста AndroidManifest.xml предоставляет основную информацию о программе системе. Каждое приложение должно иметь свой файл AndroidManifest.xml. Редактировать файл манифеста можно вручную, изменяя XML-код или через визуальный редактор Manifest Editor (Редактор файла манифеста), который позволяет осуществлять визуальное и текстовое редактирование файла манифеста приложения.
Назначение файла
Общая структура манифеста
Файл манифеста инкапсулирует всю архитектуру Android-приложения, его функциональные возможности и конфигурацию. В процессе разработки приложения вам придется постоянно редактировать данный файл, изменяя его структуру и дополняя новыми элементами и атрибутами.
Описание
Элемент является корневым элементом манифеста. По умолчанию Eclipse создает элемент с четырьмя атрибутами:
Атрибуты
объявляет разрешение, которое используется для ограничения доступа к определенным компонентам или функциональности данного приложения. В этой секции описываются права, которые должны запросить другие приложения для получения доступа к вашему приложению. Приложение может также защитить свои собственные компоненты (деятельности, службы, приемники широковещательных намерений и контент-провайдеры) разрешениями. Оно может использовать любое из системных разрешений, определенных Android или объявленных другими приложениями, а также может определить свои собственные разрешения.
android:name название разрешения android:label имя разрешения, отображаемое пользователю android:description описание разрешения android:icon значок разрешения android:permissionGroup определяет принадлежность к группе разрешений android:protectionLevel уровень защиты
Элемент запрашивает разрешение, которые приложению должны быть предоставлены системой для его нормального функционирования. Разрешения предоставляются во время установки приложения, а не во время его работы.
android:name имеет единственный атрибут с именем разрешения android:name. Это может быть разрешение, определенное в элементе
данного приложения, разрешение, определенное в другом приложении или одно из стандартных системных разрешений, например: android:name=»android.permission.CAMERA» или android:name=»»android.permission.READ_CONTACTS»
Наиболее распространенные разрешения
объявляет базовое имя для дерева разрешений. Этот элемент объявляет не само разрешение, а только пространство имен, в которое могут быть помещены дальнейшие разрешения.
определяет имя для набора логически связанных разрешений. Это могут быть как объявленные в этом же манифесте с элементом
разрешения, так и объявленные в другом месте. Этот элемент не объявляет разрешение непосредственно, только категорию, в которую могут быть помещены разрешения. Разрешение можно поместить в группу, назначив имя группы в атрибуте permissionGroup элемента
Русские Блоги
Интерпретация файла манифеста разработки плагина браузера
Интерпретация файла манифеста разработки плагина браузера
Данные исследований
инструкции по настройке manifest.json
manifest.json используется для описания исходных данных и информации о конфигурации подключаемого модуля Chrome. Основное содержимое выглядит следующим образом
Введение в элементы конфигурации
1. manifest_version необходимые
Версия формата файла манифеста, написанная Chrome 18 2 Жестяная банка
2. name необходимые
3. version необходимые
Версия подключаемого модуля. После выпуска новой версии браузер сравнит версию установленного подключаемого модуля, и, если есть более новая версия, он автоматически обновится.
4. description
Описание плагина, не более 132 символов
5. icons
Значок плагина может отображаться в магазине Chrome (128 * 128) | Интерфейс управления плагином (48 * 48) | Значок страницы расширения (16 * 16) желательно в формате png
6. browser_action
7. page_action
Представляет операции, которые могут быть выполнены на текущей странице, затемненные в неактивном состоянии, соответствующие интерфейсу. chrome.pageAction
browser_action с участием page_action Оба используются для определения ситуации щелчка значка, размещенного в верхнем правом углу панели инструментов, но отображение состояния активности двух | Отображение после щелчка | В основном отвечает за несогласованность сцены
Официальное предложение: если реализуемая функция полезна только для определенной страницы, рекомендуется использовать page_action В противном случае используйте browser_action
8. background
Используется для определения части фонового скрипта
В следующих ситуациях потребуется вызвать фоновый скрипт
Параметры определения фонового скрипта
Фильтр событий, некоторые события поддерживают фильтр событий, например, можно отслеживать переключение вкладок
9. Изменение настроек хрома | Изменение отображения пользовательского интерфейса в Chrome | Замена некоторых встроенных страниц в Chrome
10. commands
в состоянии пройти commands Возможность определения сочетаний клавиш для запуска расширенных событий
После нажатия сочетания клавиш серверная часть подключаемого модуля будет отслеживать соответствующее событие.
нота: \ _execute_browser_action \ _execute_page_action Эти две команды не будут отслеживаться. Они вызывают всплывающее окно. Чтобы отслеживать событие всплывающего окна, вы можете использовать popup_page onDomReady
11. content_scripts
content_script Работая в специальной среде, ее можно назвать изолированной средой, в которой вы можете получить доступ к DOM внедренной страницы, но не можете получить доступ к каким-либо переменным и функциям javascript внутри. Напротив, js на странице также недоступны content_script Переменные и функции в
Посетите DOM целевого веб-сайта, который можно использовать для связи
Случай связи, поделитесь DOM со страницей через content_script, чтобы реализовать связь между страницей и расширением
12. externally_connectable
Эта конфигурация напрямую реализует связь между веб-сайтом и плагином, но в manifest.json необходимо выполнить следующую конфигурацию.
13. offline_enabled
Независимо от того, должно ли расширение работать в автономном режиме, по умолчанию установлено значение true, когда хром обнаруживает автономный режим, программа будет выделена
14. permissions | optional_permissions
Объявите разрешения (необходимые подключаемому модулю для реализации основных функций) | Дополнительные разрешения (необходимые дополнительным функциям в подключаемом модуле), элементы подконфигурации этих двух одинаковые
15. web_accessible_resources
Укажите массив строк пути упакованных ресурсов, эти ресурсы доступны в расширении, например content_script Ресурсы, которые будут использоваться и т. Д.,
16. content_security_policy
Политика безопасности контента, политика безопасности по умолчанию script-src ‘self’; object-src ‘self’ У него будут следующие ограничения
Интеллектуальная рекомендация
Разработчик PL / SQL удаленно входит в систему с ошибкой идентификатора соединения Oracle TNS
Мозга
Обратитесь к источнику: IBM DeveloperWorks: https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ содержание: 1. Введение в Cmake 2, обработка каталога файлов с несколькими источниками 3, найти и ис.
Settings.System.getInt, чтобы получить некоторые настройки в Setting
В пользовательских компонентахpropertiesНеправильное использование неправильноVueГрамматика модифицировать.
Манифесты сборки
Манифест сборки — это XML-файл, описывающий параллельную сборку. Манифесты сборок описывают имена и версии параллельных сборок, файлов и ресурсов сборки, а также зависимость сборки в других параллельных сборках. Для правильной установки, активации и выполнения параллельных сборок требуется, чтобы манифест сборки всегда сопровождаться сборкой в системе.
Полный список схем XML см. в разделе Схема файла манифеста.
Манифесты сборки имеют следующие элементы и атрибуты.
Элемент | Атрибуты | Обязательно |
---|---|---|
сборок | Да | |
манифестверсион | Да | |
не наследуется | Нет | |
Неправильн | Да | |
type | Да | |
name | Да | |
language | Нет | |
processorArchitecture | Нет | |
version | Да | |
publicKeyToken | Нет | |
зависимостей | Нет | |
dependentAssembly | Нет | |
файл | Нет | |
name | Да | |
hashAlg | Нет | |
hash | Нет | |
comClass | Нет | |
description | Нет | |
этому | Да | |
threadingModel | Нет | |
tlbid | Нет | |
ID | Нет | |
мискстатус | Нет | |
мискстатусикон | Нет | |
мискстатусконтент | Нет | |
мискстатусдокпринт | Нет | |
мискстатусдокпринт | Нет | |
Экспорт Typelib | Нет | |
tlbid | Да | |
version | Да | |
хелпдир | Да | |
идентификатора | Нет | |
flags | Нет | |
коминтерфацеекстерналпроксистуб | Нет | |
IID | Да | |
baseInterface | Нет | |
нуммесодс | Нет | |
name | Нет | |
tlbid | Нет | |
proxyStubClsid32 | Нет | |
коминтерфацепроксистуб | Нет | |
IID | Да | |
name | Да | |
tlbid | Нет | |
baseInterface | Нет | |
нуммесодс | Нет | |
proxyStubClsid32 | Нет | |
threadingModel | Нет | |
виндовкласс | Нет | |
версиями | Нет |
Расположение файла
Манифесты сборки можно установить в трех расположениях:
Синтаксис имени файла
Имя манифеста сборки — это любое допустимое имя файла, за которым следует manifest.
Из-за способа параллельного поиска закрытых сборок применяются следующие ограничения именования при упаковке библиотеки DLL как закрытой сборки. Рекомендуемый способ — разместить манифест сборки в библиотеке DLL как ресурс. В этом случае идентификатор ресурса должен равняться 1, а имя закрытой сборки может совпадать с именем библиотеки DLL. Например, если имя библиотеки DLL Microsoft.Windows.mysample.dll, то значение атрибута Name, используемое в элементе assemblyIdentity манифеста, также может быть равно Microsoft. Windows. mysample. Другой способ — разместить манифест сборки в отдельном файле. В этом случае имя сборки и ее манифеста должны отличаться от имени библиотеки DLL. Например, Microsoft. Windows. мисамплеасм, Microsoft. Windows. мисамплеасм. manifest и Microsoft.Windows.Mysample.dll. Дополнительные сведения о параллельном поиске закрытых сборок см. в разделе последовательность поиска сборок.
Элементы
В именах элементов и атрибутов учитывается регистр. Значения элементов и атрибутов не учитывают регистр, за исключением значения атрибута Type.
сборок
Элемент Assembly должен находиться в пространстве имен urn: schemas-microsoft-com: ASM. v1. Дочерние элементы сборки также должны находиться в этом пространстве имен путем наследования или добавления тегов.
Элемент Assembly имеет следующий атрибут.
attribute | Описание |
---|---|
манифестверсион | Атрибут манифестверсион должен иметь значение 1,0. |
не наследуется
Неправильн
Описывает и однозначно определяет параллельную сборку.
Этот элемент не содержит вложенных элементов. Элемент assemblyIdentity имеет следующие атрибуты.
attribute | Описание |
---|---|
type | Указывает тип сборки. Значение должно быть в виде Win32 и в нижнем регистре. Обязательный элемент. |
name | Уникально именует сборку. Используйте следующий формат для имени сборки: Organization.Division.Name. Например, Microsoft. Windows. мисамплеасм. Обязательный элемент. Обратите внимание, что в случае DLL, упакованной в виде закрытой сборки с отдельным файлом манифеста, имя сборки должно отличаться от имени библиотеки DLL и манифеста. |
language | Определяет язык сборки. Необязательный элемент. Если сборка зависит от языка, укажите код языка DHTML. В теге «DEF-контекст» манифеста сборки, предназначенного для международных использования (не зависящий от языка), не указывайте атрибут Language. В ТЕГЕ ref-context манифеста сборки, предназначенного для международных использования (нейтральный к языку), задайте для параметра Language значение » * «. |
processorArchitecture | Указывает процессор. допустимые значения — x86 для 32-разрядных Windows и ia64 для 64-разрядной Windows. Необязательный параметр. |
version | Указывает версию сборки. Используйте формат версии из четырех частей: оближешь. nnnnn. ууо. ппппп. Каждая из частей, разделенных точками, может быть 0-65535 включительно. Дополнительные сведения см. в разделе версии сборки. Обязательный элемент. |
publicKeyToken | 16-символьная шестнадцатеричная строка, представляющая последние 8 байт хэша SHA-1 открытого ключа, для которого подписана сборка. Открытый ключ, используемый для подписи каталога, должен иметь длину 2048 бит или более. Требуется для общих параллельных сборок. |
зависимостей
dependentAssembly
File
Элемент File имеет следующие атрибуты.
attribute | Описание |
---|---|
name | Имя файла, например Conctl32.dll. |
hashAlg | Алгоритм, используемый для создания хэша файла. Это значение должно быть SHA1. |
hash | Хэш файла, на который ссылается имя. Шестнадцатеричная строка длины в зависимости от хэш-алгоритма. |
comClass
Элемент comClass имеет следующие атрибуты.
У элемента comClass могут быть элементы ProgID. в
качестве дочерних элементов, в которых перечислены зависимые от версии идентификаторы ProgID.
Значение атрибута | Константа ОЛЕМИСК |
---|---|
рекомпосеонресизе | ОЛЕМИСК _ рекомпосеонресизе |
онликоник | ОЛЕМИСК _ онликоник |
инсертнотреплаце | ОЛЕМИСК _ инсертнотреплаце |
static | ОЛЕМИСК _ статический |
кантлинкинсиде | ОЛЕМИСК _ кантлинкинсиде |
canlinkbyole1 | ОЛЕМИСК _ CANLINKBYOLE1 |
ислинкобжект | ОЛЕМИСК _ ислинкобжект |
некоторая сторона | ОЛЕМИСК _ |
активатевхенвисибле | ОЛЕМИСК _ активатевхенвисибле |
рендерингисдевицеиндепендент | ОЛЕМИСК _ рендерингисдевицеиндепендент |
инвисиблеатрунтиме | ОЛЕМИСК _ инвисиблеатрунтиме |
алвайсрун | ОЛЕМИСК _ алвайсрун |
актсликебуттон | ОЛЕМИСК _ актсликебуттон |
актсликелабел | ОЛЕМИСК _ актсликелабел |
науиактивате | ОЛЕМИСК _ науиактивате |
с выровняйтем | ОЛЕМИСК, _ выровняйте |
симплефраме | ОЛЕМИСК _ симплефраме |
сетклиентситефирст | ОЛЕМИСК _ сетклиентситефирст |
ImeMode | ТОЛЕМИСК _ IMEMODE |
игнореативатевхенвисибле | ОЛЕМИСК _ игнореактиватевхенвисибле |
вантстоменумерже | ОЛЕМИСК _ вантстоменумерже |
суппортсмултилевелундо | ОЛЕМИСК _ суппортсмултилевелундо |
Экспорт Typelib
Элемент typelib содержит атрибуты, приведенные в следующей таблице.
коминтерфацеекстерналпроксистуб
Коминтерфацеекстерналпроксистуб является вложенным элементом элемента Assembly и используется для интерфейсов автоматизации. Например, IDispatch и его производные интерфейсы. Необязательный элемент.
Реализация заглушки прокси-сервера по умолчанию подходит для большинства интерфейсов автоматизации, таких как интерфейсы, производные от IDispatch. Заглушка прокси-сервера интерфейса и все остальные реализации интерфейса-заглушки прокси-сервера должны быть перечислены в коминтерфацеекстерналпроксистуб. Элемент коминтерфацеекстерналпроксистуб содержит атрибуты, приведенные в следующей таблице.
коминтерфацепроксистуб
Элемент коминтерфацепроксистуб имеет следующие атрибуты.
виндовкласс
Имя класса Windows, для которого необходимо указать версию. Элемент виндовкласс имеет следующий атрибут.
attribute | Описание |
---|---|
версиями | Этот атрибут определяет, содержит ли внутреннее имя класса окна, используемое при регистрации, версию сборки, содержащей класс окна. Значение этого атрибута может быть «Yes» или «No». Значение по умолчанию — Yes. Значение «No» следует использовать только в том случае, если один и тот же класс окна определен параллельным компонентом и эквивалентным непараллельным компонентом, и вы хотите обрабатывать их как один и тот же класс окна. Обратите внимание, что обычные правила регистрации класса окна применяются только к первому компоненту, который регистрирует класс окна, и может зарегистрировать его, так как он не имеет версию. |