移植Busybox到Android平台

 Busybox想必大家都很熟悉,但是其是基于glibc/uclibc开发,而android采用bionic,另外dns有特殊处理。在android的移植,实际上已经有人做过了,比如https://github.com/CyanogenMod.
但是他的移植不够好,主要有两点:
1. 基于eclair的,虽然在froyo下没什么问题。比如froyo下的bionic实际上已经有了regex了,而他依然选择第三方库的。此外种种,不一而足。
2. 无法自定义。我们知道,busybox的makefile和linux内核一样,具有高度的可配性,从而生成makefile。
Android.mk需要指定LOCAL_SRC_FILES,虽然有LOCAL_GENERATED_SOURCES,但是还是不够灵活。为此,本人增加了一些补丁,来动态获取source.

实际上之前的移植和这相关,是定义gcc的cflags等环境变量,然后生成busybox,和agcc有点类似。
后来本人改为采用Android.mk这种方式了。经历一段时间后,终于基本完成。

在默认defconfig下,仍然有一些无法编译,本人也不想支持这些,所以不会再打补丁。
比如init, syslogd, loginutils,及rpc服务,共享内存,utmp/wtmp的几个。
考虑到这些基本在android里基本没有用,就直接去除了。
禁用的选项请参考Android.in。

不再多说,如果各位有心,请关注以下网址:
http://github.com/liudongmiao/busybox-android

另外,对bionic的要求是froyo以上,虽然里面有支持eclair,但只限于动态链接的情况。
目前静态链接编译bionic后,大约800多k,比起之前用glibc静态链接1.8M,已经很小很小了。

其实上面已经分析过移植busybox的两种可能。
一是使用busybox里内建的makefile,比如你使用make menuconfig,但是编译时需要指定很多环境变量。
二是重新写适合busybox编译的Android.mk,然后直接运行make APP-busybox就可以了。

现在这里说一下运行我这个的方式:
1. 请确保bionic是eclair+的版本,最好是froyo或master (本人只在froyo下测试)
2. 默认使用静态链接,如果目标平台是eclair并要支持动态链接,请... (呃,真的有必要说方法么,哈?)

shell>> make APP-busybox
这个将使用默认的config,即defconfig,如果需要修改,请这样运行:
1. 到busybox目录下运行make O=/path/to/busybox_intermediates menuconfig (生成config)
然后运行make APP-busybox

你可能感兴趣的:(android,shell,regex,平台,makefile,linux内核)