这个过程里有两个问题,
问题1:怎么实现安卓后台服务自动执行某个动作,例如自动输出日志,定时写向驱动注入代码,这个基本就是写android后台服务,技术难度不大,我自己写的一个例子的链接入如下:这个代码里写的是每隔5S打印一次日志
http://download.csdn.net/detail/diaoliangwang/7399661
问题2:怎么将代码写到驱动里或者怎么调用安卓的调试器,通过调试器来注入代码这个问题就有点难了,主要是因为自己能力不够啊,知识面太窄。其实就是拿到虚拟机的运行时环境,这相当于windows下的cmd,拿到的运行时其实就和你在pc端输入adb shell的效果是一样的。另外有个问题是,手机要root,否则拿不到超级管理员权限,这样的话,就无法调用运行时发送代码到驱动文件,会出现permission denied的提示,我在4.3的虚拟机上测试就是这么提示的,果断转到屌丝机上就没有问题了。还是看代码吧。
void doXue(){
Runtime runtime = Runtime.getRuntime();
DataOutputStream dataOut;
try {
Process process = runtime.exec("su ");
InputStream in = process.getInputStream();
BufferedReader bufferReader = new BufferedReader(
new InputStreamReader(in));
BufferedReader err=new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
dataOut = new DataOutputStream(process.getOutputStream());
//经过试验 完全不用考虑斜杠问题 必须要加分号 否则会注入失败
dataOut.writeBytes("sendevent /dev/input/event4 0 0 0;");
dataOut.writeBytes("sendevent /dev/input/event4 1 330 1;");
dataOut.writeBytes("sendevent /dev/input/event4 3 48 1;");
dataOut.writeBytes("sendevent /dev/input/event4 3 53 580;");
dataOut.writeBytes("sendevent /dev/input/event4 3 54 483;");
dataOut.writeBytes("sendevent /dev/input/event4 0 0 0;");
dataOut.writeBytes("sendevent /dev/input/event4 1 330 0;");
dataOut.writeBytes("sendevent /dev/input/event4 0 2 0;");
dataOut.writeBytes("sendevent /dev/input/event4 0 0 0;");
dataOut.writeBytes("sendevent /dev/input/event4 0 0 0;");
dataOut.flush();
dataOut.close();
process.waitFor();
while ((line = err.readLine()) != null) {
Log.i(TAG,line);
tv_infor.setText(line);
}
while ((line = bufferReader.readLine()) != null) {
Log.i(TAG,line);
tv_infor.setText(line);
}
} catch (Exception e) {
e.printStackTrace();
tv_infor.setText(e.getMessage());
}finally{
}
}
代码首选是获取超管权限,然后是向驱动写数据,薛神(我同学)说代码打开调试后台的效果和在PC端用adb shell打开手机的调试后台一样的。经过试验确实是。
我做的例子是,在android程序里,通过一个按钮将驱动代码写入手机驱动,实现的效果是,按下“注入代码”按钮后,按钮旁边的美女图片会换一张。
有个问题是,我的实现方式和在activity里面模拟点击事件完全不同,我的目的不是在一个activity里模拟系统点击事件,只是用这个例子来测试下看看能不能把
数据写到驱动里,系统自动响应写进去的代码,模拟出我手动点击过图片然后让图片更换的效果。
在上述代码中,
dataOut.writeBytes("sendevent /dev/input/event4 0 0 0;");
sendevent /dev/input/event4 0 0 0; 这段代码里的分号是必须的,上述好几行类似的格式的代码,其实也可以通过分号把几条指令放在一个字符串里执行,效果是一样的。但是分号必不可少,还有在字符串里不用考虑反斜杠是否要用两个反斜杠来表示,经过我的测试,发现完全不用考虑这个问题,反而用两个反斜杠表示会报错。
demo只供测试用,是个很重要的中间结果,本人下午+晚上的劳动成果,菜鸟一枚,呵呵。demo的下载地址如下
http://download.csdn.net/detail/diaoliangwang/7399761
这个demo还只是在activity里注入,不是从服务里注入代码到驱动,不过已经不远了。
下一篇博客我将编写一套动作,打开我主页上的微信,然后 按返回键,这两个简单的动作,然后让这两个动作的代码从后台服务没10秒注入一次到系统里。
实验还没有做,太饿了,下午郁闷没去吃饭了,这会又进了一步。
demo的UI如下,只是为了测试而已,不要太在意UI。左边是默认,点击注入代码后,是右边的效果。