在Android中使用am和input命令在实际使用中的注意事项以及小技巧
在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命令在实际使用中的注意事项以及小技巧的更多相关文章
- 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件
今天在维护公司的一个小项目的时候,发现按公司手机的某个物理按键,激活相应的Service后,会在屏幕上模拟的点击了屏幕的某个坐标点.好家伙,原来是之前该项目的版本是按这个物理按键后,会弹出一个对话框, ...
- 总结自己使用shell命令行经常使用到的8个小技巧
原创blog,转载请注明出处 Shell是命令解释器 [root@localhost ~]# cat /etc/shells 查看本系统共支持哪些shell 1 tab 命令补全 这个差点儿每次都能用 ...
- [转]CMD命令提示符窗口中的快捷键、小技巧和常用命令
转至:https://wenku.baidu.com/view/d5d2b7ca360cba1aa811dac6.html 快捷键: F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果 ...
- Fiddler使用过程中容易忽略的小技巧
fiddler的基本使用,在之前的一篇博文中有详细介绍,可参见Fiddler抓包工具使用详解,今天来分享几个容易忽略的小技巧. 1.ios机装了证书,依然抓不到包 近期总被同事问及ios机装了证书,但 ...
- 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 ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...
- Android中开发需要的高效助推的命令总结
Android 开发中我们有时候需要借助一些命令帮助更好的高效率定位解决问题,本文就来介绍一些可能有些隐藏的而却非常好用的命令,可以帮我们快速找到问题,这些命令都是本人在开发中实践总结,个人觉得非常 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- Android中shell命令语句
最近学习了Android中碰到了shell命令,故收集终结了一下 Ccat zdd 浏览文件zdd的内容cat zdd1 zdd2 浏览多个文件的内容cat -n zdd浏览文件zdd的内容并显示行号 ...
随机推荐
- Htmlunit使用
//模拟一个浏览器 WebClient webClient = new WebClient(); //设置webClient的相关参数 webClient.setJavaScriptEnabled(t ...
- path和classpath的用途
1 path很明显是unix shell的环境变量,比如bash shell,输入一个命令,它会先去path指定的目录下查找是不是有该命令的可执行文件. 2 -classpath 只是用在下面这种不发 ...
- Linux学习笔记(1)
一.介绍 Linux系统作为服务器操作器的两大优点是其稳定性以及安全性:常见的Linux系统有以下几种: Debian(1993年下半年出的Linux分支) Ubuntu(目前互联网公司使用的比较多的 ...
- Java实现GB2312文件转UTF8文件
有些书带的光盘的源代码是GB2312编码.通常IDE的编码是UTF8.这样直接导入IDE会乱码. 这时候就需要把GB2312的文件转成UTF8的文件.转化的思路很简单,读入流初始化的时候告诉jvm是G ...
- android学习6——canvas的save,restore作用
先看如下代码 public class SaveRestoreActivity extends Activity { @Override public void onCreate(Bundle sav ...
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
前言: 公司的业务组件化推进的已经差不多三四个月的时间了,各个业务组件之间的解耦工作已经基本完成,各个业务组件以module的形式存在项目中,然后项目依赖本地的module,多少有点不太利于项目的并行 ...
- MySQL 5.7 安装完成后,立即要调整的性能选项
原文:MySQL 5.7 Performance Tuning Immediately After Installation 本文是对上一篇<安装 MySQL 后,需要调整的 10 个性能配置项 ...
- homebrew常用命令
安装 ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/Go/install)" 搜索 brew sea ...
- 第二期培训(PING问题定位指导)心得
一.什么是 PING DOS 命令,一般用于检测网络通与不通 ,也叫时延,其值越大,速度越慢 PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序.Pin ...
- linux codeblocks汉化
参考window汉化codeblocks,linux下有点麻烦,就是要找到codeblocks的文件安装在哪里.一般来说,linux下安装的软件大都在/usr/share/文件夹下,所以进入/usr/ ...