Jump to content

Бионический (программное обеспечение)

Bionic — это реализация стандартной библиотеки C , разработанная Google для Android операционной системы . Она отличается от библиотеки GNU C (glibc) тем, что разработана для устройств с меньшим объемом памяти и мощностью процессора, чем типичная система Linux . Это комбинация нового кода и кода из FreeBSD , NetBSD и OpenBSD, выпущенного под лицензией BSD , а не glibc, которая использует GNU Lesser General Public License . Это различие было важно на заре Android, когда статическое связывание было обычным явлением, и поскольку у Bionic есть собственный двоичный интерфейс приложений , его нельзя было заменить другой libc, не нарушив работу всех существующих приложений.

Bionic — это библиотека C для использования с ядром Linux , которая предоставляет libc , libdl и libm ( функциональность libpthread является частью libc , а не отдельной библиотекой, как в некоторых других системах). Это отличается от библиотек BSD C, с которыми Bionic использует общий код, поскольку для них требуется ядро ​​BSD .

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

[ редактировать ]

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

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

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

[ редактировать ]

Bionic поддерживает только ядра Linux, но в настоящее время поддерживает архитектуры Arm, Arm64, riscv64, x86 и x86-64. Сама платформа требовала Armv7 с Neon начиная с Marshmallow , [5] хотя Android Native Development Kit (NDK) продолжал поддерживать Armv5 (который назывался Armeabi) вплоть до NDK r16. NDK по-прежнему поддерживает Armv7, хотя NDK r24 отказался от поддержки не-Neon. существовала частичная поддержка SH-4 Исторически на платформе , но устройства никогда не поставлялись, и с тех пор поддержка была прекращена. NDK никогда не поддерживал SH-4, а поддержка MIPS и MIPS64 была удалена из NDK в версии 17.

Компоненты

[ редактировать ]

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

Реализация распределителя динамической памяти со временем изменилась. До Lollipop существовал единственный встроенный распределитель памяти — dlmalloc Дуга Ли . Для Lollipop и Marshmallow существовало две реализации: dlmalloc и jemalloc . jemalloc обеспечивает гораздо более высокую производительность, чем dlmalloc, но за счет дополнительной памяти, необходимой для бухгалтерского учета. Большинство устройств использовали jemalloc, но устройства с малым объемом памяти по-прежнему использовали dlmalloc. Для Nougat и Android 10 все устройства используют jemalloc. Устройства с малым объемом памяти используют «утонченную» конфигурацию jemalloc, которая отключает tcache, чтобы почти соответствовать меньшим затратам памяти на dlmalloc, сохраняя при этом большую часть скорости jemalloc. В Android 11 распределитель памяти для большинства устройств был переключен на Scudo, что принесло в жертву часть высокой производительности jemalloc ради дополнительных функций усиления безопасности. [6] Однако устройствам с малым объемом памяти по-прежнему разрешено использовать jemalloc. [7]

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

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

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

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

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

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

Отличия от POSIX

[ редактировать ]

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

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

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

Отношения с НДК

[ редактировать ]

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

Исторически 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 по r25, libandroid_support.a все еще существовал, но был собран непосредственно из исходного кода текущей платформы на момент сборки каждого NDK. Из NDK r26 файл libandroid_support.a исчез, поскольку все версии ОС, которые по-прежнему поддерживаются NDK, содержат все необходимое для libc++.

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

[ редактировать ]

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

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

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

См. также

[ редактировать ]
  1. ^ Бернетт, Эд (4 июня 2008 г.). «Патрик Брейди препарирует Android» . ЗДНет .
  2. ^ Тернер, Дэвид (7 февраля 2009 г.). «Вопросы о Бионике» . Название «Bionic» происходит от того факта, что это частично BSD и частично Linux: его исходный код состоит из смеси частей библиотеки BSD C со специальными битами, специфичными для Linux, которые используются для работы с потоками, процессами, сигналами и некоторыми другие вещи.
  3. ^ Анатомия и физиология Android (PDF) , стр. 36, заархивировано из оригинала (PDF) 08 апреля 2016 г. , получено 15 июля 2017 г. , Лицензия: мы хотим, чтобы GPL не попадала в пользовательское пространство.
  4. ^ Флориан Мюллер. «Патенты ФОСС» .
  5. ^ «Определение совместимости Android 6.0» .
  6. ^ «Усиление защиты системы в Android 11» . Блог разработчиков Android . Проверено 20 декабря 2020 г.
  7. ^ «Скудо» . Проект Android с открытым исходным кодом . Проверено 20 декабря 2020 г.
  8. ^ «Зигота» . Анатомия Android . Архивировано из оригинала 15 марта 2016 г. Проверено 14 марта 2016 г.
  9. ^ «История изменений NDK | Android NDK» .
  10. ^ Jump up to: а б «Бионический статус Android» .
  11. ^ Эллиот Хьюз. "libc: #define для удаления поддержки %n из printf(3)?" .
  12. ^ «Примечания к выпуску Android 4.2 Jelly Bean» . Android-разработчики . android.com . Проверено 27 декабря 2013 г.
  13. ^ «Android 4.2 и FORTIFY_SOURCE» . Обсуждения безопасности Android . Проверено 27 декабря 2013 г.
  14. ^ «Журнал изменений Android NDK» . Андроид НДК . android.googlesource.com . Проверено 28 августа 2017 г.
  15. ^ «УКРЕПЛЕНИЕ в Android» . Блог разработчиков Android . android-developers.googleblog.com . Проверено 28 августа 2017 г.
  16. ^ Google android и заголовки Linux на theregister.com (2011)
  17. ^ Jump up to: а б Android: подан иск от Microsoft, а не от Linux. Архивировано 13 января 2016 г. на Wayback Machine «Microsoft запускает новый пакет Android, взгляд Линуса Торвальдса на заголовки ядра Linux и Android» на ITworld (21 марта 2011 г.).
  18. ^ Риск нарушения прав и раскрытия информации при разработке платформ с авторским левом на ipinfoblog.com, Раймонд Ниммер (2011).
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 15d4591373f396129702957c6d035ef5__1721270880
URL1:https://arc.ask3.ru/arc/aa/15/f5/15d4591373f396129702957c6d035ef5.html
Заголовок, (Title) документа по адресу, URL1:
Bionic (software) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)