永发信息网

如何让Android系统或Android应用执行shell脚本

答案:2  悬赏:0  手机版
解决时间 2021-01-19 23:03
如何让Android系统或Android应用执行shell脚本
最佳答案
android系统执行shell脚本,需要首先确认用户具有修改shell的权限,使用 process来执行指令,如下代码:public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //开始执行shell脚本 //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
全部回答
一、Android应用启动服务执行脚本
1 如何写服务和脚本
在android源码根目录下有/device/tegatech/tegav2/init.rc文件相信大家对这个文件都不陌生(如果不明白就仔细研读下android启动流程)。如果在该脚本文件中添加诸如以下服务:
service usblp_test /data/setip/init.usblpmod.sh
oneshot
disabled
注解:每个设备下都会有自己对应的init.rc,init.设备名.rc脚本文件。oneshot disabled向我们说明了在系统启动的时候这个服务是不会自动启动的。并且该服务的目的是执行/data/setip/init.usblpmod.sh脚本。脚本的内容你可以随便写,只要符合shell语法就可以了,比如脚本可以是简单的设置eth0:
# ! /system/bin/sh //脚本的开头必须这样写。
Ifconfig eth0 172.16.100.206 netmask 255.255.0.0 up//设置ip的命令
2、如何在应用中启动服务
1)首先了解下在服务启动的流程
1. 在你的应用中让init.rc中添加的服务启动起来。
首先了解下在服务启动的流程:
在设备目录下的init.c(切记并不是system/core/init/init.rc)
Main函数的for(;;)循环中有一个handle_property_set_fd(),函数:
for (i = 0; i < fd_count; i++) {
if (ufds[i].revents == POLLIN) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
else if (ufds[i].fd == get_keychord_fd())
handle_keychord();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
}
}
这个函数的实现也在system/core/init目录下,该函数中的check_control_perms(msg.value, cr.uid, cr.gid)函数就是检查该uid是否有权限启动服务(msg.value就是你服务的名字),如果应用为root或system用户则直接返回1.之后就是调用handle_control_message((char*) msg.name + 4, (char*) msg.value),该函数的参数就是去掉1.ctl.后的start和2.你服务的名字。这个函数的详细内容:
void handle_control_message(const char *msg, const char *arg)
{
if (!strcmp(msg,"start")) {
msg_start(arg);
} else if (!strcmp(msg,"stop")) {
msg_stop(arg);
} else if (!strcmp(msg,"restart")) {
msg_stop(arg);
msg_start(arg);
} else {
ERROR("unknown control msg '%s'\n", msg);
}
}
匹配start后调用msg_start.服务就这样起来了,我们的解决方案就是在检查权限的地方“下点功夫”,因为我们不确定uid,所以就让check_control_perms这个函数不要检查我们的uid,直接检查我们服务的名字,看看这个函数:
static int check_control_perms(const char *name, unsigned int uid, unsigned int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;

for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}
这个函数里面是必须要检查uid的,我们只要在for循环上写上。
if(strcmp(“usblp_test”,name)==0) //usblp_test就是我们服务的名字。
return 1;
这样做不会破坏android原本的结构,不会有什么副作用。
init.c和init.rc都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
刚买了盒济唐苑草甘宝茶?不知道咋样,有了解
梦幻西游咒师PT应该怎么给装备打符石
什么是动力荷载
工银的超级现金快线是什么?
bsen1021阻燃等级是英国标准吗
相机变焦镜头STABILIZERMODE1和2代表什么?
尔能组什么词
杜浔康乐健身电话多少
冷别赋的人物配乐
一张很邪恶的图,这张图不知骗了多少人,杯具
地暖一平方需要多少黄沙水泥
亚硝酸钠是工业用盐,因有咸味、外观酷似食盐
柴湖移民新城入住条件放宽
败字么组词
司马懿最大的谋略是什么?
推荐资讯
怎样使孩子消除自卑感的教案百度文库
10平米小卧室需要多少瓦的led灯?
脖子带八卦避邪可以带别的不
钱币什么价
这个猴牌大红袍一两装的多少钱
空杯为零心态的文章
正确答案等于多少?
二百年前的4月2日,丹麦城市欧登塞的一个穷鞋
《臣僚见太祖》的解释
广西蒙山县城有没有中国银行
family,home,house和household的异同
哪有价格优惠风琴鱿鱼尾 鱿鱼片批发
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?