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

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

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

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

Оригинальные цели

Первоначально публично заявленные цели Bionic были следующими:[4][5]

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

Поддерживаемые архитектуры

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

Составные части

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

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

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

В libm источник в основном FreeBSD 's, но с оптимизированным ассемблером, внесенным различными 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.[10] Обратите внимание: если какой-либо собственный код в приложении Android использует C ++, весь C ++ должен использовать одно и тоже STL. STL не предоставляется ОС Android и должен быть включен в каждое приложение.

Отличия от POSIX

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

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

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

Отношение к НДК

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

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

До 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).

Укрепите источник

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

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

Споры

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

Смотрите также

Рекомендации

  1. ^ «Представляем Android 1.0 SDK, выпуск 1». 9 сентября 2008 г. Архивировано с оригинал 19 сентября 2015 г.. Получено 21 сентября, 2012.
  2. ^ а б «Анатомия и физиология Android» (PDF). Google I / O. 2008-05-28. Архивировано из оригинал (PDF) на 2016-04-08. Получено 2014-05-23.
  3. ^ "Библиотека C Android содержит 173 файла с неизмененным кодом OpenBSD". Получено 8 октября 2018.
  4. ^ Бернетт, Эд (4 июня 2008 г.). «Патрик Брэди анализирует Android». ZDNet.
  5. ^ Тернер, Дэвид (2007-02-07). «Вопросы о Bionic». Название "Bionic" происходит от того факта, что это частично BSD и частично Linux: его исходный код состоит из смеси частей библиотеки BSD C с пользовательскими битами, специфичными для Linux, которые используются для работы с потоками, процессами, сигналами и некоторыми другими. другие вещи.
  6. ^ Анатомия и физиология Android (PDF), п. 36, заархивировано из оригинал (PDF) на 2016-04-08, получено 2017-07-15, Лицензия: мы хотим, чтобы GPL не попадала в пользовательское пространство
  7. ^ Флориан Мюллер. «Патенты FOSS».
  8. ^ «Определение совместимости с Android 6.0».
  9. ^ «Зигота». Анатомия Android. Архивировано из оригинал на 2016-03-15. Получено 2016-03-14.
  10. ^ https://developer.android.com/ndk/downloads/revision_history
  11. ^ а б «Бионический статус Android».
  12. ^ Эллиот Хьюз. "libc: #define, чтобы удалить поддержку% n из printf (3)?".
  13. ^ "Жевательные конфеты". Разработчики Android. android.com. Получено 2013-12-27.
  14. ^ «Android 4.2 и FORTIFY_SOURCE». Обсуждения безопасности Android. Получено 2013-12-27.
  15. ^ "Журнал изменений Android NDK". Android NDK. android.googlesource.com. Получено 2017-08-28.
  16. ^ «FORTIFY в Android». Блог разработчиков Android. android-developers.googleblog.com. Получено 2017-08-28.
  17. ^ Заголовки Google android и linux на theregister.com (2011)
  18. ^ а б Android: предъявлен иск Microsoft, а не Linux «Microsoft запускает новый Android-костюм, Линус Торвальдс - заголовки ядра Linux и Android» на ITworld (21 марта 2011 г.)
  19. ^ Риск нарушения и раскрытия информации при разработке платформ с авторским левом на ipinfoblog.com Рэймондом Ниммером (2011)

внешняя ссылка