在Android使用到am和进行一些操作是非常方便的,比如一个重复自动的操作,具体用来实现一些什么是看个人需求了,接下来说对于am和input的使用。

本文适用于已经大概去了解了am和input的朋友,如果暂时不了解,这里推荐两篇文章大家可以去看看,我就不说了,说了也多是抄,当然如果您是大牛,请忽略本文,本文主要是一些使用中的经验,和一些小技巧

am:

http://blog.csdn.net/u010164190/article/details/51384099

input:

http://blog.csdn.net/soslinken/article/details/49587497

首先是am:

    am命令主要用于让手机去做一些指定的命令,比如打开指定应用或activity

而input命令则是模拟用户的点击。

先对这两个东西有个模糊的概念,这两个命令经常搭配在一起使用,

(暂时可以这样去理解它们两个,当然不是很恰当的例子:input是一步一步的去做某个事情,慢慢的去做,和人手去操作手机一样,一步接一步的,比如拨打10010查话费就是先点拨号然后点10010这5个数字,而am也可以暂时把它当成是input,但它是一个大的input,指哪打哪的那种,一步到位,比如我要打10010,adb shell am start -a android.intent.action.CALL -d tel:10086   这样一句就可以了,因为am命令能做到的事情“并不是很多”,而input可以实现完全像人手一样操作,所以这两个经常搭配使用。当然不完全是因为这个。)

接下来详细的说明这两个命令:

使用am和input有这样两种方式:

一种是在Android的命令行中,打开cmd或android studio中自带的命令行,cd到sdk的platform-tools文件夹下,在输入am或input命令之前记得加上adb shell

另一种就是实际应用到你的android代码中,在代码中是不需要加入adb shell的,只需要写命令就可以了。

事实上我们使用am和input大多是做一下比较投机的事情,比如一个游戏老是会有重复的点击事件,那我就可以通过命令去实现,还有时,我有很多机器,我要进行一个同样的操作,那也可以通过am和input去实现,am和input还可以结合Accessibility去做更多更方便的事情,很多人说这些按键精灵一样的还算是编程吗,我的看法是这样的,只要是通过你的代码带来了便利,起到了作用的东西,都应该是编程。

好了,不说废话了

我们假设现在有这么一个情况,我有一千台机器,每个机器上我都安装了一个软件,我要这一千个机器都需要更改个性签名,我们就可以用input和am写小脚本

我们捋一捋思路。

首先需要使用am跳转离个性签名Activity尽量近的地方

怎么才能知道APP的哪个界面是叫什么呢,有这样一个方法!

在命令行的platfrom-tools目录下输入:

adb shell "dumpsys window | grep mCurrentFocus
查看当前app的当前activity

在代码中获取当前activity有点繁琐,实在需要可以私聊我发源码

我们在跳转到某个activity时需要注意一点!重要

有的APP不要一步到位跳转到指定Activity

比如微信,频繁的am指定跳转可能会被封号,因为系统会认为你是机器人在点,而不是人为,如果条件允许,甚至可以是一步一步去input,但是比较麻烦,且要一些时间,因为每次input后是需要线程休眠的,通常是两秒,因为activity的跳转加载跟不上程序的运行速度,不进行线程休眠会导致你的脚步啪啪啪一套运行完了,但都是乱点,没有达到需要的效果

但是在我们假定的情况中是没有这个限制的,因为不是每个软件都像微信这样去判定

这时我们要考虑的就是去跳转到哪一个activity才最方便。

又有一点需要注意

不是所有am都可以简单的运行的,大多时候我们的需求都是需要root权限的,比如要跳转到安装的app的某个指定Activity,否则,会提示权限不够

获取root的方法如下:

主要是通过操作Process来进行

Process process = Runtime.getRuntime().exec("su");
在执行am命令时还需要使用到输出流
完整的am执行方法如下:
public static void exeCmd(String cmd) {
try {
      Process process = Runtime.getRuntime().exec("su");
      OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(
outputStream);
dataOutputStream.writeBytes(cmd + "\n");
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
} catch (Throwable t) {
t.printStackTrace();
}
} 参数cmd就是我们的am命令

这时就可以通过adb shell "dumpsys window | grep mCurrentFocus获取到activity,跳转到指定activity

但是我们在跳转时很多时候不只是跳转这么简单,我们会往am中传值提交到指定Activity中(通过Intent),但是要怎么知道指定的activity是接收的什么名字的值呢。

这就需要用到反编译.

反编译不会混淆四大组件的名字,因为混淆后会在AndroidManifest找不到,这时我们可以去看反编译出的代码进行传值,这样就轻易很多,怎么反编译我也不说了,大家应该都会。

到了指定activity通常还不能直接做完需求,需要搭配使用input。input在代码中怎么使用呢

也是通过我们的exeCmd方法,但是传值不再是一个单词的String 而是按键行为其实也是使用的String,只是我的意思是,它不只是简单的全一个String进去,因为我们要有面向对象的思想,如果可以面向对象,就去面,多少也是程序员,input和am不同,常用又有够多的共性,如果不进行这样一个封装,真的很乱,尤其是input一多,那么到底是这样去实现呢,如下:

