Bionic (программное обеспечение)

редактировать
Bionic
Разработчик (и) Open Handset Alliance
Первоначальный выпуск23 сентября 2008 г.; 12 лет назад (23.09.2008)
Репозиторий Отредактируйте на Викиданные
Операционная система Android
Платформа x86, x86-64, ARM, ARM64, MIPS, MIPS64
Тип Стандартная библиотека C
Лицензия Три пункта Лицензия BSD
Веб-сайтразработчик.android.com Измените это в Викиданных

Bionic - это реализация из стандартной библиотеки C, разработанной Google для своей Android операционной системы. Она отличается от GNU C Library (glibc) тем, что предназначена для устройств с меньшим объемом памяти и процессором, чем типичная система Linux. Он также выпущен под лицензией BSD вместо Стандартной общественной лицензии ограниченного применения GNU (LGPL), используемой для glibc. Эта разница была важна на заре Android, когда статическая компоновка была обычным явлением, и до сих пор полезна для представления Android компаниям-разработчикам программного обеспечения, использующим проприетарные операционные системы, которые могут опасаться LGPL и не понимать различий между ним и полная Стандартная общественная лицензия GNU (GPL).

Bionic - это библиотека C для использования с ядром Linux, которая предоставляет libc, libdl, libm, и libpthread. Это отличается от библиотек C BSD, для которых требуется ядро ​​BSD .

Содержание
  • 1 Исходные цели
  • 2 Поддерживаемые архитектуры
  • 3 Компоненты
  • 4 Отличия от POSIX
  • 5 Связь с NDK
  • 6 Укрепление источника
  • 7 Противоречия
  • 8 См. Также
  • 9 Ссылки
  • 10 Внешние ссылки
Исходные цели

Оригинал публично заявлен Цели Bionic были следующие:

  • с лицензией BSD : Google хотел изолировать приложения Android от воздействия лицензий с авторским левом, чтобы создать проприетарный пользовательский space и экосистема приложений, но:
    • Android основан на ядре Linux, на которое распространяется действие Стандартной общественной лицензии GNU (GPL) с авторским левом версии 2.
    • Самый распространенный стандарт Библиотека C для ядра Linux - это библиотека GNU C (glibc), на которую распространяется Стандартная общественная лицензия ограниченного применения GNU (LGPL), также являющаяся лицензией с авторским левом. В отличие от GPL, LGPL явно разрешает динамическое связывание, но не позволяет статическое связывание проприетарного программного обеспечения без предоставления исходного кода или объектных файлов с возможностью связывания.
    • permissive Лицензия BSD - это лицензия без авторского лева, которая совместима в обоих направлениях. Лицензированный BSD glibc заменитель мог действовать как слой изоляции между ядром (ядром) с авторским левом и приложениями без авторского лева, и поэтому был выбран Google для своего Bionic в качестве замены glibc.
  • Small размер: Bionic был намного меньше библиотеки GNU C; что более важно, его требования к памяти были (и остаются) намного ниже.
  • Скорость: Bionic был разработан для процессоров с относительно низкими тактовыми частотами.
Поддерживаемые архитектуры

Bionic поддерживает только ядра Linux, но в настоящее время поддерживает архитектуры arm, arm64, x86 и x86-64. Сама платформа требует armv7 с Neon начиная с Marshmallow, хотя Android Native Development Kit (NDK) продолжал поддерживать armv5 (который он называл armeabi) вплоть до NDK r16. NDK по-прежнему поддерживает armv7 как с Neon, так и без него. Исторически в платформе была частичная поддержка SH-4, но никакие устройства никогда не поставлялись, и с тех пор поддержка не прекращалась. NDK никогда не поддерживал SH-4, а поддержка MIPS и MIPS64 была удалена из NDK в r17.

Компоненты

Некоторые части исходного кода libc, такие как stdio, взяты из BSD (в основном OpenBSD ), тогда как другие, такие как реализация pthread была написана с нуля.

Реализация распределителя динамической памяти со временем изменилась. До Lollipop был единственный собственный распределитель памяти, dlmalloc Дуга Ли. Для Lollipop и Marshmallow было две реализации: dlmalloc и jemalloc. jemalloc дает гораздо более высокую производительность, чем dlmalloc, но за счет дополнительной памяти, необходимой для бухгалтерского учета. Большинство устройств использовали jemalloc, но устройства с низким объемом памяти по-прежнему использовали dlmalloc. Для Nougat и более поздних версий на всех устройствах используется jemalloc. Устройства с низким объемом памяти используют конфигурацию jemalloc "svelte ", которая отключает tcache, чтобы почти соответствовать меньшим накладным расходам памяти dlmalloc, сохраняя при этом большую часть скорости jemalloc.

Некоторые 64-битные устройства, такие как Nexus 9, фактически являются устройствами с низким объемом памяти из-за дополнительных требований к пространству для 64-битных указателей и размещения двух зигот. (Zygote - это системная служба Android, которая является родительской для всех процессов приложений Android.)

Источник libm в основном принадлежит FreeBSD., но с оптимизированным ассемблером, предоставленным различными поставщиками SoC.

Динамический компоновщик (и libdl) были написаны с нуля.

