ndk编译内核
‘壹’ 关于android和x86的几点疑问。 android基因linux内核,系统除了内核还有其他什么
android 除了基于 Linux 内核,他的上层运行环境和相关函数库,命令程序都是自己的。
其实 android 就是一个基于 Linux 内核的 JAVA 虚拟机环境。
实际 Android 程序都是基于 JAVA 虚拟机跑的解释型语言程序。
但解释型语言程序性能肯定不如本地二进制程序。所以 Android 还有一种 NDK 程序。
也就是 Android 里面有部分本地二进制程序的内容。这样本地程序方式运行,效率可以最高而且可以根据 CPU 功能做优化(比如 neon )。
指令集不同,但他的 JAVA 虚拟机是解释型语言,基于 JAVA 语言的程序是可以无差别运行的。只要能保证 Android 上面的 JAVA 虚拟机可以在 x86 上面成功运行就行了。
但 Android 有个另外的问题,就是 JAVA 虚拟机是针对 ARM 做性能优化的,在 X86 上面,这种性能优化都没了,需要另外在 x86 上面重新优化。但听说 Android 的 JAVA 虚拟机的语言里面,也有针对 ARM 硬件进行的修改设计,所以这种针对 ARM 性能优化的 JAVA 程序,在 X86 的系统上面性能也有损失。
所以 Android 出来很久后,在 x86 上面的运行效率都一直不怎么样。
而且现在还有 NDK 程序的出现, ARM 的二进制程序在 x86 上面是不能运行的。这些程序都不能运行。
不过 x86 有个优势就是自己的性能很强,而且模拟器技术现在也很强了。在 x86 上面,可以借助虚拟机(qemu 的 user mode 就值得看看)来运行 ARM 的二进制程序。
不过虚拟机其实还是有性能损失的。
所以未来,Android 的跨 CPU 架构依然还是问题。纯 JAVA 程序好说,用了 NDK 的程序就是问题了。
不过 llvm 这个编译器又给了另外一条路,既可以虚拟机方式运行,又可以编译成本地程序而成为二进制程序来优化性能运行。或许 Android 会考虑使用这种方法或者类似的让 NDK 程序可以跨 CPU 实现。代价是 Android 要自带一个编译器,体积也不小的。
MAC OS X 还有一种方法。在 MAC 放弃 IBM 的 Power CPU 而改用 Intel 的 CPU 后,他的程序都是里面附带两套二进制程序,老的 G4 CPU 的机器,就用程序里面的 power 指令集的程序代码。新的 Intel CPU 的机器,就自动用里面的 x86 指令来运行程序。从而实现完美的双指令集运行。不过代价是这样的程序都是两套指令集的内容,体积翻倍。
目前来说,似乎用了 NDK 的程序还都不能用的。不排除现在某些 x86 的手机,使用了虚拟机技术来实现运行 NDK 程序。现在 Linux 下面的 qemu 的 usermode 配合内核的 binfmt_misc 功能,可以让系统自动识别某个架构的程序,去调用 qemu 来执行。
‘贰’ 如何从android源码中编译webkit
android本来自带了webkit浏览器,但是要对其进行custom就需要android源代码才行, 但是在没有源码的情况下,那么就需要用到ndk了,比如,我是在xoom上做custom webkit的。
1、虽然ndk提供的库很少,而且没有skia,但是好在有bitmap,这样显示慢了点,没有硬加速,但不是不可能。
2、webkit需要的第三方库,freetype,png,jpeg,sqlite3等虽然android源码中有,但是ndk没有开放,因此所有的第三方库,freetype,png,jpeg,sqlite3,cairo,curl,fontconfig,pixman,iconv等都需要用ndk cross-compile成静态库,然后链接到最终的动态库中。
3、选择iconv是icu太大,而且没有多语言的需求,选择cairo+pixman是skia的移植性不好,而且cairo支持很多种backend。
4、编译第三方库需要用到autoconfig,ndk中有如何生成交叉编译链的文档,然后在configure时使用这个工具链就可以了,但是android用到的是bionic库,因此会有很少的地方需要修改,有些库也不能生成test程序,但是静态库是没问题的。
5、利用ndk生成的交叉工具链,在加上webkit自带的cmake编译系统,生成webkit的动态库是没有问题的,当然是webkit的内核,而且有些平台相关的部分代码需要修改。
6、但是只要是以linux平台为基础,修改还是很容易的,我移植的webkit是先移植到linux平台上,然后移植到android平台上的,所以修改相对少了很多,但是修改大多都在WebCore/platform下,在选择了的平台相关库后,做相应的配置和修改。
7、其次是在WebKit目录,这个主要是支持和使用WebCore,因此在需求不是整个浏览器,而只是正常地显示网页时,还是可以写的比较简单的。
‘叁’ android为什么不直接执行linux的程序而是自己搞一套
安卓系统可以执行Linux程序,其基于Linux内核,底层实现依靠Linux ELF可执行文件。然而,安卓系统并不直接运行传统的基于glibc的Linux软件。
谷歌为了实现商业目的,移除了包括glibc在内的遵守(L)GPL许可的组件,自行开发了名为bionic的运行库。实际上,bionic库本质上是libc的一种实现,适用于手机等小型设备,且Android NDK亦使用bionic库进行编译。
此外,安卓系统本身的文件系统存在限制,同样限制了Linux软件的安装与使用。尽管如此,运行Linux软件仍有替代方案,例如Linux容器。通过Termux等软件,可以实现Linux软件的运行,其自带常见Linux软件,通过apt/pkg命令进行安装。
尽管Termux自带软件不够丰富,但chroot和proot等容器构建方案提供了更多可能性。利用这些方案,可以在安卓系统上运行Linux发行版,实现更丰富的功能,甚至运行Windows软件。
Linux容器存在一些局限性,如无法使用systemd(因无法确保init的PID为1)以及无法调用某些硬件。然而,可以通过曲线救国的方式解决这些问题,如通过x11转发实现画面输出,声音输入输出借助pulseaudio,GPU渲染借助virglrenderer(需挂载/tmp目录到termux的tmp目录)等。
理论上,静态编译的程序可在安卓平台直接使用,因为静态编译不依赖动态库,可独立运行。例如,qemu经过静态编译后,可在安卓平台借助终端模拟器直接运行,但功能上会有所缺失。
‘肆’ android内核源代码有多大
每个版本的源代码不同,几百兆到几G不等。
Android是一种基于Linux的自由及开放源桥袜代码敏弊激的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主卜颂要支持手机。