Android4.4添加busybox 支持——基于Android Bionic库
2015-01-04 11:11
495 查看
Android 的toolbox没有自动补齐,命令少,对于开发人员还是需要busybox,直接移植官方的busybox会有很多问题,这里简单阐述cyanogenmod提供的针对android bionic 库的android源码的移植及添加方法,方便大家开发使用。
Android并没有采用glibc作为C库,而是采用了Google自己开发的Bionic Libc,它的官方Toolchain也是基于Bionic Libc而并非glibc的。与glibc相比,Bionic Libc有如下一些特点:
Ø 采用BSD License,而不是glibc的GPL License;
Ø 大小只有大约200k,比glibc差不多小一半,且比glibc更快;
Ø 实现了一个更小、更快的pthread;
Ø 提供了一些Android所需要的重要函数,如”getprop”, “LOGI”等;
Ø 不完全支持POSIX标准,比如C++ exceptions,wide chars等;
Ø 不提供libthread_db 和 libm的实现
1. 下载cyanogenmod修改过的busybox源码,并解压到源码external目录
位置:https://github.com/CyanogenMod/android_external_busybox
目录内容如下:
zhangl@Server-AML:~/aml-m8-kitkat/external/android_external_busybox-cm-12.0$
2. 编译busybox并修正编译错误:
先在android源码根目录执行:source build/envsetup.sh ---> lunch k200
进入目录:external/[b]android_external_busybox-cm-12.0/[/b]
执行:mm(单独编译模块)
3. 编译过程中遇到一个问题
Android4.4源码目录下Android.mk里
BIONIC_ICS := true
问题描述:busybox/networking/ntpd.c:1458: undefined reference to `adjtimex'
出错原因:bionic中没有定义adjtimex,stime,swapon,swapoff,sysinfo,getsid等函数。
解决方法:修改Android.mk,增加 CYANOGEN_BIONIC:=true
4. 安装、创建busybox shell 链接打包:
编译通过,依据Android.mk中的变量 LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities 可知,编译出来目标文件busybox在out/target/product/$(platform_name)/utilities/目录下;
进入out/target/product/$(platform_name)/utilities/目录下,创建链接便于进入busybox shell环境,执行:ln -s busybox ash,将busybox 和 ash 一起复制到system/bin/目录下,一起打包进文件系统system.img(链接文件和链接目标文件必须一起打包);
5. 烧录到产品板使用:
usb 或adb connect 之后,adb shell ,之后执行ash 即可进入busybox shell,操作就和pc的linux环境差不多了,可以使用tab键自动补齐,和其他一些busybox的命令;
[b]zhangl@Server-AML:~/aml-m8-kitkat$ adb shell[/b]
# ash
6. 其它编译问题:
问题1描述:In file included from external/busybox/coreutils/df.c:25: bionic/libc/include/mntent.h:48: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'struct'
解决方法:在出错的文件中,包含头文件stdio.h。
例如在df.c中增加#include <stdio.h>
类似的编译出错的文件可能会有:coreutile/df.c util-linux/mount.c util-linux/umount.c
问题2描述: external/busybox/shell/ash.c:12714: error: 'rlim_t' undeclared (first use in this function)
原因分析:使用的是早期的Android版本,其中rlim_t没有定义。
解决方法:在bionic/libc/include/sys/resource.h中增加
typedef unsigned long rlim_t;
typedef unsigned long rlim_t;
Android并没有采用glibc作为C库,而是采用了Google自己开发的Bionic Libc,它的官方Toolchain也是基于Bionic Libc而并非glibc的。与glibc相比,Bionic Libc有如下一些特点:
Ø 采用BSD License,而不是glibc的GPL License;
Ø 大小只有大约200k,比glibc差不多小一半,且比glibc更快;
Ø 实现了一个更小、更快的pthread;
Ø 提供了一些Android所需要的重要函数,如”getprop”, “LOGI”等;
Ø 不完全支持POSIX标准,比如C++ exceptions,wide chars等;
Ø 不提供libthread_db 和 libm的实现
1. 下载cyanogenmod修改过的busybox源码,并解压到源码external目录
位置:https://github.com/CyanogenMod/android_external_busybox
目录内容如下:
zhangl@Server-AML:~/aml-m8-kitkat/external/android_external_busybox-cm-12.0$
2. 编译busybox并修正编译错误:
先在android源码根目录执行:source build/envsetup.sh ---> lunch k200
进入目录:external/[b]android_external_busybox-cm-12.0/[/b]
执行:mm(单独编译模块)
3. 编译过程中遇到一个问题
Android4.4源码目录下Android.mk里
BIONIC_ICS := true
问题描述:busybox/networking/ntpd.c:1458: undefined reference to `adjtimex'
出错原因:bionic中没有定义adjtimex,stime,swapon,swapoff,sysinfo,getsid等函数。
解决方法:修改Android.mk,增加 CYANOGEN_BIONIC:=true
4. 安装、创建busybox shell 链接打包:
编译通过,依据Android.mk中的变量 LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities 可知,编译出来目标文件busybox在out/target/product/$(platform_name)/utilities/目录下;
进入out/target/product/$(platform_name)/utilities/目录下,创建链接便于进入busybox shell环境,执行:ln -s busybox ash,将busybox 和 ash 一起复制到system/bin/目录下,一起打包进文件系统system.img(链接文件和链接目标文件必须一起打包);
5. 烧录到产品板使用:
usb 或adb connect 之后,adb shell ,之后执行ash 即可进入busybox shell,操作就和pc的linux环境差不多了,可以使用tab键自动补齐,和其他一些busybox的命令;
[b]zhangl@Server-AML:~/aml-m8-kitkat$ adb shell[/b]
# ash
6. 其它编译问题:
问题1描述:In file included from external/busybox/coreutils/df.c:25: bionic/libc/include/mntent.h:48: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'struct'
解决方法:在出错的文件中,包含头文件stdio.h。
例如在df.c中增加#include <stdio.h>
类似的编译出错的文件可能会有:coreutile/df.c util-linux/mount.c util-linux/umount.c
问题2描述: external/busybox/shell/ash.c:12714: error: 'rlim_t' undeclared (first use in this function)
原因分析:使用的是早期的Android版本,其中rlim_t没有定义。
解决方法:在bionic/libc/include/sys/resource.h中增加
typedef unsigned long rlim_t;
typedef unsigned long rlim_t;
相关文章推荐
- Android2.2添加busybox 支持——基于Android Bionic库
- 在s5pv210开发板的android平台上添加busybox的支持[基于x210开发板]
- 支持上下拉刷新的RecycleView,基于androidPullToRefresh,添加RecycleView HeaderView
- 添加字体与字符集locale支持(基于busybox文件系统)
- 在Android C/C++层添加LOG调试(LOGI\LOGD\LOGE...)输出支持
- 在android下添加DLNA的支持的相关笔记
- [VC]基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)
- 给android添加busybox
- 基于Android Bionic 库动态编译busybox
- Android源码中添加Livewallpapers(动态墙纸)的支持
- 在Android系统中添加对新遥控器按键的支持
- 基于rtsp的手机视频点播实现和研究(扩展支持android, ios平台)
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(6):为网站添加Silverlight支持.zip(6.31 MB)
- 在Android C/C++层添加LOG调试(LOGI\LOGD\LOGE...)输出支持 开花结果
- 在Android C/C++层添加LOG调试(LOGI\LOGD\LOGE...)输出支持 开花结果
- android平台busybox的终极解决方案---基于x210开发板
- 给android里添加busybox
- 基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)
- 为Eclipse ADT创建的android项目通过ant添加proguard混淆支持(转载)