android模拟器bo,在 Android 模拟器中安装 busybox
在Android模擬器中安裝busybox
【背景】:
Android?模擬器的?shell?真是難用啊,很多命令都不支持,如?find?、?grep?、?send?等等,最近正好有時(shí)間,想搗鼓搗鼓,用交叉編譯將?busybox安裝到模擬器中去。
【具體步驟】:
1)下載?busybox?源代碼,并解包
$ wget -chttp://www.busybox.net/downloads/busybox-1.7.0.tar.bz2
$ tar jxvf busybox-1.7.0.tar.bz2
2)下載交叉編譯工具,并安裝
我下載的是:?arm-2009q1-161-arm-none-eabi.bin
說明:要正確設(shè)置好?PATH?變量。
例如將?“?你的目錄?”/CodeSourcery/Sourcery_G++_Lite/bin?加到?PATH?路徑中。
3?)進(jìn)入到?busybox?解壓后的源文件目錄中,修改?Makefile
將第?176?行改為:
CROSS_COMPILE????=arm-none-linux-gnueabi-
4?)進(jìn)行編譯選項(xiàng)配置
a?、
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary(no shared libs)
說明:這個(gè)選項(xiàng)一定要選,這樣才能把?busybox?編譯成靜態(tài)鏈接的可執(zhí)行文件,運(yùn)行時(shí)可以獨(dú)立于其他庫。
b?、
Installation Options --->
[*] Don't use /usr
說明:這個(gè)也一定要選,否則?make install?后,?busybox?將安裝在原來系統(tǒng)的?/usr?下,將你原有的命令都覆蓋了!
5?)配置好后可以編譯了,執(zhí)行如下命令:
$ make
發(fā)現(xiàn)沒過多久,就報(bào)錯(cuò)了,暈,錯(cuò)誤內(nèi)容如下:
applets/applets.c:20:2: warning: #warning Static linking against glibc produces buggy executables
applets/applets.c:21:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:22:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:23:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:24:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:25:2: warning: #warning from top-level Makefile and remove this warning.
applets/applets.c:26:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o]錯(cuò)誤?1
make: *** [applets]錯(cuò)誤?2
看到它給出了提示,說?glibc?庫不適和用來靜態(tài)編譯,最后給出解決方案就是將?applets/applets.c?中這部分內(nèi)容給去掉,也就是?19-27?行。
然后再?make?進(jìn)行編譯。
不多久又報(bào)錯(cuò)了,看看具體錯(cuò)誤:
.../compal/CodeSourcery/Sourcery_G++_Lite/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:56:17: error: field 'in' has incomplete type
.../CodeSourcery/Sourcery_G++_Lite/bin/../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:57:18: error: field 'in6' has incomplete type
ipsvd/tcpudp.c: In function 'tcpudpsvd_main':
ipsvd/tcpudp.c:314:10: warning: ignoring return value of 'write', declared with attribute warn_unused_result
make[1]: *** [ipsvd/tcpudp.o]錯(cuò)誤?1
make: *** [ipsvd]錯(cuò)誤?2
看到說在我們下載的交叉編譯庫中有個(gè)頭文件中的?in?及?in6?類型不對(duì),解決的辦法就是:
在?.../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h?的開頭添加缺少的頭文件:#include
然后再進(jìn)行編譯。(這次可以安全到最后了,呵呵)
結(jié)束后會(huì)在當(dāng)前目錄下看到?busybox?這個(gè)可執(zhí)行文件。
6?)編譯步驟已完成,下面就將?busybox?這個(gè)可執(zhí)行文件放到?Android?模擬器下去
$ adb push busybox /system/xbin
說明:若是出現(xiàn)什么?read-only file system?等等之類,執(zhí)行如下命令即可:
$ adb remount
要是老是不行,那就重新啟動(dòng)?adb
$ adb kill-server
$ adb start-server
要是碰到什么內(nèi)存不足等等,那原因就是你的那個(gè)?Android?模擬器是用?Eclipse?打開的。解決辦法就是,手動(dòng)啟動(dòng)你的?Android emulator?模擬器,具體如下:
$ android list avd?????#注釋:列出你所有的模擬器
$ emulator -avd your_emulator_name -partition-size 256
注意:最好放在?/system/xbin?下面,這樣當(dāng)你在模擬器里使用?busybox?時(shí)不需要指定絕對(duì)路徑了,否則的話誰都會(huì)瘋掉嘛,呵呵。
7?)輸入?adb shell?進(jìn)入終端,執(zhí)行看看
# busybox --help
BusyBox v1.7.0 (2011-04-22 20:53:21 CST) multi-call binary
Copyright (C) 1998-2006?Erik Andersen, Rob Landley, and others.
Licensed under GPLv2.?See source distribution for full notice.
…
說明:表明我們的?busybox?已經(jīng)可以執(zhí)行了。但同時(shí)又有一個(gè)問題,每次輸入一個(gè)命令都要加上?busybox?,那么人又要瘋掉了,?-_-!?。解決辦法就是,我想到可以使用?alias?命令嘛,給我們所有輸入的東西都自動(dòng)加上?busybox?,具體如下:
【方法?1?】:
將你所感興趣的命令集中在一個(gè)腳本中打包,例如建立內(nèi)容如下的腳本:
#!/bin/sh
# set_alias1.sh?(當(dāng)然你名字可以隨便改,越短越好,但不要和命令重名)
alias ls='busybox ls'
alias find='busybox find'
…
保存好后,將其?push?到模擬器中的?/system/xbin?下面,然后用?adb shell?進(jìn)入到模擬器終端后執(zhí)行如下命令:
# . set_alias1.sh??????????#注釋:在當(dāng)前進(jìn)行中執(zhí)行該腳本(一定要有?"?點(diǎn)?"?)
【方法?2?】:
以上方法雖然能解決問題,但總覺得添加這么多東西也怪煩人的,寫個(gè)智能點(diǎn)的腳本:
xxx:~/code/shellcode$ cat set_alias.sh
#!/bin/bash
# set_alias.sh
pre_handle_result=$(busybox echo -n $(busybox --help) | busybox grep -v '^/t')
pre_cmds=${pre_handle_result##*[[, }
sec_cmds=$(busybox echo -n $pre_cmds | busybox sed 's/,//g')
for cmd in $sec_cmds
do
# alias cmds
alias $cmd="busybox $cmd"
done
然后將其?push?到模擬器中的?/system/xbin?下,執(zhí)行過程如上。
8?)差不多了,祝使用愉快。
總結(jié)
以上是生活随笔為你收集整理的android模拟器bo,在 Android 模拟器中安装 busybox的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基地三部曲观后感
- 下一篇: 金融行业的VC风险投资,PE私募股权,L