在android上,为了某些需要,我们需要一个小而精减的busybox(如果不懂busybox是什么),请跳过此文。当然我们也可以用gcc的toolchains来build, 但生成出来的那个二进制文件的size会让你疯狂。而用NDK生成出来的二进制则是gcc生成的五分之一左右。我做过试验,同样一个busybox的配置,gcc生成的busybox是460k左右,NDK生成出来的则是84k。

如果研究过NDK,可以看到他有一个toolchains目录,这目录里装的就是用来编译生成能在android上运行的程序的编译器。例如目录

/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin

这目录下就是编译器,而编译链接需要的头文件和库则在对应的平台的目录里,例如

/opt/android-ndk-r6/platforms/android-9/arch-arm/usr

下的include和lib。

下面开始正题, 首先需要哪些环境:

1. Linux系统环境,我这里是(Ubuntu 10.x),你也可以用一个虚拟机,我就是用的虚拟机。

2. 安装了gcc,make,和NDK,可以从上面内容看到,我用的是r5c版。这些怎么配置这里略过,网上一搜一大把。

3. 从www.busybox.net上下载busybox源代码

开始

1. 將/opt/android-ndk-r6/platforms/android-9/arch-arm/usr 下的include和lib覆盖拷贝/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi目录下。这里用哪个平台的头文件和库你自己可以看着办。差别不大。

2. 解压busybox包,然后进入解压后的busybox目录

3. make menuconfig

在配置里,有几项是要选上的。

Busybox Settings->Build Options->

[*] Build BusyBox as a static binary (no shared libs)
Cross Compiler prefix: /opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-

Busybox Settings->General Configuration->

[*] Enable options for full-blown desktop systems │ │
│ │[ ] Provide compatible behavior for rare corner cases (bigger code) │ │
│ │[*] Enable obsolete features removed before SUSv3 │ │
│ │[ ] Avoid using GCC-specific code constructs │ │
│ │[*] Enable Linux-specific applets and features │ │
│ │ Buffer allocation policy (Allocate with Malloc) ---> │ │
│ │[*] Show terse applet usage messages │ │
│ │[*] Show verbose applet usage messages │ │
│ │[*] Store applet usage messages in compressed form │ │
│ │[*] Support --install [-s] to install applet links at runtime │ │
│ │[*] Don't use /usr │ │
│ │[ ] Enable locale support (system needs locale for this to work) │ │
│ │[ ] Support Unicode │ │
│ │[*] Support for --long-options │ │
│ │[*] Use the devpts filesystem for Unix98 PTYs │ │
│ │[ ] Clean up all memory before exiting (usually not needed) │ │
│ │[ ] Support wtmp file │ │
│ │[ ] Support utmp file │ │
│ │[ ] Support writing pidfiles │ │
│ │[ ] Support for SUID/SGID handling │ │
│ │[ ] Support NSA Security Enhanced Linux │ │
│ │[ ] exec prefers applets │ │
│ │(/proc/self/exe) Path to BusyBox executable

剩下的其他的按自己的需要来选配,

4.按ESC退出,最后会问你是否保存配置,别多按ESC,会不保存的。选择yes按回车保存。

5. 修改Makefile.flags.去 crypt库的链接,当然一些用到crpyt库的功能也得从第3步的配置里去掉,例如密码之类的 。

6.make

这期间会有些编译错误

我碰到过一个找不到sys/user.h的错误,我把/opt/android-ndk-r6/tmakeoolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/include/linux/user.h拷贝到

/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/include/sys下搞定。

还有一个 找不到sys/kd.h的错误也同样处理

还碰到过一个找不到strchrnul函数的定义。我用strchr替代之。例如editor/sed.c

// unsigned idx = strchrnul(cmd_letters, sed_cmd->cmd) - cmd_letters; //原代码

// 替换代码。

char* tmp_p = strchr(cmd_letters, sed_cmd->cmd);
unsigned idx = tmp_p ? tmp_p - cmd_letters : strlen(tmp_p);

还有libbb/obscure.c line 113,注释掉那3行。

如果编译碰到错误无法解决时,把对应编译出错的工具打勾去掉再重新make,例如editors/vi.c有个函数找不到,我就重新配置了一下busybox,把Editors里的vi给去掉了。然后重新编译。

我还去掉了Init Utilities->bootchartd, poweroff,halt, and reboot,

Busybox Settings->Busybox Library Tuning->

[ ] Command line editing

当然最好是只选CoreUtils

7.生成出来了busybox,将其拷贝到android手机上,就能用了。


备注: 其实那些编译错误都是可以解决的,用strchr替换strchrul, 还有用其他函数替代fputs_unlocked,大家有兴趣可以自己研究下。

这些错误都是因为NDK里的头文件和库与GNU GCC的头文件有些差异或者给去掉了一些 文件导致的。


谢谢

更多相关文章

  1. Androd学习笔记——新浪微博Android(安卓)SDK——如何打印出5位
  2. 利用android_ndk开发OpenGLES如何利用上层Bitmap生成纹理
  3. 使用Ramdisk加速Android工程的编译 (AndroidStudio Gradle)
  4. Android(安卓)错误信息捕获发送至服务器【整理】
  5. Android(安卓)studio和Eclipse分别生成jar包并混淆jar包
  6. 【Android(安卓)如何置底一个View(附 前置声明layout布局文件中的
  7. Android反编译和二次打包实战
  8. Glide源码解析篇之框架主体结构(一)
  9. Android开发之错误:elicpse运行时弹出Running Android(安卓)Lint

随机推荐

  1. 超细节!数据分析社招面试指南
  2. NodeManager 生命周期介绍
  3. web前端入门到实战:css重点知识和bug解决
  4. Apache Flink 1.3.0正式发布及其新功能介
  5. SpringBoot的四种异步处理,学到了
  6. maven 仓库地址配置大全
  7. 前端面试经典问题:CSS中居中的几种方式
  8. Nacos注册中心 配置启动
  9. Rheem:可扩展且易于使用的跨平台大数据分
  10. 关于图片性能优化,你必须知道的