Всё чаще и чаще пользователи Windows 10 задаются вопросами по поводу универсальных приложений. Иногда приложение называется универсальным, но доступно исключительно для Windows 10 Insider Preview. Иногда оно называется универсальным, но доступно только пользователям ПК, хотя имеет компактный вид интерфейса совсем почти как на смартфоне. Давайте разбираться вместе, как же так получается? Ведь Windows 10 — универсальная операционная система.
Ответ на вопрос, как так получается, можно найти в маленьком конфигурационном файле, который сопровождает каждый дистрибутив приложения или игры в Windows Store. В нём находятся специальные параметры, которые указывают, для какого типа устройств предназначен данный пакет приложения, а также начиная с какой минимальной версии операционной системы заявленного семейства устройств он может работать и на какой последней версии разработчик протестировал работу данного пакета приложения. Но обо всём по порядку.
Семейства устройств с Windows 10
Да, Windows 10 универсальная, но, к сожалению, все устройства, на которых она способна работать, ещё не настолько универсальны. Они имеют различные конфигурации оборудования, различные подключаемые устройства, принципы взаимодействия с периферией и вообще могут очень сильно отличаться друг от друга. Разумеется, за последние десятилетия стремительного развития компьютерного мира множество компаний и даже целые консорциумы пытаются продвинуть использование стандартов. Чаще всего это получается, так как стандарты упрощают проектирование оборудования, его производство, разработку программного обеспечения и использования всего этого пользователем. Может быть, в будущем у нас и будут компьютеры, смартфоны, игровые приставки и умные холодильники, которые максимально идентичны как по аппаратному, так и по программному обеспечению. По крайней мере, развитие индустрии идёт именно в этом направлении.
Но на данный момент ваш домашний ПК, HoloLens и Raspberry Pi 2 — это довольно разные устройства. Они имеют разное оборудование, разные подходы к интерфейсу и могут иметь очень различающиеся наборы API. Чтобы стандартизировать разработку и дистрибуцию приложений для Windows 10, в документации и инструментах разработчиков Microsoft использует понятие Device Family, «семейство устройств». В манифесте приложения возможность работы на каком-либо из указанных семейств определяется атрибутом Name (Windows.<Family>) параметра TargetDeviceFamily.
В настоящее время в документации выделяют следующие семейства устройств.
- Windows.Desktop: настольные ПК, ноутбуки, планшетные компьютеры (экран от 8 дюймов), гибридные устройства.
- Windows.Mobile: смартфоны, основанные на чипах Qualcomm (ARM) и Intel Atom (x86), а также гипотетические планшетные компьютеры с экраном диагональю менее 7.99 дюймов.
- Windows.Xbox: игровая приставка Xbox One и её предполагаемые потомки.
- Windows.Team: сюда входит пока лишь два устройства Surface Hub.
- Windows.IoT: одноплатные компьютеры вроде Raspberry Pi 2, носимая электроника, элементы умного дома и другие подобные устройства. Сюда же входят и IoT Headless, которые отличаются от обычных IoT отключённым графическим интерфейсом или его отсутствием.
В официальной документации пока нет HoloLens, Microsoft Band (в нём может оказаться Windows.IoT) и других пока необычных устройств. Они появятся позже, когда разработка приложений для них будет общедоступна.
Все эти устройства объединяет одно надсемейство, которое так и называется — Windows.Universal. Если в манифесте приложения указано Windows.Universal, то это приложение может работать на всём семействе устройств с Windows 10 при наличии пакета совместимого с используемой процессором платформой. Это довольно редкое явление, так как в таком случае разработчик должен озаботиться интерфейсами для всех семейств устройств, или же возможностью удалённого управления через консоль в случае IoT Headless, а также использованием различных свойств и методов API. Сложность реализации универсального приложения напрямую зависит от сложности самого приложения. Поэтому в одном случае у разработчика получится создать приложение, которое легко будет запускаться на всех доступных семействах устройств, а в другом случае придётся немного попотеть.
Помимо разделения на семейства, применяется также более классическое разделение по платформам. Это хорошо знакомые большинству из нас x86, x64 и ARM. Именно такое техническое ограничение препятствует выполнению классических приложений для Windows, например, на смартфонах с ARM или Raspberry Pi 2. Можно также вспомнить Project Centennial, «мост» для разработчиков, который позволит упаковывать Win32-приложения в дистрибутивы, пригодные для распространения через Windows Store. Да, вы сможете установить из Windows Store Skype для рабочего стола у себя на компьютере, но не сможете установить его-же на своём смартфоне. Стоит отметить, что для Windows 8.x была доступна возможность создания единых пакетов приложений которые работали и на ARM, и на x86-64, которые помечались как нейтральные (neutral), но в свете использования нативной компиляции .NET Native, конфигурация AnyCPU более не является корректной, поэтому в случае использования нативной компиляции собираются отдельные пакеты для каждой из трёх платформ.
Пример
Не так давно на Windows 10 вышло продолжение «конфетной саги» — игра Candy Crush Soda Saga. Сначала она появилась только на компьютерах, и только через некоторое время стала доступна пользователям Windows 10 Mobile. Такая задержка мобильной версии игры встречается уже не первый раз. Дело в том, что хотя перед нами пример универсального приложения, пакет игры разный для компьютеров и телефонов. На данный момент на компьютерах доступен установочный пакет Candy Crush Soda Saga версии 1.51.8.0, а на смартфонах — пакет версии 1.51.7.0. Разработчики приложения могли не загружать ARM-пакет, либо ограничить публикацию в первое время только для настольного семейства устройств.
Различие в версиях Windows 10 в рамках одного семейства устройств
Для того, чтобы объяснить различия в версиях Windows 10 в рамках одного семейства устройств, мы возьмём пример семейства Windows.Desktop. Ведь это единственное семейство устройств, для которых Windows 10 вышла официально в виде законченного продукта. Но после её выхода 29 июля работа программы Windows Insider не была остановлена. В настоящее время её участники получают новые сборки Windows 10 Insider Preview, которые постепенно подводят нас к скорому релизу осеннего обновления Windows 10, известного также как Windows Threshold 2. Именно поэтому у пользователей семейства устройств Windows.Desktop есть три основных версии операционной системы: стабильная версия Windows 10240, Windows 10 Insider Preview из Slow Ring и Windows 10 Insider Preview из Fast Ring. Таким образом, у пользователей Windows 10 для компьютеров есть как минимум три разные версии операционной системы. На самом деле, их гораздо больше, так как в обоих циклах постоянно появляются новые сборки, а внутри Microsoft сборки появляются ежедневно.
Итак, в манифесте приложения для Windows 10 в параметре TargetDeviceFamily можно найти параметры MinVersion и MaxVersionTested. Первый декларирует, на какую минимальную версию Windows 10 заявленного семейства устройств можно установить данный пакет приложения. Второй указывает, на какой последней версии операционной системы разработчик протестировал работу приложения. Например, Microsoft чаще всего выпускает новые версии системных приложений для Windows 10 сначала для участников Windows Insider. Так как все актуальные публичные сборки Windows 10 Insider имеют нумерацию 10.0.105xx.0 (например, актуальная — 10.0.10547.0), то разработчикам приложения «Почта и календарь» достаточно в манифесте указать MinVersion=«10.0.10500.0». Тогда обновление в Windows Store увидят исключительно пользователи сборки Windows 10 Insider Preview не ниже 10500. Когда новые возможности в «Почте» будут протестированы, то Microsoft выпустит новую версию, где в манифесте укажет MinVersion=«10.10240.0». Тогда эта версия станет доступна пользователям стабильной версии Windows 10 для ПК. За прошедшую неделю таких обновлений для «Почты» вышло как минимум пять, но всего два из них декларировались для 10.0.10240.0 и выше.
Пример 1
Можно вспомнить поэтапное обновление приложения «Фотографии» для Windows 10. Для устройств с установленной актуальной версией Windows 10 Insider Preview 19 сентября стало доступно обновление приложения до версии 15.918.14122, в которой появилась возможность создания альбомов. При этом пользователи стабильной версии Windows 10 10240 этого обновления для «Фотографий» не увидели и версия приложения в таком случае была вышедшая ранее 15.915.17170.0. Через некоторое время, когда разработчики приложения получили обратную связь и данные телеметрии от участников Windows Insider, в Windows Store была отправлена версия «Фотографий» под номером 15.922.11070.0. Её манифест декларировал доступность приложения для стабильной Windows 10 10240 и выше. И именно тогда пользователи стабильной версии Windows 10 получили возможность работать с альбомами. Актуальная версия приложения «Фотографии» на данный момент — 15.1001.16470.0, и она доступна пользователям Windows 10 10240 и выше.
Пример 2
В попавшей неофициальным путём в конце прошлой недели сборке Windows 10 Insider Preview под номером 10558 были обнаружены новые приложения, среди которых внезапно оказалось приложение «Телефон». В его манифесте можно обнаружить свойства атрибутов, которые указывают, что данное приложение доступно для компьютеров и смартфонов с установленной сборкой не ниже 10.0.10558.0 и поэтому на странице приложения в Windows Store оно помечено недоступным для всех версий ОС ниже 10558.
Заключение
Из всего описанного выше можно сделать вывод, что параметр TargetDeviceFamily в манифесте приложения имеет крайне важное значение для всех: для Microsoft, для разработчиков, для простых пользователей. Благодаря ему создатель приложения для Windows 10 может выбрать на каких устройствах с какой версией Windows 10 будет работать его приложение. И хотя платформа универсальная, у каждого типа устройств есть свои особенности, что немного вредит этой самой универсальности.
Итак, давайте обобщим всё то, что рассматривали выше. Вся иерархия параметра TargetDeviceFamily абстрактного приложения выглядит следующим образом.
<Dependencies>
<TargetDeviceFamily Name=«Windows.Mobile» MinVersion=«10.0.10500.0» MaxVersionTested=«10.0.10550.0»/>
<TargetDeviceFamily Name=«Windows.Desktop» MinVersion=«10.0.10240.0» MaxVersionTested=«10.0.10550.0»/>
</Dependencies>
Мы видим, что приложение доступно на компьютерах с Windows 10 10240 и новее, а на смартфонах с Windows 10 Mobile данное приложение доступно только для сборок с версией выше 10500. То есть, для Windows 10 Mobile из ветки Windows Threshold 2. В этом случае нелишним будет вспомнить то, что новые смартфоны Lumia 950 и Lumia 950 XL будут продаваться с предустановленной специально доработанной версией Windows 10 Mobile 10240. Это значит, что рассмотренное выше абстрактное приложение на них работать не будет. Да и на других устройствах, которые не являются смартфонами или компьютерами, оно тоже работать не будет.
Различия в разных семействах устройств вынуждают разработчиков готовить отдельные пакеты приложений для каждого семейства. Например, для навигации в версии приложения для компьютера может быть использована кнопка «Назад» на панели задач в режиме планшета или же аналогичная кнопка в заголовке окна. Также можно задействовать кнопку Backspace на клавиатуре. Для навигации на смартфоне необходимо использовать или аппаратную кнопку, или кнопку «Назад» в панели навигации. Любой зависящий от конкретного семейства устройств код рекомендуется завернуть в условие перед исполнением. Также различные пакеты одного и того же приложения приходится собирать для разных архитектур. В этом случае от разработчика почти ничего не требуется. Ему просто нужно указать нужную платформу при компиляции, указать нужную декларацию семейства устройств в манифесте и отправить в Windows Store на модерацию полученные на выходе пакеты.