Bionic簡介


1. 什麼是Bionic

Bionic是Android平臺爲C/C++開發者進行原生應用程序開發所提供的符合POSIX(可移植操作系統接口)標準的C庫。

是Android操作系統BSD(UNIX操作系統中的一個分支)標準C庫的衍生庫。

Bionic提供了在Android平臺上開發任何類型的功能性原生代碼所需的最小構造集。

通俗地講,Bionic(Bionic的頭文件集)就是NDK的API

Bionic C庫頭文件在 %NDK_HOME%\platforms\android-<api-level>\arch-<architecture>\usr\include內

其他的C標準庫

只要是符合ANSI(美國國家標準學會) C標準的C庫都可以叫做標準C庫。

POSIX標準的C庫是在ANSI標準的C庫的基礎上增加一些附加結構。

現有的著名的POSIX標準的C庫有:GUN C庫(glibc)和Embedded Linux C庫(uClibc)。

注意,Bionic C庫不以任何方式與其他標準C庫二進制兼容,這意味着基於其他C庫生成的二進制文件不應該與Bionic進行動態鏈接。

注意,雖然Android只提供Bionic C庫,但是基於其他符合POSIX標準C庫生成的應用,無可爭議地可以在Android上面運行(因爲Android本身是支持POSIX標準的)。

2. 爲什麼要Bionic?

google自己搞的bionic libc來替代glibc想來是有原因的,本來glibc也是lgpl,應該也沒有版權問題,但是系統調用的接口有限,google應該是用自己的bionic libc來暴露出更多的系統調用接口,系統調用不屬於GPL,這樣纔有可能讓上層有更大的權限去操作底層驅動,這樣硬件廠商就可以將有關商業利益的代碼放到HAL層(hardware  abstraction layer),底層驅動層只要提供操作接口,這種代碼在內核公開出來也無所謂,主要的業務邏輯仍然在HAL層以二進制或者庫的形式存在,雖然放到了用戶空間,但這纔是正真的驅動,也正好避開了GPL感染性,其實主要是顯示先關的芯片有這個需求。
3. Bionic的核心思想:簡單化

即C庫應該只提供對內核功能的輕量級封裝,不應該過於智能化,考慮太多的邊界條件。

Bionic這個詞表明它一部分來自BSD,一部分來自Linux。它的源碼主要由BSD C庫的代碼片段和自定義的linux代碼(用於處理線程,進程,信號,和其他事情)混合而成。所有原始的BSD塊,遵循BSD版權聲明。特定的Bionic部分遵循Android open source project版權聲明。

一切發行版都遵循BSd版權

4. 架構

Bionic目前支持x86和arm指令集。理論上講,可以支持更多的架構,不過需要做一些工作。比如,向SYSCALLS.TXT文件中添加系統調用IDS,如下面所述,或者修改動態鏈接器)。

ARM相關代碼在arch-arm/下面,x86相關代碼在arch-x86下面。

注意,x86版本只能運行在x86android設備上。我們並沒有聲明說,你能夠在普通 x86 linux發佈版上使用Bionic,(儘管這會很,因此歡

迎大家做這樣的補丁程序);

5. Bionic主要內容

Bionic提供了:C標準庫宏、類型定義、函數,以及少數Android特有特性。

從功能角度Bionic提供了:

內存管理

文件輸入/出

字符串操作

數學

日期和時間

進程控制

信號處理

網絡套接字

多線程

用戶和組

系統配置

命名服務切換


6. 幾個知識點

1)Syscall stub

每個系統調用函數都是用一段小型彙編碼(即 syscall stub)實現的,這些 syscall stub 是由 tools/gensyscall.py 通過讀取 SYSCALL.html 生成的。

SYSCALL.html 包含要生成的 syscall stub ,相應的系統調用號(x86與arm不同),及相應的簽名。

如果你想修改SYSCALL.html,可以利用 tools/checksyscalls.py 來比較SYSCALL.html 和 Linux內核頭文件。當發現無效的系統調用號時,就會報告錯誤。

2)time_t 和 off_t

在32位CPU上,Linux內核定義 time_t 爲 32位。但是將 time_t 定義爲 64位或許更好,因爲可以解決 bug Y2038。但是Linux內核維護人員Y2038不緊急,所以time_t依然是32位。

但是,Bionic提供了time64.h 這個頭文件,定義了 time64_t 類型,和相應的函數 mktime64()、localtime64() 等。

off_t 也是 32 位的,Bionic中定義了 loff_t 類型(64位),從而做到兼容BSD, 它被typedef 爲 off64_t,兼容Linux。

3)時區管理

當前時區的名字取自 TZ 環境變量(如果定義了 TZ 變量)。

如果沒有定義 TZ 環境變量,則檢查名爲 persist.sys.timezone 的系統屬性。

時區信息數據庫和索引文件位於 /system/usr/share/zoneinfo, 而不是 /usr/share/zoneinfo(POSIX規範定義的)


參考資料:
1. http://blog.csdn.net/yongyu_it/article/details/52574797
2. http://blog.csdn.net/smfwuxiao/article/details/8521095
3. http://m.blog.csdn.net/article/details?id=13997183




發佈了12 篇原創文章 · 獲贊 44 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章