会使用到String的Format方法格式化,format和C语言中的print很相似

举个点击的例子:

private static String TAP = "input tap %d %d";
public static String getTap(int x, int y) {
return String.format(TAP, x,y);
} 使用时:exeCmd(getTap(100,100))
长按,滑动...都是这么个事。
am和input结合起来就可以实现我们需要的了。 input如何输入中文?
public static void execShell(String cmd) {
try {
Process process = Runtime.getRuntime().exec("su"); OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(
outputStream);
byte[] t_utf8 = (cmd + "\n").getBytes("UTF-8");
dataOutputStream.write(t_utf8);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
} catch (Throwable t) {
Log.e("test","execCommonShell[ "+cmd+" ] error.",t);
}
}
private static String TEXT_ALL = "am broadcast -a ADB_INPUT_TEXT --es msg \"%s\"";
public static String getTextAll(String content) {
return String.format(TEXT_ALL, content);
}

就是这样了,没有讲什么复杂的东西原理什么的,很拙劣,是自己使用中学到的经验,都是一些实际使用中的可能会用的到的,在记录下来的同时也希望可以帮到大家。

在Android中使用am和input命令在实际使用中的注意事项以及小技巧的更多相关文章

  1. 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件

    今天在维护公司的一个小项目的时候,发现按公司手机的某个物理按键,激活相应的Service后,会在屏幕上模拟的点击了屏幕的某个坐标点.好家伙,原来是之前该项目的版本是按这个物理按键后,会弹出一个对话框, ...

  2. 总结自己使用shell命令行经常使用到的8个小技巧

    原创blog,转载请注明出处 Shell是命令解释器 [root@localhost ~]# cat /etc/shells 查看本系统共支持哪些shell 1 tab 命令补全 这个差点儿每次都能用 ...

  3. [转]CMD命令提示符窗口中的快捷键、小技巧和常用命令

    转至:https://wenku.baidu.com/view/d5d2b7ca360cba1aa811dac6.html 快捷键:  F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果 ...

  4. Fiddler使用过程中容易忽略的小技巧

    fiddler的基本使用,在之前的一篇博文中有详细介绍,可参见Fiddler抓包工具使用详解,今天来分享几个容易忽略的小技巧. 1.ios机装了证书,依然抓不到包 近期总被同事问及ios机装了证书,但 ...

  5. C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题

    http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...

  6. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  7. Android中开发需要的高效助推的命令总结

    ​Android 开发中我们有时候需要借助一些命令帮助更好的高效率定位解决问题,本文就来介绍一些可能有些隐藏的而却非常好用的命令,可以帮我们快速找到问题,这些命令都是本人在开发中实践总结,个人觉得非常 ...

  8. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  9. Android中shell命令语句

    最近学习了Android中碰到了shell命令,故收集终结了一下 Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 ...

随机推荐

  1. AngularJS自定义指令之可选参数replace

    replace是一个可选参数,如果设置了这个参数,值必须为true,因为默认值为false.默认值意味着模板会被当作子元素插入到调用此指令的元素内部: 如: <my-directive>& ...

  2. C++STL笔记

    C++STL 1.vector 向量,长度可变的数组 头文件 #include<vector> 1.1vector的定义 vector<typename> name; 例如: ...

  3. img图片标签alt和title属性的区别

    alt 用于图片没显示图片显示区域显示说明文字title 表示鼠标图片停留显示悬浮框其显示文字

  4. warshall、

    #include<iostream> int mian() { ][],b[][],c[][]; int i,j,k; cout<<"input the Boolea ...

  5. Markdown 标记语言简介

    简介 做为一种标记语言,广泛应用在写作领域,markdown语法编写的文本,经过特殊的软件进行展示: 目的:相对html,markdown提高文本的可读可写性 兼容:兼容html 自动转换特殊字符:& ...

  6. 虚拟机Centos开机以后,有eth0网卡,但是没有IP,Determine IP information for eth0.. no link present check cable

    Determine IP information for eth0.. no link present check cable 如果你的VMware虚拟机centos6.5使用NAT模式,开机以后,使 ...

  7. 安卓的UI界面开发(初学者推荐)

    一  随便扯扯 用户界面设计是程序开发的一项重要内容.在界面设计的过程中,需要考虑如何制作出UI界面,怎么样控制UI界面两大块. 任何有编程常识的人都知道:软件界面是开发者添加控件,编写控件控制逻辑, ...

  8. MINA、Netty、Twisted一起学(十二):HTTPS

    由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成. HTTPS介绍 上一 ...

  9. 结合prototype和xmlhttprequest封装ajax请求

    由于拖延症的严重以及年前准备年会(借口*^__^*) 导致这个小的的思考  现在才算完成 再怎么说也算是上班以来带我的前辈第一次这么正式的给我出题 不管是出于尊重还是自我要求我都决定把它简要的记下来 ...

  10. 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪

    1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 2 ...