adb shell 与 Android 总结及问题
一、adb 启动 Android 应用
手机连接 adb 后,可通过 am 命令做很多操作,可以启动 Service、Broadcast,杀进程,监控等功能:
1.启动Activity: adb shell am start [options] <INTENT> (可使用 am -h 查看帮助)
(1)拨打一个电话:
adb shell am start -a android.intent.action.CALL -d tel:10086 //这里 -a 表示动作,-d 表述传入的数据,还有 -t 表示传入的类型
(2)打开一个网页:
adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com //这里 -d 表示传入的 data, 此处 -d 后的参数可不加引号 “”
(3)打开音乐播放器:
adb shell am start -a android.intent.action.MUSIC_PLAYER
或 adb shell am start -n com.android.music/com.android.music.MusicBrowserActivity // 这里 -n 表示组件
(4)启动 Activity,携带参数:
比如,启动的 Acitvity 所在的 app 是 net.example.demo,需要启动的是其中的 MainActivity,并给他传递两个参数:pid 整数,值为10;str 字符串,"hello",则
// -ei(extra integer)表示参数类型为整型,-es(extra string)表示参数的类型为字符串,然后它们后面分别跟一个键值对,标识参数名和具体值
adb shell am start -a android.intent.action.MAIN -n net.example.demo/net.example.demo.MainActivity --ei pid 10 --es str "hello"
(5)启动 Activity,携带 Uri 参数:
比如,启动的 Acitvity 需要传递参数 flightDate、newOrderState、siteNo、fromMessage,Uri 参数为 imeituan://www.meituan.com/flight/express_status?flightDate=2017-01-22&newOrderState=401&siteNo=729&fromMessage=1,此时可以通过 am 命令 -d 选项来指定 Uri 参数,则
adb shell am start -a android.intent.action.VIEW -c android.intent.category.DEFAULT -d “imeituan://www.meituan.com/flight/express_status?flightDate=2017-01-22\&newOrderState=401\&siteNo=729\&fromMessage=1”
注意:参数中的 "&",须用 "" 对 "&" 进行转义;-d 后的 Uri 参数要加引号“ ”,否则命令不会起作用(具体介绍见这里)。
2.启动一个服务:adb shell am startservice <服务名称>
adb shell am startservice -n com.android.music/com.android.music.MediaPlaybackService
或 adb shell am startservice -a com.example.myservice //这里 -a 表示动作,就是你在 Androidmanifest 里定义的
3.发送一个广播:adb shell am broadcast -a <广播动作>
adb shell am broadcast -a com.example.mybroadcast
4.强制关闭一个应用程序:adb shell am force-stop <PACKAGE>
adb shell am force-stop com.example.test
二、遇到问题
1.有 adb 打开网址:imeituan://www.meituan.com/train/hybrid/web?url=http://i.meituan.com/trip/train/search/
-
将 query 部分编码为 url=http://i.meituan.com/trip/train/search/
=> url=http%3a%2f%2fi.meituan.com%2ftrip%2ftrain%2fsearch%2f' -
然后使用命令启动页面:adb shell am start -a android.intent.action.VIEW -d 'imeituan://www.meituan.com/train/hybrid/web?url=http%3a%2f%2fi.meituan.com%2ftrip%2ftrain%2fsearch%2f'
运行报错:
image.png分析与解决:
-
命令不对,或者电脑 adb 问题,改变命令依然报同样的错误;网上搜原因没办法解决
-
不对 query 编码,直接使用命令 adb shell am start -a android.intent.action.VIEW -d imeituan://www.meituan.com/train/hybrid/web?url=http://i.meituan.com/trip/train/search/成功了!
原因:是因为编码就不能打开网址了?错!将编码后的运行出错的URL重新复制到 word,然后再复制到终端,成功打开了页面。原来是因为文本字符格式的问题,导致命令运行后报错。终端命令的使用一定要注意文本字符格式!
三、adb获取Android应用相关信息
adb shell dumpsys
adb shell dumpsys battery // 获取设备电池信息
adb shell dumpsys cpuinfo // 获取 cpu 信息
adb shell dumpsys wifi // 获取到当前连接的 wifi 名、搜索到的 wifi 列表、wifi强度等
adb shell dumpsys power // 获取电源管理信息
adb shell dumpsys meminfo // 获取内存信息
adb shell dumpsys package // 获取 package 信息
adb shell dumpsys activity // 获取 Activity 信息:此信息还可以通过 AndroidStudio 在 logcat 查看,筛选 ActivityManager 相关的 info 就 ok
adb shell dumpsys notification // 获取通知信息
adb shell dumpsys activity top // 获取当前界面的 UI 信息
adb shell dumpsys telephony.registry // 获取电话信息:电话状态等
adb shell dumpsys meminfo PACKAGE_NAME // 要获取具体应用的内存信息,可加上包名
adb shell dumpsys package PACKAGE_NAME // 获取某个包的信息
adb shell dumpsys activity top | findstr ACTIVITY //获取当前界面的 Activity
adb shell dumpsys display | findstr DisplayDeviceInfo // 获取设备分辨率:DisplayDeviceInfo{"内置屏幕": 1080 x 1920, 55.0 fps, density 480, 464.9 x 468.9 dpi...
adb截屏
adb shell screencap /sdcard/screen.png
adb pull /storage/sdcard/screen.png ./
参考网址: