Дистрибуция приложений #
Васильев Андрей Михайлович, 2024
Версии презентации
Минимальное приложение #
Рассмотрим нативное приложение под операционную систему, main.c
:
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
Скомпилируем данное приложение:
gcc -o app -O3 main.c
Удостоверимся, что приложение работает
$ ./app
Hello, world!
Зависимости приложения #
Рассмотрим информацию об исполняемом файле:
$ file app
app: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=2b4b5f9bc2b755dc4b60cfd008a627ea0b997990,
for GNU/Linux 3.2.0, with debug_info, not stripped
$ ldd app
linux-vdso.so.1 (0x00007ffc3455d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f68c0200000)
/lib64/ld-linux-x86-64.so.2 (0x00007f68c0500000)
Приложению для работы необходимы:
- Процессор с архитектурой x86-64
- Ядро ОС GNU/Linux,
GNU/Linux 3.2.0
- Реализация стандартной библиотеки языка Си,
libc.so.6
Зависимости крупных приложений #
Типичное приложение имеет гораздо больше зависимостей:
- Большое количество библиотек, которые нужны ему для работы
- Возможно есть зависимость от интерпретатора или среды исполнения, если приложение написано не на компилируемом языке программирования
- Статические ресурсы для показа пользователю: иконки, изображения, макеты страниц, документация и т.д.
- Системные или специализированные службы, например базы данных
Известный подход по распространению ПО #
В рамках основных пользовательских платформ (Windows, Android и т.д.) системные библиотеки предоставляются поставщиком платформы, а разработчики должны предоставить несистемные компоненты самостоятельно
- Требует широкополосного доступа в сеть Интернет
- Увеличивается объём данных для передачи и объём используемого пространства на жёстком диске, т.к. каждому Java-приложению надо поставить свою копию JVM
- Существенно увеличивается вероятность проблем с безопасностью, т.к. разработчики не выпускают новые версии приложений только с обновлениями библиотек
В рамках Linux также можно использовать этот способ распространения приложений
Процесс сборки большого приложения #
Рассмотрим процесс компиляции приложения на Си и C++
- Необходимо получить компилятор языка (а как появляется сам компилятор?)
- Необходимо скомпилировать библиотеки, от которых зависит приложение
- Скорее всего потребуется скомпилировать библиотеки, от которых зависят библиотеки
- В конце необходимо скомпилировать своё приложение
Распространение приложения #
Для распространения приложения потребуются собрать вместе:
- Исполняемый файл приложения
- Динамически загружаемые библиотеки
- Ресурсы приложения
При работе с приложениями, реализованных на скриптовых языках программирования, потребуется добавить также среду исполнения
Собранные артефакты поставляются пользователю:
- В виде архива
- В виде установочного пакета
- Апосредовано через средства управления приложениями
Подход с разделением библиотек #
- Изначально ОС UNIX и её компоненты были доступны пользователям как в бинарном виде, так и в исходных кодах (включая ядро ОС и системных приложений)
- При разработке под UNIX большинству разработчиков были доступны системные библиотеки, которые они с удовольствием использовали в своих приложениях
- При возникновении «типичных» задач пользователи разрабатывали свои собственные библиотеки и располагали их рядом с системными
- При разработке новых приложений разработчики в первую очередь ориентировались на те библиотеки, которые уже поставляются в системе или могут быть установлены системными средствами
Открытое программное обеспечение #
- В рамках проекта GNU разрабатывается ПО под лицензией GPL, гарантирующей пользователю ПО доступ к его исходным кодам
- Существует множество проектов ПО, предоставляющие исходные коды
Грамотный пользователь может использовать их для компиляции приложений:
- Исходный код проектов можно найти на пощадках https://sourceforge.net/, https://codeberg.org/, https://github.com/, https://about.gitlab.com/ и др.
- Доступность кода на этих площадках не означает, что он бесплатен для использования. Всегда надо уточнять лицензию, под которой он был выложен
- Разработчик, выложивший исходный код, не обязан пользователю ничем, даже работа приложения по его назначению не гарантируется
Особенности использования свободного кода #
Большинство разработчиков проектов с открытым исходным кодом не занимаются задачей создания дистрибуции своего приложения и используют системные библиотеки
- Разработчику не надо решать вопросы доставки библиотек
- Конкретная библиотека установлена на устройство ровно один раз
- Экономится пространство на файловой системе
- Администраторы системы могут обновлять библиотеки, сразу решая общие проблемы безопасности во множестве приложений
Однако есть и сложности
- Система не обязательно предоставляет ту самую версию библиотеки, или слишком новую, или слишком старую
- Пользователю надо разбираться в инструментах разработки, которые выбрал
данный конкретный разработчик
- Существует множество систем сборок под разные языки программирования
Большие проекты со стабильным финансированием предоставляют дистрибутивы ПО