2,如何在你的应用中执行ADB命令?
1)代码实现:
execShellCmd("input tap 345 1236");
private void execShellCmd(String cmd) { try { Process process = Runtime.getRuntime().exec("sh"); OutputStream outputStream = process.getOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream( outputStream); dataOutputStream.writeBytes(cmd); dataOutputStream.flush(); dataOutputStream.close(); outputStream.close(); } catch (Throwable t) { t.printStackTrace(); }
2)平台签名:
如果不签名的话,应用执行到这里是没有效果的。
签名需要三个文件:platform.x509pem和platform.pk8在源码\build\target\product\security目录下。signapk.jar在\out\host\linux-x86\framework目录下。
拷贝出来之后,将未签名的apk放到相同的文件夹下,执行如下命令:
java -jar signapk.jar platform.x509.pem platform.pk8 需要签名apk 签名完成apk
3)ADB命令扩展:
上篇介绍的adb命令比较局限,仅仅触屏、按键。本小结强化一下。
am :
am start am startservice am stopservice am force-stop am kill am kill-all
am broadcast am instrument am profile start am profile stop am dumpheap
am set-debug-app am clear-debug-app am monitor am hang am restart
am idle-maintenance am screen-compat am to-uri am to-intent-uri
am switch-user am stop-user am stack create am stack movetask am stack resize am stack boxes am stack box
启应用,启服务,发广播~功能好强,但是我就讲一个例子:
am 启动相机!x度一搜命令就出来了。
am start -n com.android.camera/com.android.camera.Camera
也许这条指令在你的设备上能启动相机,但是在我的设备上执行之后,啥都没启动~why?难不成被骗了?查看am后面的参数包star -n 包名/包名.活动名。看看上面的参数,没问题啊。再拿一个已知包名和活动名的应用验证了一下,确实能起来。这样问题就能确定了,是我设备上关于相机的包名或者是活动名字不对。
接下来是怎么查看到正确的包名和活动名字,使用如下命令,dumpsys usagestats 是用来记录打开了程序的哪些activity次数和时间一类信息的,所以包名活动名什么的一览无遗。
dumpsys usagestats | grep cam
将所有包含cam的信息都显示出来
com.android.camera2: 32 times, 8695 ms
com.android.camera.CameraActivity: 32 starts
如此一来就确认是包名活动名都不对,所以正确的命令应该是
am start -n com.android.camera2/com.android.camera.CameraActivity
----to be continued