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与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++的限制,其他可以被绕过。