Android Bionic

Bionic是什么

Bionic是Android平台为了使用C/C++进行原生应用程序开发所有提供的POSIX标准C库。它是Google为Android操作系统提供的BSD标准C库的衍生库。同时Bionic是专门为移动计算而精心设计的,针对移动设备上有限的CPU周期和可用内存进行了裁剪以提高工作效率。

Bionic兼容性怎么样

Bionic尽管是C标准库,但是它不以任何方式与其它C库二进制兼容。也就是说Bionic和其它C库不兼容,无法进行交叉编译和相互引用。

Bionic提供什么功能

Bionic提供了C标准库,类型定义,函数和少数Android特有的特性。

主要功能可以概括如下:

内存管理

文件输入输出

字符串操作

数学函数

日期和时间

进程控制

信号处理

网络套接字

多线程

用户和组

系统配置

命名服务切换

Bionic还缺什么功能

Bionic是专门为移动计算而精心设计的,所以Bionic不会支持所有C标准库函数。也就是说它是C标准库的一个子集。

如图

Bionic库关系图

Bionic与Glibc

Android 使用Bionic C 而不使用Glibc的最主要原因:

1,有限的空间和存储

2,较低的CPU速度

3,不完全开源

Bionic C 优势

1,去除头文件的相关内容,占用更小的存储

2,规避GPL,有关android GPL一篇非常好的文章

3,占用更小的空间,Bionic 大约 200KB, Glibc 400KB,(去除臃肿的代码以及不必要的功能)

4,低速CPU优化,主要源于对pthread的优化,这也是一个缺点,因为他只专门为低时钟频率的 CPU设计

Bionic C的限制和缺点

c++ (详情见“libc/CAVEATS”)

异常处理 不支持

STL 不支持

Pthreads

Cancellation 不支持

pthread_once() 不支持 初始化函数和初始化函数调用fork()的异常处理

pthread_atfork()函数 不支持

其他项

不支持区域和宽字符,程序员应该使用Unicode

用户账户相关功能,没有真正实现,这是目前只支持单用户的原因

ABI bugs

1.time_t is 32 bit

2.off_t is 32 bit (off64_t is present but no _FILE_OFFSET_BITS support)

3.sigset_t is too small on ARM (android devices) and x86 (but correct on MIPS),

so support for real-time signals is broken

4.Too few TLS slots leading to allocation shortage for pthread_key_t (should be 128, but can’t be reached)

5.atexit(3) handlers registered by a shared library aren’t called on dlclose(3). Only

affects ARM

结论:

Bionic C是一个轻量级的库,有一些限制非常严格,如C++的限制,其他可以被绕过。