Android移植busybox
Android 的toolbox没有自动补齐,命令少,对于开发人员还是需要busybox,直接移植官方的busybox会有很多问题,主要是因为基于Android的交叉编译工具并没有采用glibc作为C库,而是采用了Google自己开发的Bionic Libc,它的官方Toolchain也是基于Bionic Libc而并非glibc的。
与glibc相比,Bionic Libc有如下一些特点:
1> 采用BSD License,而不是glibc的GPL License;
2> 大小只有大约200k,比glibc差不多小一半,且比glibc更快;
3> 实现了一个更小、更快的pthread;
4> 提供了一些Android所需要的重要函数,如”getprop”, “LOGI”等;
5> 不完全支持POSIX标准,比如C++ exceptions,wide chars等;
6> 不提供libthread_db 和 libm的实现
下面简单阐述cyanogenmod提供的针对android bionic 库的android源码的移植及添加方法,方便大家开发使用。
1. 下载cyanogenmod修改过的busybox源码,并解压到源码external/busybox目录
位置:https://github.com/CyanogenMod/android_external_busybox
目录内容如下:

2.编译、配置busybox并修正编译错误:
先在android源码根目录执行:source build/envsetup.sh
进入目录:external/CyanogenMod-android_external_busybox-995d0d3/
1>.执行meke menuconfig
Busybox Settings --->
General Configuration --->
[*] Don't use /usr--> //要选择此项,不然又部分命令会被安装到_install/usr/bin和_install/usr/sbin, busybox-1.18.0中,这项没有用,不管选择与否都会有部分命令安装到_install/usr/bin和_install/usr/sbin。使用busybox-1.17.0就正常,且此项在Build Options中。
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) //使用静态库编译
(arm-eabi-) Cross Compiler prefix //填入交叉编译工具链名,如果不在路径PATH中,可使用绝对路径。
Busybox Library Tuning --->
[*] Tab completion -> //检测此项是否选择,如没有选,就不能使用tab键补全,默认是选择的。
2>.执行source ../../build/envsetup.sh
3>.执行:mm(单独编译模块)
4>.编译错误
问题1:
build/core/base_rules.mk:74: *** Module name: libclearsilverregex
build/core/base_rules.mk:75: *** Makefile location: external/android_external_busybox-gingerbread
build/core/base_rules.mk:76: *
build/core/base_rules.mk:77: * Each module must use a LOCAL_MODULE_TAGS in its
build/core/base_rules.mk:78: * Android.mk. Possible tags declared by a module:
build/core/base_rules.mk:79: *
build/core/base_rules.mk:80: * optional, debug, eng, tests, samples
build/core/base_rules.mk:81: *
build/core/base_rules.mk:82: * If the module is expected to be in all builds
build/core/base_rules.mk:83: * of a product, then it should use the
build/core/base_rules.mk:84: * "optional" tag:
build/core/base_rules.mk:85: *
build/core/base_rules.mk:86: * Add "LOCAL_MODULE_TAGS := optional" in the
build/core/base_rules.mk:87: * Android.mk for the affected module, and add
build/core/base_rules.mk:88: * the LOCAL_MODULE value for that component
build/core/base_rules.mk:89: * into the PRODUCT_PACKAGES section of product
build/core/base_rules.mk:90: * makefile(s) where it's necessary, if
build/core/base_rules.mk:91: * appropriate.
build/core/base_rules.mk:92: *
build/core/base_rules.mk:93: * If the component should be in EVERY build of ALL
build/core/base_rules.mk:94: * products, then add its LOCAL_MODULE value to the
build/core/base_rules.mk:95: * PRODUCT_PACKAGES section of
build/core/base_rules.mk:96: * build/target/product/core.mk
build/core/base_rules.mk:97: *
build/core/base_rules.mk:98: *** user tag detected on new module - user tags are only supported on legacy modules. Stop.
解决:在Android.mk中的LOCAL_MODULE := libclearsilverregex和LOCAL_MODULE := libuclibcrpc后添加LOCAL_MODULE_TAGS := optional
问题2:
我用git add file添加文件时出现这样错误:
fatal: Not a git repository (or any of the parent directories): .git
提示说没有.git这样一个目录,解决办法如下:
git init就可以了!
问题3:
make: *** No rule to make target `out/target/product/generic/obj/lib/***.so', needed by `out/target/product/generic/obj/STATIC_LIBRARIES/***/busybox'. Stop.
解决办法:
在/home/ryan/Android2.2/alps/out/target/product 找到我们的工程名,工程名就是我们编译时出现的project=ti816xevm
在终端输入命令:export TARGET_PRODUCT=ti816xevm
问题就解决了
3.安装、创建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(链接文件和链接目标文件必须一起打包)
4.烧录到产品板使用:
usb 或网络链接adb 之后,adb shell ,之后执行ash 即可进入busybox shell,操作就和pc的linux环境差不多了,可以使用tab键自动补齐,和其他一些busybox的命令;
也可以通过nfs挂载Android文件系统,直接copy到主机的挂载目录下system/bin/,然后执行ln -s busybox ash, 然后在终端输入ash进入busybox shell, 执行su退出busybox shell环境。
5.其它编译问题:
另外,有网友在编译过程中出现其它问题,这里也一并列具出来,供参考;
问题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;
可以参考Froyo bionic/libc/include/sys/resource.h文件。
问题3描述:busybox/networking/ntpd.c:1458: undefined reference to `adjtimex'
出错原因:bionic中没有定义adjtimex,stime,swapon,swapoff,sysinfo,getsid等函数。
解决方法:修改Android.mk,增加 CYANOGEN_BIONIC:=true
参考:http://blog.csdn.net/sustzombie/article/details/6763791
Android移植busybox的更多相关文章
- Ogre 1.9 Android移植
Ogre 1.9 Android移植 分类: 图形渲染2013-02-04 16:47 3860人阅读 评论(14) 收藏 举报 Android Ogre C++linuxLinuxLINUX 上一篇 ...
- android移植pppoe拨号上网的全过程
硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...
- 第四章Android移植环境搭建
第四章Android移植环境搭建 这一章主要学习如何搭建 Android 移植的环境.因为 Android 底层是基于 Linux 内核的,所以本章从交叉编译环境等嵌入式开发环境的搭建开始,介绍了 B ...
- 第三章Android移植平台工具介绍
第三章Android移植平台工具介绍 进行 Android 移植的学习并不一定需要一款 Android 手机,但必须要有一款主流的开发板,开发板是用来进行嵌入式系统开发的电路板,包括中央处理器.存储器 ...
- 初学者的Android移植:在Debian上建立一个稳定的构建环境
介绍 通过在chrooted环境中设置开发环境,避免依赖冲突和沙箱您的Android开发从您的Debian GNU/Linux系统.这是为通配符类别准备的,因为从源代码构建Android似乎没有在其他 ...
- cocos2d-x 从win32到android移植的全套解决方案
引言:我们使用cocos2d-x引擎制作了一款飞行射击游戏,其中创新性地融入了手势识别功能.但是我们在移植过程中遇到了很多的问题,同时也发现网上的资料少而不全.所以在项目行将结束的时候,我们特地写了这 ...
- 给Android系统安装busybox
转自:http://blog.csdn.net/lxgwm2008/article/details/38925051 busybox号称Linux平台的瑞士军刀,它集成了100多个最常用的Linux命 ...
- android安装busybox
大家是否有过这样的经历,在命令行里输入adb shell,然后使用命令操作你的手机或模拟器,但是那些命令都是常见Linux命令的阉割缩水版,用起来很不爽.是否想过在Android上使用较完整的shel ...
- Android安装BusyBox(三星N7108)
近期公司安卓app测试,分配任务为监控APP内存.CPU占用率.因安卓是基于linux开发,故很容易就联想使用Linux监控相关的命令.想法总是美好的,现实总是残酷的,使用三星 Galaxy Note ...
随机推荐
- if switch练习(体重)
public class shencai { public static void main(String[] args) { int h= 186,g= 80; String Sex = " ...
- 学习php常用算法
<?php /*学用php算法*/ /*1.冒泡法 *思路分析:在要排序的一组数中,对当前还未排好的序列, *从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. *即,每 ...
- pyqt sender()学习
#!/usr/bin/python # -*- coding: utf-8 -*- # sender.py import sys from PyQt4 import QtGui, QtCore cla ...
- 使用cx_Freeze 将python3代码打包成.exe程序
在这里分享一下如何在py3下使用cx_Freeze打包pyqt5的程序 首先吐槽下,深深鄙视一下百度,各种百度各种没有,之前我在py2.7下使用pyqt4开发过一个小软件,用的是py2exe进行打包的 ...
- [置顶] LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句
LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 declare @sql varchar(4000), @dirpath varch ...
- C基础知识小总结(十)
"如有不正确之处,请指出,谢谢" --Mood <指针和函数> 指针函数 函数指针 <最基本的使用函数指针> ...
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- Android应用程序消息处理机制(Looper、Handler)分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6817933 Android应用程序是通过消息来 ...
- [Python学习笔记][Python内置函数]
Python 常用内建函数 比较基础的列表 abs(x) 求绝对值 pow(x,y) 返回x的y次方,等同于x**y round(x[,小数位数]) 对x进行四舍五入,若不指定位数,则返回整数 chr ...
- OutputCache各参数的说明
OutputCache各参数的说明 Duration 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location Location当被设置为 ...