在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. ARM处理器:开放者的逆袭

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 1981年,英国BBC电视台策划了一系列关于计算机的电视节目.但导演发现一个问题:怎么给没见过电脑的观众画 ...

  2. nodemailer中的几个坑

    nodemailer是什么 nodemailer是一个nodejs的邮件服务模块 如何用nodemailer发邮件 1.先安装nodemailer npm i --save nodemailer 2. ...

  3. 关于H5里的API,上传图片预览功能

    FileReader:读取本地图片文件并显示 写在开头 之前公司要求做一个H5页面,功能是照相和选择相册相片,并且能在屏幕上预览.然后我就傻里吧唧的各种找插件,因为有些插件不适配手机的型号,安卓机基本 ...

  4. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  5. 架构师之路——单一职责原则SRP (我单纯,我快乐)

    定义: 不要存在多于一个导致类变更的原因.通俗地讲,一个类只做一件事情.   单一职责原则的好处: 1.类的复杂性降低,实现什么职责都有清晰明确的定义: 2.可读性提高,复杂性降低,那当然可读性提高了 ...

  6. mfc---右键蹦出菜单

    WM_CONTEXTMENU CMenu menu; menu.LoadMenu(IDR_MENU_POPUP); menu.GetSubMenu(0)->TrackPopupMenu(TPM_ ...

  7. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  8. jquery 的基础知识,以及和Javascript的区别

    想到之前所学的javascript 我们会想到这几个方面:找元素: 操作内容: 操作属性:操作样式:统一操作元素: jquery 也是从这几个方面来学习的. <head> <meta ...

  9. Oracle 一些简单操作

    登录oracle 以root用户切换到oracle数据库用户:su - oracle 输入sqlplus /nolog 不连接任何数据库 conn /as sysdba 用sysdba登录 start ...

  10. 用json传值时,最后一个不加逗号

    <javascript> $('.obj').css( 'position':'relative', 'top':'100px', 'left':'100px' ); </javas ...