Дистрибуция приложений #

Васильев Андрей Михайлович, 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

Зависимости крупных приложений #

Типичное приложение имеет гораздо больше зависимостей:

  • Большое количество библиотек, которые нужны ему для работы
  • Возможно есть зависимость от интерпретатора или среды исполнения, если приложение написано не на компилируемом языке программирования
  • Статические ресурсы для показа пользователю: иконки, изображения, макеты страниц, документация и т.д.
  • Системные или специализированные службы, например базы данных

diagram

Известный подход по распространению ПО #

В рамках основных пользовательских платформ (Windows, Android и т.д.) системные библиотеки предоставляются поставщиком платформы, а разработчики должны предоставить несистемные компоненты самостоятельно

  • Требует широкополосного доступа в сеть Интернет
  • Увеличивается объём данных для передачи и объём используемого пространства на жёстком диске, т.к. каждому Java-приложению надо поставить свою копию JVM
  • Существенно увеличивается вероятность проблем с безопасностью, т.к. разработчики не выпускают новые версии приложений только с обновлениями библиотек

В рамках Linux также можно использовать этот способ распространения приложений

diagram

Процесс сборки большого приложения #

Рассмотрим процесс компиляции приложения на Си и C++

  • Необходимо получить компилятор языка (а как появляется сам компилятор?)
  • Необходимо скомпилировать библиотеки, от которых зависит приложение
  • Скорее всего потребуется скомпилировать библиотеки, от которых зависят библиотеки
  • В конце необходимо скомпилировать своё приложение

diagram

Распространение приложения #

Для распространения приложения потребуются собрать вместе:

  • Исполняемый файл приложения
  • Динамически загружаемые библиотеки
  • Ресурсы приложения

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

Собранные артефакты поставляются пользователю:

  • В виде архива
  • В виде установочного пакета
  • Апосредовано через средства управления приложениями

diagram

Подход с разделением библиотек #

  • Изначально ОС UNIX и её компоненты были доступны пользователям как в бинарном виде, так и в исходных кодах (включая ядро ОС и системных приложений)
  • При разработке под UNIX большинству разработчиков были доступны системные библиотеки, которые они с удовольствием использовали в своих приложениях
  • При возникновении «типичных» задач пользователи разрабатывали свои собственные библиотеки и располагали их рядом с системными
  • При разработке новых приложений разработчики в первую очередь ориентировались на те библиотеки, которые уже поставляются в системе или могут быть установлены системными средствами

diagram

Открытое программное обеспечение #

  • В рамках проекта GNU разрабатывается ПО под лицензией GPL, гарантирующей пользователю ПО доступ к его исходным кодам
  • Существует множество проектов ПО, предоставляющие исходные коды

Грамотный пользователь может использовать их для компиляции приложений:

diagram

  • Исходный код проектов можно найти на пощадках https://sourceforge.net/, https://codeberg.org/, https://github.com/, https://about.gitlab.com/ и др.
  • Доступность кода на этих площадках не означает, что он бесплатен для использования. Всегда надо уточнять лицензию, под которой он был выложен
  • Разработчик, выложивший исходный код, не обязан пользователю ничем, даже работа приложения по его назначению не гарантируется

Особенности использования свободного кода #

Большинство разработчиков проектов с открытым исходным кодом не занимаются задачей создания дистрибуции своего приложения и используют системные библиотеки

  • Разработчику не надо решать вопросы доставки библиотек
  • Конкретная библиотека установлена на устройство ровно один раз
    • Экономится пространство на файловой системе
    • Администраторы системы могут обновлять библиотеки, сразу решая общие проблемы безопасности во множестве приложений

Однако есть и сложности

  • Система не обязательно предоставляет ту самую версию библиотеки, или слишком новую, или слишком старую
  • Пользователю надо разбираться в инструментах разработки, которые выбрал данный конкретный разработчик
    • Существует множество систем сборок под разные языки программирования

Большие проекты со стабильным финансированием предоставляют дистрибутивы ПО