一、核心思想:簡單化
即C庫應該只提供對內核功能的輕量級封裝,不應該過於智能化,考慮太多的邊界條件。
Bionic這個詞表明它一部分來自BSD,一部分來自Linux。它的源碼主要是BSD C庫的代碼片段,加上一些Linux相關的比特位,用來處理線程、信號等問題。
二、架構
Bionic目前支持x86和arm指令集。理論上講,可以支持更多的架構,不過需要做一些工作。
三、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內核頭文件。當發現無效的系統調用號時,就會報告錯誤。
四、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。
五、時區管理
當前時區的名字取自 TZ 環境變量(如果定義了 TZ 變量)。
如果沒有定義 TZ 環境變量,則檢查名爲 persist.sys.timezone 的系統屬性。
時區信息數據庫和索引文件位於 /system/usr/share/zoneinfo, 而不是 /usr/share/zoneinfo(POSIX規範定義的)
六、Linux內核頭文件
七、pthread實現
八、多核支持
九、Android相關特性
十、二進制兼容性
十一、動態鏈接器
十二、C++異常
十三、System V IPC
十四、include 路徑
Android 編譯系統會自動提供C庫頭文件的include路徑。如果想自己指定,可以把這些路徑加入C庫的include路徑:
libc/arch-$ARCH/include
libc/include
libc/kernel/common
libc/kernel/arch-$ARCH