Android bionic和GNU glibc
安卓运行的是bionic而非glibc。Bionic是标准C库的实现,由谷歌为其Android操作系统开发。它与GNU C库(glibc)(运行在标准linux发行版上)的不同之处在于,它是为内存和处理器能力低于典型linux系统的设备设计的。android也不包括你在典型的Linux发行版上找到的所有GNU库。它也不包括像Xorg这样的X服务器,所以您不能运行标准的图形Linux应用程序。
这意味着所有为标准linux编译的库都不能与android一起使用,除非你将它们与android NDK交叉编译以使用bionic。这似乎已经有很多工作要做了,而且根本不能保证openpilot使用的所有库都可以使用arm架构的bionic 进行编译。问题不在于arm体系结构,它得到了广泛的支持,标准x86-linux发行版上几乎所有可用的库也可用于arm。主要问题是bionic。几乎没有一个库是基于bionic预编译的。
总结
libc 是一个标准。GNU C(glibc)是基于libc标准的一个实现,然后GNU编译工具链中默认基础这种glibc库,所以当你使用window编译C语言、Ubuntu编译C语言、交叉编译器编译C语言的时候,默认会链接glibc库。所以你能够跨多个平台使用printf、fopen之类的函数。
bionic也是基于libc标准的一个实现,它不在GNU这样的编译工具链中,它是Google专门为android基于libc重新的一个实现。它在android NDK编译工具链中。
在ubuntu、window图像界面的系统中,底层是Linux Kernel或其它内核,内核中支持libc,所以上层就支持glibc,也能支持bionic。
然而在ubuntu、window图像界面的系统中,在上层有很多其它各种各样的库的,这些库会依赖glibc。所以你就无法把ubuntu、window的一些上层应用移植到Android上
对于TEE系统,你肯定是十分好奇,它支持glibc吗?他支持libc吗?如何支持?
由于tee内核是不支持libc的,所以上层你就无法去支持glibc或bionic。
例如optee,虽然不支持libc,但他独创了一种,它支持libutee。但这一块并没有标准,每家TEE都需要独自实现自己的C库。
不过还好了,在TEE的开发概念中,不必关心C库的支持情况,只需关心是否支持GP API。