android 应用层shell,如何让Android系统或Android应用执行shell脚本
一、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(),函数:
"font-size:18px;">for(i = 0; i
if(ufds[i].revents == POLLIN) {
if(ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
elseif(ufds[i].fd == get_keychord_fd())
handle_keychord();
elseif(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.你服务的名字。这个函数的详细内容:
"font-size:14px;">voidhandle_control_message(constchar*msg,constchar*arg)
{
if(!strcmp(msg,"start")) {
msg_start(arg);
} elseif(!strcmp(msg,"stop")) {
msg_stop(arg);
} elseif(!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,直接检查我们服务的名字,看看这个函数:
staticintcheck_control_perms(constchar*name, unsignedintuid, unsignedintgid) {
inti;
if(uid == AID_SYSTEM || uid == AID_ROOT)
return1;
/* Search the ACL */
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)) {
return1;
}
}
}
return0;
}
这个函数里面是必须要检查uid的,我们只要在for循环上写上。
if(strcmp(“usblp_test”,name)==0) //usblp_test就是我们服务的名字。
return 1;
这样做不会破坏android原本的结构,不会有什么副作用。
init.c和init.rc都改好了,现在就可以编译源码了,编译好了装到机子开发板上就可以了。
2、在应用中启动服务
在应用程序中调用:do_exec(startusblp_test);
do_exec的实现如下:
privateString do_exec(String cmd) {
String s = "/n";
try{
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = newBufferedReader(newInputStreamReader(p.getInputStream()));
String line = null;
while((line = in.readLine()) !=null) {
s += line + "/n";
}
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
text.setText(s);
returncmd;
}
应用源代码下载地址:
二、编译源码执行shell脚本
这个方法很简单,脚本已经写好了,现在要解决的问题是在什么时候怎么执行这个脚本,经过验证最佳的位置在system/core/init/init.c,main函数中的如下位置,
queue_builtin_action(queue_property_triggers_action, "queue_propety_triggers");
#if BOOTCHART
queue_builtin_action(bootchart_init_action, "bootchart_init");
#endif
/*add by weijing */
system("exec /system/bin/sh /data/setip/init.djstava.sh");
/*end by weijing */
for(;;) {
android 应用层shell,如何让Android系统或Android应用执行shell脚本相关推荐
- android 7.0开机脚本,Android 7.0系统的手机无法执行appium脚本的问题:PS 'uiautomator'...
报错: 解决: 解决办法 uiautomator1.0应该是不支持7.0,不升版本就换用uiautomator2.0吧,或者用下面的改脚本的方法使用. 解决Android 7.0系统的手机无法执行ap ...
- 以Android L读取系统所有logcat并写入文件为例分析Android 以添加系统进程的方式申请selinux的权限执行shell脚本,以及avc:dined应该怎么申请权限
添加selinux较好的文章,可以通过adb shell dmesg > kenel.log 获取kmesg 可以看到 avc:dined 相关内容 首先说说环境: 基于Android L的ao ...
- Android程序员的春天!系统盘点Android开发者必须掌握的知识点,移动架构师成长路线
前言 程序员,近年来十分火爆的职业,凭着巨大的市场缺口和高额的薪水吸引着大量毕业生加入程序员的队伍.这其中就包括各类专业的学生,像我这种自动化专业的也在其内.这些不是计算机科班出身的可以看作是半路出家 ...
- Android中shell控制cpu,Android app开发中获取cpu arm架构信息及执行shell命令方法
最近在做一个项目,需要在app开发过程中去判断cpu的arm架构,比如说是armeabi-v7a,或是arm64-v8a. 其实,在adb shell命令下面,可以通过getprop的方式,获取到一些 ...
- android studio升级的步骤,win7系统更新Android Studio的操作方法
很多小伙伴都遇到过对win7系统更新Android Studio进行设置的困惑吧,一些朋友看过网上对win7系统更新Android Studio设置的零散处理方法,并没有完完全全明白win7系统更新A ...
- win10 android文件夹是什么,windows10系统删除.android文件夹的方法
为了获得更好的体验,小编将电脑系统升级到了win10正式版.不过,最近小编在使用win10系统时遇到了无法删除.android文件夹的情况.经常一番研究,终于发现了该问题的原因和具体解决方法.接下来, ...
- 基于Android端的照片比对系统,基于Android系统的人脸识别系统
[文章摘要] 当前随着基于Android系统的移动终端设备的广泛应用,以及图像采集设备的普遍集成,使得Android系统的图像采集设备除了具有照相.摄像功能以外,正在扩展新的实用型功能.其中,利用An ...
- android中编辑框明文密文系统图标,Android设置密码的明文和密文显示【原创】
我们经常会在一些软件上发现在密码输入框的后面有一个按钮可以使我们输入的密码显示为密文(●●●●●或者*****),也可以显示为正常的可见状态,效果如图. 具体实现如下: 布局: android:lay ...
- Android利用 libsuperuse执行shell命令或获取root权限
Android 5.1 之后,发现通过ActivityManger获取不到正在运行的进程了,可以通过shell命令来获取,参考. libsuperuse执行shell可以参考: http://my.o ...
- android视频显示,好消息,今天发布1节Android显示系统视频
原标题:好消息,今天发布1节Android显示系统视频 今天发布1节显示系统视频 第003课第01节_最简单的Surface测试程序 主要内容: 使用C语言编写Surface应用程序,忽略java复杂 ...
最新文章
- Nature:新聘“诺奖级泰斗”研究揭示大脑中执行不同认知功能环路之间的协同作用
- 14.8类成员的属性
- MacOS中安装python-jekins失败解决方法
- ASP.NET-GridView数据绑定的几种方法
- php一句话图片木马过滤_php一句话图片木马怎么解析
- c语言中删除有序数组中重复元素,去除有序列表中的重复元素
- 树莓派 触摸屏_如何用树莓派搭建一个颗粒物(PM2.5)传感器
- mysql_根据身份证号识别性别、年龄、所在省份
- 编译原理:正规式转变成DFA算法
- Swift - 使用导航条和导航条控制器来进行页面切换并传递数据
- 【OpenCV】 码书(CodeBook)基本原理介绍
- 激光导航AGV为何如此受企业青睐?
- 2013年13寸Macbook Air 安装单windows 10系统
- 架构漫谈(一):什么是架构? -王概凯 - 转
- 资源教程[外贸人zencart自助建站视频教程]:第四课(5)zencart更换模板
- android ADB 模拟手机点击事件
- Android记账本APP开发进阶版
- PSD文件生成Unity预设
- 【高中数学】频率分布表和频率分布直方图
- win10c语言关机,win10如何设置定时关机?
热门文章
- 吴恩达深度神经网络笔记—人脸识别
- 基于麻雀算法改进的无线传感器网络Dv-hop定位算法 - 附代码
- 如何成为一名懒惰的系统管理员
- svn版本更迭的原理
- fmute hang_detect 与ARM 镜像
- 2022年中级经济师考试中级金融专业练习题及答案
- cba比赛比分预测_今晚五场CBA比赛预测
- 计算机应用基础 网络协议,计算机应用基础网络.ppt
- partition by mysql_详解Oracle查询中OVER (PARTITION BY ..)用法
- 字体文件反反爬-- 起点中文网