android远程控制(二)----通过android程序写驱动代码到驱动文件

这个过程里有两个问题,

问题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。左边是默认,点击注入代码后,是右边的效果。

                                                 



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值