Время на прочтение9 мин
Количество просмотров5K
Сегодня продолжаем рассказ о том, как мы вместе с ребятами из Университета Иннополис разрабатываем технологию Active Restore, чтобы позволить пользователю как можно раньше начать работу на своей машине после сбоя. Речь пойдет о нативных приложениях Windows, включая особенности их создания и запуска. Под катом – немного о нашем проекте, а также практическое руководство как писать нативные приложения.
В прошлых постах мы уже рассказывали о том, что такое Active Restore, и как студенты из Иннополиса разрабатывают сервис. Сегодня я хочу остановиться на нативных приложениях, до уровня которых мы хотим “закопать” наш сервис активного восстановления. Если все получится, то мы сможем:
- Намного раньше запустить сам сервис
- Намного раньше связаться с облаком, в котором лежит бэкап
- Намного раньше понять, в каком режиме находится система – нормальной загрузки или восстановления
- Намного меньше файлов восстанавливать заранее
- Позволить пользователю приступить к работе еще быстрее.
Что вообще такое нативное приложение?
Чтобы ответить на этот вопрос, давайте взглянем на последовательность вызовов, которые совершает система, например, если программист в своем приложении пытается создать файл.
Pavel Yosifovich — Windows Kernel Programming (2019)
Программист использует функцию CreateFile, которая объявлена в заголовочном файле fileapi.h и реализована в Kernel32.dll. Однако сама эта функция не занимается созданием файла, она лишь проверяет аргументы на входе и вызывает функцию NtCreateFile (приставка Nt как раз свидетельствует о том, что функция нативная). Данная функция объявлена в заголовочном файле winternl.h и реализована в ntdll.dll. Она производит подготовку к прыжку в ядерное пространство, после чего совершает системный вызов для создания файла. В данном случае получается, что Kernel32 – всего лишь обертка для Ntdll. Одна из причин для чего это сделано, Microsoft таким образом имеет возможность изменять функции нативного мира, но при этом не трогать стандартные интерфейсы. Microsoft не рекомендует напрямую вызывать нативные функции и не документирует большую часть из них. Кстати, недокументированные функции можно найти тут.
Основное преимущество нативных приложений заключается в том, что ntdll загружается в систему значительно раньше kernel32. Это логично, ведь kernel32 требует наличия ntdll для работы. Как следствие, приложения, использующие нативные функции, могут начать работу значительно раньше.
Таким образом, Windows Native Applications – это программы, способные запускаться на раннем этапе загрузки Windows. Они используют ТОЛЬКО функции из ntdll. Пример такого приложения: autochk который исполняет chkdisk utility для проверки диска на ошибки еще до запуска основных сервисов. Именно на таком уровне мы и хотим видеть наш Active Restore.
Что нам понадобится?
- DDK (Driver Development Kit), ныне также известный под названием WDK 7 (Windows Driver Kit).
- Виртуальная машина (например, Windows 7 x64)
- Не обязательно, но могут помочь заголовочные файлы которые можно скачать тут
Что же в коде?
Давайте немного потренируемся и для примера напишем небольшое приложение которое:
- Выводит сообщение на экран
- Аллоцирует немного памяти
- Ждет ввода с клавиатуры
- Освобождает занятую память
В нативных приложениях точкой входа является не main или winmain, а функция NtProcessStartup, так как мы фактически напрямую запускаем новые процесс в системе.
Начнем с вывода сообщения на экран. Для этого у нас есть нативная функция NtDisplayString, которая в качестве аргумента принимает указатель на объект структуры UNICODE_STRING. Инициализировать его нам поможет RtlInitUnicodeString. В результате, для вывода текста на экран мы можем написать вот такую небольшую функцию:
//usage: WriteLn(L"Here is my text\n");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}
Так как нам доступны только функции из ntdll, и других библиотек в памяти просто еще нет, у нас обязательно возникнут проблемы с тем как аллоцировать память. Оператора new ещё не существует (потому что он родом из слишком высокоуровнего мира C++), также нет функции malloc (для нее нужны библиотеки runtime C). Можно конечно пользоваться лишь стэком. Но если нам нужно динамически аллоцировать память, делать это придется в куче (т.е. heap). Поэтому давайте создадим для себя кучу и будем брать из нее память когда нам потребуется.
Для этой задачи подойдет функция RtlCreateHeap. Далее, используя RtlAllocateHeap и RtlFreeHeap, мы будем занимать и освобождать память когда нам это будет нужно.
PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;
// create heap in order to allocate memory later
memory = RtlCreateHeap(
HEAP_GROWABLE,
NULL,
1000,
0, NULL, NULL
);
// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
memory,
HEAP_ZERO_MEMORY,
bufferSize
);
// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);
RtlDestroyHeap(memory);
Перейдем к ожиданию ввода с клавиатуры.
// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
USHORT Reserved;
ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
//...
HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;
// inialize variables
RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);
// open keyboard device
NtCreateFile(&hKeyBoard,
SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&Iosb,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,FILE_DIRECTORY_FILE,
NULL, 0);
// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
while (TRUE)
{
NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
NtWaitForSingleObject(hEvent, TRUE, NULL);
if (kbData.MakeCode == 0x01) // if ESC pressed
{
break;
}
}
Все что нам нужно – это использовать NtReadFile на открытом устройстве, и ждать, пока клавиатура не вернет нам какое либо нажатие. В случае, если нажата клавиша ESC, мы продолжим работу. Чтобы открыть устройство, нам потребуется вызвать функцию NtCreateFile (открыть нужно будет \Device\KeyboardClass0). Также мы вызовем NtCreateEvent, чтобы инициализировать объект для ожидания. Мы самостоятельно объявим структуру KEYBOARD_INPUT_DATA, которая представляет данные клавиатуры. Это облегчит нам работу.
Работа нативного приложения завершается вызовом функции NtTerminateProcess, потому что мы просто убиваем свой собственный процесс.
Весь код нашего небольшого приложения:
#include "ntifs.h" // \WinDDK\7600.16385.1\inc\ddk
#include "ntdef.h"
//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------
NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus
);
NTSYSAPI
NTSTATUS
NTAPI
NtDisplayString(
IN PUNICODE_STRING String
);
NTSTATUS
NtWaitForSingleObject(
IN HANDLE Handle,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout
);
NTSYSAPI
NTSTATUS
NTAPI
NtCreateEvent(
OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN EVENT_TYPE EventType,
IN BOOLEAN InitialState
);
// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
USHORT Reserved;
ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------
// usage: WriteLn(L"Hello Native World!\n");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}
void NtProcessStartup(void* StartupArgument)
{
// it is important to declare all variables at the beginning
HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;
PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;
//use it if debugger connected to break
//DbgBreakPoint();
WriteLn(L"Hello Native World!\n");
// inialize variables
RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);
// open keyboard device
NtCreateFile(&hKeyBoard,
SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&Iosb,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,FILE_DIRECTORY_FILE,
NULL, 0);
// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
WriteLn(L"Keyboard ready\n");
// create heap in order to allocate memory later
memory = RtlCreateHeap(
HEAP_GROWABLE,
NULL,
1000,
0, NULL, NULL
);
WriteLn(L"Heap ready\n");
// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
memory,
HEAP_ZERO_MEMORY,
bufferSize
);
WriteLn(L"Buffer allocated\n");
// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);
RtlDestroyHeap(memory);
WriteLn(L"Heap destroyed\n");
WriteLn(L"Press ESC to continue...\n");
while (TRUE)
{
NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
NtWaitForSingleObject(hEvent, TRUE, NULL);
if (kbData.MakeCode == 0x01) // if ESC pressed
{
break;
}
}
NtTerminateProcess(NtCurrentProcess(), 0);
}
PS: Мы можем запросто использовать в коде функцию DbgBreakPoint() для остановки в дебаггере. Правда нужно будет подключить WinDbg к виртуальной машине для кернельной отладки. Инструкцию как это сделать можно найти тут или просто использовать VirtualKD.
Компиляция и сборка
Самый простой способ собрать нативное приложение – это использовать DDK (Driver Development Kit). Нам нужна именно древняя седьмая версия, так как более поздние версии имеют несколько иной подход и тесно работают с Visual Studio. Если же использовать DDK, то нашему проекту нужны всего лишь Makefile и sources.
Makefile
!INCLUDE $(NTMAKEENV)\makefile.def
sources:
TARGETNAME = MyNative
TARGETTYPE = PROGRAM
UMTYPE = nt
BUFFER_OVERFLOW_CHECKS = 0
MINWIN_SDK_LIB_PATH = $(SDK_LIB_PATH)
SOURCES = source.c
INCLUDES = $(DDK_INC_PATH); \
C:\WinDDK\7600.16385.1\ndk;
TARGETLIBS = $(DDK_LIB_PATH)\ntdll.lib \
$(DDK_LIB_PATH)\nt.lib
USE_NTDLL = 1
Ваш Makefile будет точно таким же, на sources же давайте остановимся чуть подробнее. В данном файле указываются исходники вашей программы (файлы .c), опции сборки и другие параметры.
- TARGETNAME – имя исполняемого файла, который должен получиться в итоге.
- TARGETTYPE – тип исполняемого файла, это может быть драйвер (.sys), тогда значение поля должно быть DRIVER, если библиотека (.lib), то значение LIBRARY. В нашем случае нужен исполняемый файл (.exe), поэтому мы устанавливаем значение PROGRAM.
- UMTYPE – возможные значения этого поля: console для консольного приложения, windows для работы в оконном режиме. Но нам необходимо указать nt, чтобы получить нативное приложение.
- BUFFER_OVERFLOW_CHECKS – проверка стэка на переполнение буфера, к сожалению не наш случай, выключаем.
- MINWIN_SDK_LIB_PATH – данное значение ссылается на переменную SDK_LIB_PATH, не стоит переживать что у вас не объявлена подобная системная переменная, в момент когда мы запустим checked build из DDK, данная переменная будет объявлена и будет указывать на необходимые библиотеки.
- SOURCES – список исходников вашей программы.
- INCLUDES – заголовочные файлы, которые необходимы для сборки. Тут обычно указывают путь к файлам, которые идут в комплекте с DDK, но вы можете указать дополнительно любые другие.
- TARGETLIBS – список библиотек, которые необходимо линковать.
- USE_NTDLL – обязательное поле, которое необходимо установить в положение 1. По вполне очевидным причинам.
- USER_C_FLAGS – любые флаги, которые вы сможете использовать в препроцессорных директивах при подготовке кода приложения.
Итак для сборки нам необходимо запустить x86 (или x64) Checked Build, сменить рабочий каталог на папку с проектом и выполнить команду Build. Результат на скриншоте показывает что у нас собрался один исполняемый файл.
Данный файл не получится так просто запустить, система ругается и отправляет нас думать о своем поведении со следующей ошибкой:
Как запустить нативное приложение?
В момент старта autochk последовательность запуска программ определяется значением ключа реестра:
HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute
Менеджер сессии поочередно исполняет программы из этого списка. Сами же исполняемые файлы менеджер сессии ищет в директории system32. Формат значения ключа реестра следующий:
autocheck autochk *MyNative
Значение должно быть в шестнадцатеричном формате, а не в привычном ASCII, следовательно ключ, представленный выше, будет иметь формат:
61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00
Чтобы конвертировать название, можно использовать онлайн-сервис, например, этот.
Получается, чтобы запустить нативное приложение, нам необходимо:
- Скопировать исполняемый файл в папку system32
- Добавить в реестр ключ
- Перезагрузить машину
Для удобства вот вам готовый скрипт для установки нативного приложения:
install.bat
@echo off
copy MyNative.exe %systemroot%\system32\.
regedit /s add.reg
echo Native Example Installed
pause
add.reg
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00
После установки и перезагрузки еще до появления экрана выбора пользователей мы получим следующую картину:
Итог
На примере вот такого маленького приложения мы убедились, что запустить приложение на уровне Windows Native вполне возможно. Дальше мы с ребятами из Университета Иннополис продолжим строить сервис, который будет инициировать процесс взаимодействия с драйвером намного раньше, чем в предыдущей версии нашего проекта. А с появлением оболочки win32 логично будет передать управление полноценному сервису, который уже был разработан (об этом подробнее здесь).
В очередной статье мы коснемся еще одного компонента сервиса Active Restore, а именно UEFI драйвера. Подписывайтесь на наш блог, чтобы не пропустить следующий пост.
Десять кроссплатформенных вариантов для создания нативных мобильных и веб-приложений
03.05.2025
Портал The New Stack представляет 10 фреймворков и языков для создания кроссплатформенных приложений.
1. Flutter
Открытый инструментарий Google для создания мобильного пользовательского интерфейса (UI) Flutter позволяет писать высокопроизводительные мобильныхе, веб- и настольные приложения с нативными внешним видом и ощущениями на основе единой кодовой базы. Построенный на базе языка программирования Dart, он известен горячей перезагрузкой, настраиваемым UI и богатым набором виджетов. Flutter используется внутри Google, а также применяется такими компаниями, как BMW и Toyota.
2. Iconic
Iconic — это открытый набор инструментов для создания высококачественных кроссплатформенных гибридных и прогрессивных веб-приложений (PWA) с использованием HTML, CSS и JavaScript. Разработчики используют его для написания приложений, которые могут работать на веб-платформах, iOS, Android и настольных компьютерах.
Хотя прошлые версии Ionic были тесно связаны с Angular, в версии 4.x фреймворк был переработан для работы в качестве самостоятельной библиотеки Web Component, поэтому его можно использовать в большинстве фронтенд-фреймворков, включая React и Vue. Некоторые JavaScript-фреймворки для полноценной поддержки Web Component требуют использования shim, то есть кода (часто библиотеки), который выступает в качестве промежуточного слоя.
3. Kotlin
Kotlin — многоплатформенный язык программирования общего назначения, разработанный компанией JetBrains, поставщиком интегрированной среды разработки (IDE). Он может компилироваться в JVM, JavaScript для веб-разработки и в нативный код для создания кроссплатформенных приложений под Android, iOS, macOS, Windows, Linux и WebAssembly. Kotlin используется с фреймворками пользовательского интерфейса, такими как Compose Multiplatform, фреймворк на базе Kotlin для совместного использования декларативного UI на нескольких платформах: для Android, iOS, настольных компьютеров и, в экспериментальном варианте, для Web.
У компании также есть Kotlin Multiplatform Mobile, фреймворк для мобильной разработки, построенный на базе языка Kotlin. Он позволяет разработчикам один раз написать бизнес-логику, не зависящую от платформы, а затем скомпилировать ее в библиотеку Kotlin для Android и нативный Universal Framework для iOS с помощью Kotlin/Native. Netflix использовала этот инструмент для создания Prodicle, мобильного приложения для производства телешоу и фильмов.
4. Lynx
Lynx — это семейство технологий с LynxJS в качестве кроссплатформенного UI-фреймворка, созданное ByteDance, компанией-владельцем TikTok. Lynx позволяет разработчикам создавать нативные UI с использованием единой кодовой базы для кроссплатформенных приложений, включая веб, Android и iOS. Он был запущен 5 марта и уже получил положительные отзывы и сравнения с React Native.
5. NativeScript
NativeScript — это фреймворк с открытым исходным кодом на основе JavaScript для создания нативных мобильных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular. В отличие от гибридных фреймворков, которые отображают UI в WebView, NativeScript компилируется непосредственно в нативные UI-компоненты, что обеспечивает производительность и пользовательский опыт, близкие к приложениям, созданным на таких специфичных для конкретной платформы языках, как Swift или Kotlin. Это позволяет веб-разработчикам использовать имеющиеся навыки для создания высокопроизводительных мобильных приложений, сохраняя при этом доступ к нативным API устройств.
6. .NET MAUI
.NET MAUI, ранее называвшийся Xamarin, расшифровывается как NET Multiplatform App UI. Разработанный Microsoft, он позволяет разработчикам .NET создавать нативные мобильные и настольные приложения на основе единой кодовой базы. Он использует C# и экосистему .NET, предоставляя единый API для доступа к функциям конкретной платформы и создания UI, которые могут работать на iOS, Android, macOS и Windows. Используется компанией Progress Software. При этом Xamarin все еще доступен.
7. One
One — это фреймворк на основе React, который позволяет разработчикам писать один раз и развертывать в вебе или React Native для мобильных устройств. По словам его создателя Нейта Винерта, который также создал библиотеку пользовательского интерфейса Tamagui, в настоящее время он находится в бета-версии. С помощью единого плагина Vite он дает разработчикам возможность создавать приложения как для веб, так и для нативной платформы. One позволяет создавать одностраничные приложения, генерировать статические сайты и рендерить веб-страницы на стороне сервера, что является его ключевым отличием.
8. Qt
Qt — зрелый кроссплатформенный фреймворк, написанный преимущественно на C++. Он используется для разработки для настольных систем — Windows, MacO и Linux — но также поддерживает встраиваемые системы, мобильные устройства с Qt for Mobile и веб с Qt for WebAssembly. Он предоставляет богатый набор виджетов и UI-инструментов.
Qt также предоставляет набор библиотек для таких функций, как поддержка сетей, доступ к базам данных, обработка мультимедиа и XML, что позволяет создавать сложные приложения для разных платформ на основе единой кодовой базы. В отличие от других вариантов в этом списке, у QT есть вариант коммерческой лицензии.
9. React Native
React Native — это фреймворк с открытым исходным кодом, который позволяет разработчикам создавать нативные мобильные приложения для iOS и Android с помощью JavaScript и React. Он позволяет повторно использовать код на разных платформах, ускоряя разработку и обеспечивая при этом доступ к нативным функциям и производительности устройств. Веб-разработчики на JavaScript используют его для создания мобильных приложений. Одним из способов использования React Native является Expo — фреймворк и платформа, построенная поверх React Native.
10. Swift
Разработанный Apple для собственных платформ, Swift превратился в кроссплатформенный язык программирования. Он доступен в Linux и Windows для разработки серверной части, инструментов командной строки и настольных приложений. SwiftUI — это проприетарный фреймворк на основе Swift для создания приложений для всех платформ Apple (iOS, macOS, watchOS, tvOS и visionOS).
В таблице представлено сравнение фреймворков:
|
Название |
Что собой представляет |
Кем создан |
Основа |
Для чего предназначен |
Open Source? |
Особенности |
|
Flutter |
Комплект для разработки UI |
|
Dart |
Нативно скомпилированные из единой кодовой базы мобильные, веб- и настольные приложения |
Да, лицензия BSD 3-Clause |
Известен своей быстрой разработкой благодаря таким функциям, как Hot Reload, выразительным и гибким UI с богатым набором виджетов, а также способностью создавать высокопроизводительные приложения, которые выглядят и ощущаются как нативные на разных платформах |
|
Iconic |
UI-инструментарий |
Макс Линч, Бен Сперри и Адам Брэдли, которые были частью компании Drifty в 2013 г. |
JavaScript — включая Angular, Vue и React — и его разновидности (например, TypeScript), а также HTML и CSS |
Гибридные мобильные приложения, прогрессивные веб-приложения (PWA) и настольные приложения, использующие веб-технологии, такие как HTML, CSS и JavaScript (часто с Angular, React или Vue.js) |
Да, лицензия MIT |
Доступен Iconic CLI; он отображает UI в WebView |
|
Kotlin |
Кроссплатформенный язык программирования общего назначения |
JetBrains |
Java |
Разработка под Android и разработка бэкенда на виртуальной машине Java (JVM). Компилируется в JavaScript (Kotlin/JS) для фронтенд-веб-разработки и в нативный код (Kotlin/Native) для iOS, macOS, Windows, Linux и WebAssembly |
Да, лицензия Apache 2.0 |
Совместное использование кода на разных платформах |
|
Lynx |
Кросс-платформенный UI-фреймворк |
ByteDance, которой принадлежит TikTok |
Основной движок написан на Rust, однако для создания приложений на Lynx разработчики в основном используют JavaScript и TypeScript |
Используется для создания единой кодовой базы для кроссплатформенных приложений и веба |
Да, лицензия Apache 2 |
Позволяет разработчикам использовать CSS, даже если он является нативным. Некоторые компоненты UI и расширенные встроенные графические возможности еще не выпущены под лицензией Apache 2 |
|
NativeScript |
Фреймворк для создания нативных мобильных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular |
Telerik, которая ныне принадлежит компании Progress Software. Сейчас принадлежит OpenJS Foundation |
JavaScript, TypeScript и Angular |
Создание нативных приложений для iOS и Android с помощью JavaScript, TypeScript или Angular. |
Да, лицензия Apache 2.0 |
В нем напрямую используются нативные компоненты UI. Разработчики получают доступ ко всем возможностям нативных API устройств. NativeScript не пытается эмулировать нативный UI или работать в контейнере браузера. Вместо этого он выступает в роли моста между JavaScript/TypeScript/Angular и нативными API, позволяя писать код на этих привычных языках, который напрямую манипулирует и использует базовые возможности нативной платформы и компоненты UI |
|
.NET MAUI (ранее Xamarin) |
Кросс-платформенный фреймворк |
Microsoft |
C# и .NET |
Развивает и унифицирует Xamarin.Forms, позволяя создавать приложения, которые могут работать на iOS, Android, macOS и Windows из единой кодовой базы |
Да, лицензия MIT |
Предоставляет набор элементов управления UI и API для доступа к нативным функциям платформы |
|
One |
Кросс-платформенный фреймворк |
Нейт Вайнерт |
JavaScript React |
Создает как веб-страницы с помощью React, так и нативные приложения для платформ с помощью React Native |
Да, лицензия MIT |
Отображает любую страницу как SPA, SSR или SSG, управляя глобальным значением по умолчанию. Предлагает CLI |
|
QT |
Кроссплатформенный фреймворк для разработки настольных приложений с поддержкой мобильных устройств с помощью Qt for Mobile и веб-приложений с помощью Qt for WebAssembly |
Хаавард Норд и Эйрик Чамбе-Энг из компании Trolltech, которая после ряда приобретений превратилась в Qt Company |
C++ |
Высокопроизводительные настольные, мобильные и веб-приложения |
Да, лицензии LGPL и GPL, доступна коммерческая лицензия |
Предоставляет набор библиотек для таких функций, как работа в сети, доступ к базам данных, мультимедиа, обработка XML, поэтому с его помощью можно создавать сложные приложения для разных платформ на основе единой кодовой базы |
|
React Native |
Фреймворк для создания нативных мобильных приложений |
Meta (признана экстремистской и запрещена в РФ) |
JavaScript React |
iOS и Android из единой кодовой базы |
Да, лицензия MIT |
|
|
Swift |
Кроссплатформенный язык, использующий UIKit или SwiftUI в качестве фреймворка |
Apple |
Swift |
Создание приложений для iOS и Android (с помощью Swift for Android). Может компилироваться в WebAssembly и использоваться для создания серверных приложений для Linux, инструментов командной строки и многого другого. Растущая поддержка разработки на Swift под Windows позволяет создавать приложения и для этой платформы |
Да |
Создает компоненты на стороне сервера, которые обеспечивают работу веб-приложений и генерируют исходный HTML. Такие фреймворки, как Vapor, Kitura и Perfect, позволяют разрабатывать веб-приложения на стороне сервера с помощью Swift |
Комментарии
Только зарегистрированные пользователи могут оставлять комментарий.
Регистрация
Авторизация
|
Интересно |
|
Сегодня только 1% SaaS-приложений дополнены искусственным интеллектом, но ситуация быстро меняется, пишет …
В последние два с половиной года генеративный искусственный интеллект (GenAI) развивался удивительными темпами. Все …
Поставщики платформ освоения цифровых технологий (Digital Adoption Platform, DAP) были в авангарде интеграции автоматизации …
Цифровая трансформация предприятий поддерживается на уровне нацпроектов: с начала этого года действует программа …
Компания DevExperts, занимающаяся разработкой ПО, протестировала и сравнила инструменты генерации кода Copilot … |
Создавайте красивые нативные настольные приложения для Windows и macOS.
.NET МАУИ
.NET Multi-platform App UI (.NET MAUI) — это платформа для создания современных многоплатформенных настольных приложений для macOS и Windows, а также мобильных приложений для Android и iOS с использованием C# и XAML в единой кодовой базе.
.NET MAUI использует новейшие современные технологии для создания нативных приложений для Android, iOS, macOS и Windows, абстрагируя их в одну общую структуру, построенную на .NET 6 и более поздних версиях.
Узнайте больше о .NET MAUI
Blazor Hybrid
Blazor позволяет создавать интерактивные пользовательские веб-интерфейсы с помощью C# вместо JavaScript. Приложения Blazor состоят из многократно используемых компонентов веб-интерфейса, реализованных с использованием C#, HTML и CSS.
Совместно используйте одни и те же компоненты Blazor на настольных компьютерах, мобильных устройствах и в Интернете, используя при этом полный доступ к собственным возможностям клиента с помощью Blazor Hybrid.
Узнайте больше о Blazor Hybrid
WinUI и WinAppSDK
Библиотека пользовательского интерфейса Windows (WinUI) — это платформа пользовательского интерфейса для настольных приложений Windows, включающая поддержку C# и .NET. WinUI доступен как часть Windows App SDK. Windows App SDK предоставляет унифицированный набор API и инструментов, которые можно использовать согласованным образом в широком наборе целевых версий ОС Windows.
.NET MAUI использует WinUI под капотом при работе с настольными приложениями Windows.
Узнайте больше о вариантах разработки для Windows
Готовы приступить?
Простое обучение .NET с помощью пошаговых руководств.
Начать
React Native — это платформа, позволяющая создавать мобильные приложения на основе JavaScript и React. Разработана Facebook и применяется во многих мировых проектах, среди которых Instagram, Discord, Pinterest, Bloomberg, Wix и другие.
Приложения на React Native имеют согласованный интерфейс: учитесь один раз — пишите где угодно.
Благодаря репозиторию React Native for Windows приложения на React можно писать для UWP (Universal Windows Platform), а значит под все устройства, которые поддерживают Windows 10 (ПК, планшеты, Xbox, устройства смешанной реальности).
Узнать подробней и начать изучать этот проект можно по его документации. Так же можно ознакомиться с React Native в целом. Следить за последними событиями можно в блоге.
React Native for Windows — это open source проект. Вы сможете помочь им, предложив какую-нибудь фичу или решив имеющуюся проблему.
Уже успели купить новые Copilot+ PC — Surface Pro 11 или Surface Laptop 7? Пора запускать любимые приложения — в этой статье расскажем, какие из них уже оптимизированы для Windows на ARM.
Веб-браузеры
Браузер — одно из важнейших приложений на любом компьютере. Отличная новость: большинство популярных браузеров уже оптимизированы для Windows на ARM! Google Chrome, Mozilla Firefox, Microsoft Edge и не только — все они работают с максимальной производительностью и эффективностью.
- Google Chrome — быстрый и безопасный браузер от Google.
- Microsoft Edge — встроенный браузер с ИИ-помощником.
- Mozilla Firefox — браузер, защищающий вашу приватность.
- Opera Browser: — легкий и быстрый, с множеством встроенных функций.
- Brave Browser — блокирует рекламу и трекеры из коробки, ускоряя серфинг.
- Vivaldi Browser — Максимальные возможности настройки и встроенные инструменты для продуктивной работы.
Мультимедиа
Для отдыха идеально подходят мультимедийные приложения. К счастью, для Windows на базе ARM есть множество оптимизированных программ, включая Spotify, VLC Media Player и популярные стриминговые сервисы.
- Windows Media Player — встроенное приложение для просмотра видео и прослушивания музыки.
- Spotify — популярный стриминговый сервис с клиентом под Windows.
- VLC Media Player — бесплатный кросс-платформенный медиаплеер и потоковый сервер.
- Kodi — медиаплеер с открытым исходным кодом.
- Netflix — смотрите самые обсуждаемые телешоу и фильмы.
- Handbrake — популярный конвертер форматов.
Продуктивность
Ваш ПК с Windows готов к работе, и на нем должны быть приложения для повышения продуктивности. Microsoft Office оптимизирован для Windows на базе ARM и включает Word, PowerPoint, OneNote и Outlook. Также доступны альтернативы, такие как LibreOffice и Notepad++.
- Microsoft Office — все ваши любимые приложения и контент в одном месте.
- Microsoft OneNote — цифровой блокнот для записи и организации заметок.
- Microsoft Outlook — лучший в своем классе опыт работы с электронной почтой, бесплатный для всех пользователей Windows.
- Microsoft Journal — приложение для ведения дневника с цифровым пером.
- Microsoft To-Do — планируйте свой день и управляйте своей жизнью.
- Microsoft Phone Link — мгновенный доступ к вашему телефону прямо с ПК.
- LibreOffice — мощный офисный пакет, совместимый с Microsoft Office.
- Notepad++ — бесплатный редактор исходного кода, поддерживающий множество языков.
