刚进入Android终端即可使用busybox的命令
作者:dengxiayehu
欢迎交流,转载请注出处。
Android中的内置sh可是出了名的难用,只支持少得可怜的常用命令,所以大家一般都喜欢推一个busybox进去
以方便使用。具体方法请参见: 在Android模拟器中安装busybox这篇文章。
但是这里又出现一个问题就是,就是我们每次adb shell进入Android的终端后,还得要手动先执行一下那个脚本,
那还不得麻烦死,所以还得改进。我想,应该可以从sh的源码入手,在其进入命令循环之前先在代码中设置我们所需的
alias命令即可,具体如下:
所需改动的文件:
1、system/core/sh/main.c
找到void cmdloop(int top)这个函数的定义,在for(;;)死循环之前加上
setprealias();
这句调用自定义的设置alias函数,具体的函数体下述。
2、system/core/sh/alias.c
在其中添入两个函数即可,具体如下:
作者:dengxiayehu
欢迎交流,转载请注出处。
Android中的内置sh可是出了名的难用,只支持少得可怜的常用命令,所以大家一般都喜欢推一个busybox进去
以方便使用。具体方法请参见: 在Android模拟器中安装busybox这篇文章。
但是这里又出现一个问题就是,就是我们每次adb shell进入Android的终端后,还得要手动先执行一下那个脚本,
那还不得麻烦死,所以还得改进。我想,应该可以从sh的源码入手,在其进入命令循环之前先在代码中设置我们所需的
alias命令即可,具体如下:
所需改动的文件:
1、system/core/sh/main.c
找到void cmdloop(int top)这个函数的定义,在for(;;)死循环之前加上
setprealias();
这句调用自定义的设置alias函数,具体的函数体下述。
2、system/core/sh/alias.c
在其中添入两个函数即可,具体如下:
STATIC int handle_line(char *line);
STATIC void setprealias(void);
STATIC
int
handle_line(char *line)
{
char *p, *q;
char target[30];
if (!line) {
return 0;
}
p = line;
for ( ; ; ) {
while (isspace(*p)) {
++p;
}
if (!(*p)) {
return 0;
}
q = p;
while (isalpha(*p) || isdigit(*p) \
|| '[' == *p \
|| ']' == *p \
|| '.' == *p \
|| '-' == *p \
|| '_' == *p) {
p++;
}
*p++ = '\0';
// > ignore alias itself
if (!strcmp(q, "alias")) {
continue;
}
snprintf(target, sizeof(target), "busybox %s", q);
setalias(q, target);
}
return 0;
}
STATIC
void
setprealias(void)
{
FILE *fp;
char buff[128];
int flag = 0;
fp = popen("busybox --help", "r");
if (!fp) {
outfmt(out2, "run \"busybox --help\" failed");
return;
}
while (fgets(buff, sizeof(buff), fp)) {
if (flag) {
handle_line(buff);
}
if (!strcmp("Currently defined functions:\n", buff)) {
flag = 1;
}
}
pclose(fp);
}
函数很简单,就不详细注释了,看下效果:
![](http://hi.csdn.net/attachment/201111/19/0_1321709933ZTT5.gif)