Bionic не включает libthread_db (используется gdbserver ), но NDK включает. Платформа Android включает статически связанный сервер gdbserver, поэтому разработчики могут использовать последнюю версию gdb даже на старых устройствах.

В Android нет отдельных libpthread, libresolv или librt - вся функциональность находится в libc. Для libpthread нет попытки оптимизировать для однопоточного случая, потому что приложения находятся в многопоточной среде даже до того, как первая инструкция стороннего кода когда-либо будет запущена.

Платформа Android использует libc ++ для стандартной библиотеки C ++ (в выпусках до Lollipop включительно используется stlport). NDK исторически предлагал stlport и GNU libstdc ++, но они были удалены в NDK r18. Обратите внимание: если какой-либо собственный код в приложении Android использует C ++, весь C ++ должен использовать один и тот же STL. STL не предоставляется ОС Android и должен быть включен в каждое приложение.

Отличия от POSIX

Хотя Bionic стремится реализовать все C11 и POSIX, все еще (по состоянию на Oreo) существует около 70 функций POSIX отсутствует в libc. Существуют также функции POSIX, такие как семейство endpwent / getpwent / setpwent, которые неприменимы к Android, поскольку в нем отсутствует база данных passwd. Начиная с Oreo, libm завершена.

Некоторые функции намеренно не соответствуют стандартам POSIX или C по соображениям безопасности, например, printf, который не поддерживает строку формата % n.

Многие из наиболее часто используемых расширений GNU реализованы в Bionic, как и различные расширения BSD.

Связь с NDK

Код платформы напрямую использует Bionic, но сторонние разработчики используют Android Native Development Kit (NDK). Многие сторонние разработчики по-прежнему нацелены на более старые выпуски ОС, что способствует широко распространенному мнению, что в бионике не хватает многих функций. Gingerbread экспортировал 803 функции из libc, но Oreo экспортирует 1278 (увеличение в 1,6 раза).

Исторически NDK и платформа расходились, но NDK r11 и более поздние версии заменили вилки NDK своей текущей платформой. эквиваленты. Первоначально эта работа была сосредоточена на компиляторах GCC и Clang.

До NDK r14, когда «унифицированные» заголовки были впервые предложены на основе согласия, NDK создавал копии заголовков платформы для разных уровней API. Это означало, что исправления только для заголовков (например, исправления для определений констант или структур) были недоступны для большинства пользователей NDK, потому что они были нацелены на более старый уровень API, но исправления платформы входили только в текущие заголовки платформы. В период разработки Oreo заголовки платформы были аннотированы информацией об уровне API, так что один и тот же набор заголовков можно было использовать для всех уровней API, при этом были видны только те функции, которые доступны на целевом уровне API разработчика. Это так называемые «унифицированные» заголовки, которые используются по умолчанию с NDK r15.

До NDK r16 NDK связывал библиотеку libandroid_support.a с кодом, использующим libc ++. Это предоставило функции, необходимые для libc ++, которых не было в старых выпусках ОС. Это был не тот код, который использовался платформой, и он приводил к многочисленным ошибкам (например, нарушение позиционных аргументов семейства printf в любом коде, который использовал libc ++). В NDK r16 libandroid_support.a все еще существует, но теперь создается непосредственно из исходных кодов платформы (текущих на момент сборки NDK).

Fortify source

Начиная с Android Jelly Bean MR1 (4.2), Bionic поддерживает функциональность, аналогичную функции _FORTIFY_SOURCEв glibc, где небезопасные строковые функции и функции памяти (такие как strcpy (), strcat ()и memcpy ()) включают проверки на переполнение буфера. Эти проверки выполняются во время компиляции, если размеры буфера могут быть определены во время компиляции, или во время выполнения в противном случае. Поскольку fortify полагается на поддержку среды выполнения со стороны libc, его переносимость на более старые версии Android ограничена. Сама платформа построена с включенным _FORTIFY_SOURCE.

Исторически одним из недостатков fortify было то, что он тесно связан с GCC, из-за чего его очень сложно поддерживать в других компиляторах, таких как Clang. Это означало, что когда Android перешел на Clang в качестве компилятора по умолчанию, реализация fortify от Bionic стала существенно менее полезной. В Android Oreo (8.0) функция Bionic fortify была переработана с учетом Clang, в результате чего fortify на Clang предоставил возможности наравне с fortify на GCC. После этого капитального ремонта, помимо glibc, были добавлены некоторые проверки, чтобы отловить код, который, хотя и не обязательно вызывает неопределенное поведение, явно неверен. Поскольку эта новая реализация не требует большей поддержки libc, чем предыдущая, специфичные для Clang улучшения доступны для приложений, ориентированных на версии Android до Oreo.

Споры

Для создания Bionic компания Google использовала файлы заголовков ядра Linux под лицензией GPLv2. Чтобы избавиться от GPL, Google заявил, что очистил файлы заголовков от любой работы, защищенной авторским правом, уменьшив их до "фактов", не защищенных авторским правом. Создатель Linux Линус Торвальдс считал поведение Google приемлемым, но интерпретация Google GPL была оспорена, например, Раймондом Ниммером, профессором права в Юридическом центре Хьюстонского университета.

См. также
  • icon Портал компьютерного программирования
  • Портал бесплатного программного обеспечения с открытым исходным кодом
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-12 06:53:16
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте