基于Android Bionic 库动态编译busybox
来源:互联网 发布:windows loader百度云 编辑:程序博客网 时间:2024/06/06 07:44
最近在基于Android做IPV6方面的开发和测试,需要使用busybox中提供的ping, ping6, nslookup, traceroute6等工具。经过测试发现:网络上介绍交叉编译busybox并放到Android中运行的文章很多,交叉编译好的busybox也可以直接下载到。但是,由于它们都是静态编译busybox并链接在标准的glibc上,导致一些功能在Android中不能正常运行,例如:#busybox ping www.baidu.com
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的实现
我这里要做的就是基于bionic libc来编译busybox,以更好的提供对网络相关工具的支持。上网搜索发现,已经有一些人对busybox的移植做了许多工作,并且工作了自己的成果,比如:
- cyanogenmod已经提供了修改好的busybox源代码下载,但是基于froyo,而且没有打开ipv6设置
- http://lazyhack.net/compile-busybox-linked-bionic/ 介绍《为Milestone/Droid动态编译busybox并连接至bionic》,但是需要修改bionic,替换libc.so
对他们的文章和源码进行了研究与尝试,可以基于cyanogenmod的源码方便的移植busybox到Android,打开ipv6相关功能,并且不需要替换libc.so。下面是我的移植步骤和经验总结:
1. 下载cyanogenmod修改过的busybox源码,并解压到<src>/external/busybox目录
下载地址:http://github.com/CyanogenMod/android_external_busybox
2. 编译busybox并修正编译错误
在Andorid源码根目录中执行: # make -j4 busybox
可能遇到的第一类编译错误如下:
解决方法是在出错的文件中,包含头文件stdio.h。例如在df.c中增加
类似的编译出错的文件可能会有:
可能遇到的第二类编译错误如下:
出错原因是你使用的是早期的Android版本,其中rlim_t没有定义。解决方法是在<src>/bionic/libc/include/sys/resource.h中增加
可以参考Froyo中<src>/bionic/libc/include/sys/resource.h文件。
可能遇到的第三类编译错误如下:
出错原因是bionic中没有定义adjtimex,stime,swapon,swapoff,sysinfo,getsid等函数。解决方法是修改Android.mk,增加
3. 将编译好的busybox拷贝到手机/system/xbin/目录下测试
#adb push busybox /system/xbin/
附:编译好的busybox二进制下载地址 (支持ipv6)
- 基于Android Bionic 库动态编译busybox
- Android2.2添加busybox 支持——基于Android Bionic库
- Android4.4添加busybox 支持——基于Android Bionic库
- Android Bionic库
- 动态编译 busybox
- busybox动态编译
- android内核,busybox编译
- Android版busybox编译
- android 编译 busybox
- Android系统级开发--基于NDK的so库及bionic库(未完)
- busybox静态编译及动态编译实践
- busybox动态编译静态编译的区别
- busybox动态库问题
- Android的Linux内核Bionic库介绍
- 为Android交叉编译busybox
- 为Android交叉编译busybox
- mi bionic编译flow
- 基于NDK编译Android平台的FFmpeg动态库
- 【jsp/servlet】java.lang.ClassCastException: java.lang.Integer
- 常用SQL
- c#操作xml(2)
- DB2数据库发生死锁了怎么办
- 将数据库种某个字段值种的某写字符替换掉
- 基于Android Bionic 库动态编译busybox
- 设计模式六大原则(一)开闭原则
- 关于ORA-00257问题的解决(归档程序错误)
- source code
- 如何完全卸载Oracle
- Unicode下CString(wchar_t)转换为 char* 文 / night_cat
- 重建oracle企业管理器命令
- 117201118思路决定出路,观念决定贫富!持股者速加:117201118 检测主力动向
- synchronized&synchronized(something)与对象锁