|Developer(s)||Open Handset Alliance|
|Initial release||September 23, 2008|
|Platform||x86, x86-64, ARM, ARM64, MIPS, MIPS64|
|Type||C standard library|
|License||3-clause BSD licence|
- The BSD license is a non-copyleft license and Google wished to isolate Android applications from the effects of both the GPL and the LGPL:
- Android is based on the Linux kernel, which is subject to the GNU General Public License (GPL) version 2.
- The most widespread standard C library for the Linux kernel is the GNU C Library (glibc), which is subject to the GNU Lesser General Public License (LGPL); in contrast to the GPL, the LGPL explicitly allows for dynamic linking but it does not allow static linking of proprietary software.
- Small size: Bionic was much smaller than the GNU C Library; more importantly its memory requirements were (and remain) much lower.
- Speed: Bionic was designed for CPUs at relatively low clock frequencies.
Bionic only supports Linux kernels, but currently supports the aarch64, arm, mips, mips64, x86, and x86-64 architectures.
Some parts of the libc source, such as stdio, are from the BSDs (mainly OpenBSD), whereas others, such as the pthread implementation, were written from scratch.
The dynamic memory allocator is usually jemalloc, though it used to be dlmalloc, and still is on some memory-constrained devices; jemalloc gives much higher performance than dlmalloc, but at the cost of extra memory required for bookkeeping. (Interestingly, some 64-bit devices like the Nexus 9 are effectively low-memory devices and use dlmalloc because of the extra space requirements of 64-bit pointers and hosting two zygotes.)
The dynamic linker (and libdl) were written from scratch.
Bionic doesn't include libthread_db (used by gdbserver), but there's one in the NDK; Android uses a statically-linked gdbserver so developers can use the latest gdb even on old devices.
There's no separate libpthread, libresolv, or librt on Android --- the functionality is all in libc. For libpthread, there's no attempt to optimize for the single-threaded case because apps are in a multi-threaded environment even before the first instruction of third-party code is ever run.
The Android platform now uses libc++ for the C++ standard library (releases up to and including Lollipop used stlport). The NDK currently offers stlport, libc++, and the GNU STL.
Differences from POSIX
Although bionic aims to implement all of POSIX, there are still (as of Lollipop) almost 200 functions missing (though the long double complex math functions make up a large chunk of that). There are also POSIX functions such as the endpwent/getpwent/setpwent family that are inapplicable to Android because it lacks a passwd database.
Relationship to the NDK
Platform code uses bionic directly, but third-party developers use the Android Native Development Kit (NDK). Many third-party developers still target Gingerbread, which contributes to a widespread belief that bionic lacks many features (Lollipop's bionic contains more than 200 functions missing from Gingerbread's).
As of Android Jelly Bean MR1 (4.2), bionic supports a growing subset of glibc's
_FORTIFY_SOURCE, which is a feature where unsafe string and memory functions (such as
memcpy()) include checks for buffer overruns when buffer sizes can be determined at compile time. This feature works better with gcc than with Clang, and—because it relies on runtime support from libc—limits portability to older Android releases. The platform itself is built with
- "Announcing the Android 1.0 SDK, release 1". September 9, 2008. Retrieved September 21, 2012.
- "Android Anatomy and Physiology" (PDF). Google I/O. 2008-05-28. Retrieved 2014-05-23.
- Burnette, Ed (June 4, 2008). "Patrick Brady dissects Android". ZDNet.
- Turner, David (2009-02-07). "Questions about Bionic".
The name "Bionic" comes from the fact that it is part-BSD and part-Linux: its source code consists in a mix of BSD C library pieces with custom Linux-specific bits used to deal with threads, processes, signals and a few others things.
- "Jelly Bean". Android Developers. android.com. Retrieved 2013-12-27.
- "Android 4.2 and FORTIFY_SOURCE". Android Security Discussions. groups.google.com. Retrieved 2013-12-27.
- on YouTube
- Developer home page for Android
- Android Native Development Kit (NDK) home page
- Bionic sources (official repository)
- Bionic notes on eLinux.org