一. 基本指令
所有的adb客户端都是用端口 5037与adb服务器对话的. 可以新建一个环境变量,变量名为: ANDROID_ADB_SERVER_PORT 来重新指定adb客户端端口
adb shell rename path/oldfilename path/newfilename 重命名文件
adb shell rm -r <folder> #删除文件夹及其下面所有文件
adb shell mv path/file newpath/file #移动文件
adb shell touch .<filename> %创建一个隐藏文件
adb connect 127.0.0.1:62001 夜神模拟器
adb connect 127.0.0.1:7555 木木模拟器
adb start-server 启动adb服务
adb kill-server 杀死adb服务
杀死一个进程:adb shell kill [pid]
查看进程列表:adb shell ps
查看指定进程状态:adb shell ps -x [PID]
查看某个进程的日志 adb logcat -v process |grep 8607
netstat -ano | findstr "5037" 查看哪个进程占用了
netstat -anop tcp 查看tcp类型的端口
重启到刷机模式 adb reboot bootloader
安装apk到sd卡:adb install -s baidu.apk
获取设备名称:adb shell cat /system/build.prop
空间free状态:adb shell dumpsys diskstats
adb remount--重新挂载系统分区,使系统分区重新可写
adb shell "mount -o rw,remount /cust" --使cust分区可读写
adb shell dumpsys | findstr "DUMP OF SERVICE" //列举当前手机所有支持的dumpsys命令
adb shell dumpsys activity packagename //查看指定包名的activity信息
adb shell dumpsys window | findstr mCurrentFocus 命令查看当前运行的包名和Activity更清晰一些。
aapt dump badging D:\QQ.apk |findstr "package" 查看未安装包的activity
aapt dump badging D:\QQ.apk |findstr "launchable activity" 查看未安装包的activity
启动应用:adb shell am start -n <package_name>/.<activity_class_name>
adb shell pm list packages 查看手机上所有应用的packageName
adb shell pm list packages -f 查看手机上所有应用的包名和路径
adb shell pm path com.huawei.mycenter 查看包的安装路径
adb shell getprop | findstr release 查看系统版本
adb shell getprop ro.build.version.sdk 获取系统api版本
//内存使用率
adb shell dumpsys meminfo |findstr packagename
adb shell top -n 1 | findstr packagename
Android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。Android程序内存一般限制在16M,当然也有24M的。从meminfo信息可以看到该应用程序占用的native和dalvik,当TOTAL 超过内存最大限制时会出现OOM错误。
单个应用程序最大的内存限制:adb shell getprop |findstr heapgrowthlimit
查看总体的RAM:cat /proc/meminfo | head -n 4
//CPU占有率
adb shell top -d 1 |findstr packagename
adb shell dumpsys cpuinfo |findstr com.huawei.mycenter
0.2% 11090/com.huawei.mycenter: 0.1% user + 0% kernel / faults: 8 minor
0.2%是针对这个CPU的占用率是6.4%,0.1%占用率是用户使用的,0%是内核的占用率,这个数只是针对1核来说,
//流量
adb shell cat /proc/appPID/net/dev |findstr wlan
//帧率
adb shell dumpsys gfxinfo packagename > fps.txt 测试FPS的方法
二. am
am和pm命令必须先切换到adb shell模式下才能使用
am全称activity manager,可使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。当你在adb shell命令下执行am命令:am <command>
●启动app am start -n {packageName}/{activityName}
●杀app的进程 am kill <packageName>
●强制停止一切 am force-stop <packageName>
●启动服务am startservice
●停止服务 am stopservice
●打开网站 am start -a android.intent.action.VIEW -d http://www.xxx.com/
●拨打10086 am start -a android.intent.action.CALL -d tel:10086
三、pm
am和pm命令必须先切换到adb shell模式下才能使用
pm全称package manager,可使用pm命令去模拟Android行为或者查询设备上的应用等,
在adb shell命令下执行pm命令:pm <command>
●列出手机所有的包名 pm list packages
●安装/卸载 pm install/uninstall
●清除APK数据与缓存adb shell pm clear <packagename>
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
查看应用列表,pm即PackageManager
参数 解释
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
比如查看第三方应用:adb shell pm list packages -3
四、getprop
此命令的原理很简单,就是从系统的各种配置文件中读取信息。那么这些文件在你用adb shell进入设备内部后很容易找到,它们是:init.rc、default.prop、/system/build.prop
此时直接使用cat命令也是可以把这些信息显示出来的。 下面列出比较常用的信息
1.获得IP
adb shell getprop dhcp.wlan0.ipaddress
2.手机名称
adb shell getprop ro.product.device
adb shell getprop ro.product.model
adb shell getprop ro.product.name
3.serial number
adb shell getprop ro.serialno
4.屏幕密度
adb shell getprop ro.sf.lcd_density
只要使用adb shell getprop就可以把所有的信息都打印出来。而使用setprop命令就可以进行相对应的设置啦。
五、dumpsys
Android系统启动时会有大批的服务随之启动,那么我们就可以用dumpsys命令来查看每个服务的运行情况。
六. 远程ADB
为避免使用数据线,可通过wifi通信,前提是手机与PC处于同一局域网
启动方法:
adb tcpip 5555 //这一步,必须通过数据线把手机与PC连接后再执行
adb connect <手机IP>
停止方法:
adb disconnect //断开wifi连接
adb usb //切换到usb模式
七. logcat
(1)基础
adb logcat –help #可以显示该命令的帮助信息;
adb logcat 命令格式 : adb logcat [选项] [过滤项] #中括号中是可选的;
停止方法: adb shell kill logcatpid
其中logcat_pid 通过 如下命令获取
adb shell ps | grep logcat # linux 平台
adb shell ps | findstr “logcat” #Windows平台
(2) 选项
”-s”选项 : 设置输出日志的标签, 只显示该标签的日志;
”-f”选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
”-r”选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
”-n”选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
”-v”选项 : 设置日志的输出格式, 注意只能设置一项;
”-c”选项 : 清空所有的日志缓存信息;
”-d”选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
”-t”选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
”-g”选项 : 查看日志缓冲区信息;
”-b”选项 : 加载一个日志缓冲区, 默认是 main, 下面详解;
”-B”选项 : 以二进制形式输出日志;
输出指定标签内容 :
”-s”选项 : 设置默认的过滤器, 如 我们想要输出 “System.out” 标签的信息, 就可以使用adb logcat -s System.out 命令;
输出日志信息到文件 :
”-f”选项 : 该选向后面跟着输入日志的文件, 使用adb logcat -f /sdcard/log.txt 命令, 注意这个log文件是输出到手机上,需要指定合适的路径。
指定 logcat 的日志输出格式 : ”-v”参数
”brief”格式 : 这是默认的日志格式“优先级/标签/进程ID : 日志信息” , 使用adb logcat -v brief 命令;
”process”格式 : ” 优先级/进程ID : 日志信息 “, 使用adb logcat -v process 命令;
”tag”格式 : ” 优先级/标签 : 日志信息”, 使用adb logcat -v tag 命令;
”thread”格式 : ” 优先级/进程ID : 线程ID/标签 : 日志信息“, 使用adb logcat -v thread 命令;
”raw”格式 : 只输出日志信息, 不附加任何其他信息(优先级、标签等), 使用adb logcat -v raw 命令;
”time”格式 : ”日期 时间 优先级/标签/进程ID: 进程名称 : 日志信息 “, 使用adb logcat -v time 命令;
”long”格式:” [ 日期 时间 进程ID : 线程ID 优先级/标签] 日志信息 “, 输出以上提到的所有的头信息, 使用adb logcat -v long 命令;
清空日志缓存信息 :
使用 adb logcat -c 命令, 可以将之前的日志信息清空, 重新开始输出日志信息;
将缓存日志输出 :
使用 adb logcat -d 命令, 输出命令, 之后推出命令, 不会进行阻塞;
输出最近的日志 :
使用adb logcat -t 5 命令, 可以输出最近的5行日志, 并且不会阻塞;
以二进制形式输出日志 :
使用 adb logcat -B 命令; adb logcat -B -t 5 #以二进制输出最近5条
查看日志缓冲区信息 :
使用 adb logcat -g 命令;
加载日志缓冲区 :
使用 adb logcat -b 缓冲区类型 命令;
Android中的日志缓冲区 :
system缓冲区 - 与系统相关的日志信息; radio缓冲区 - 广播电话相关的日志信息;events缓冲区 - 事件相关的日志信息;main缓冲区 - 默认的缓冲区;
(3) 过滤项解析
过滤项格式 : <tag>[:priority] , 默认的日志过滤项是 *:I
V : Verbose (明细);
D : Debug (调试);
I : Info (信息);
W : Warn (警告);
E : Error (错误);
F: Fatal (严重错误);
S : Silent最高的优先级, 可能不会记载东西;
过滤指定等级的日志 :
使用 adb logcat *:W 命令, 显示W及以上级别的日志(即W、E、F、S);
过滤指定标签等级的日志 :
使用 adb logcat WifiHW:D *:S 命令进行过滤;
命令含义 : 输出日志, 日志是标签为 WifiHW的日志, 并且优先级为Debug(调试)等级以上的级别的日志;
注意 : 如果没有*:S就会日志输出会错误;
可以同时设置多个过滤器 :
使用adb logcat WifiHW:D dalvikvm:I *:S 命令, 输出 WifiHW 标签 的 Debug 以上级别 和 dalvikvm 标签的 Info 以上级别的日志;
(4) 综合
选项和过滤项组合
adb logcat -v time -t 10 *:I
与其他命令组合过滤固定字符串
过滤固定字符串 : adb logcat | grep Wifi ;(只要命令行出现的日志都可以过滤, 不管是不是标签;)
过滤字符串忽略大小写 : adb logcat | findstr -I wifi ;
综合组合
adb logcat -v time *:I | findstr -I wifi
使用正则表达式匹配
分析日志 : 该日志开头两个字符是 “V/”, 后面开始就是标签, 写一个正则表达式 “^..ActivityManager”, 就可以匹配日志中的 “V/ActivityManager” 字符串;V/ActivityManager( 574): getTasks: max=1, flags=0, receiver=null
正则表达式过滤日志: 使用上面的正则表达式组成命令 adb logcat | grep “^..Activity” ;
七、效率脚本
1、解决5037端口占用的方法
1.cmd窗口 输入命令 netsta -ano|findstr "5037" 回车记住 占用此端口的应用PID,如图中圈出的数字18232
2.然后输入命令 tasklist|findstr "PID" 查看占用该端口的应用程序
或者是进入到任务管理器查看占用程序。找到该应用程序之后 结束进程就可以了
2、解决adb端口被占用bat
@echo off color a title ReleaseAdbPort echo Checking adb port... for /F "usebackq tokens=5" %%a in (`"netstat -ano | findstr "5037""`) do ( if not "%%a" =="0" call :ReleasePort %%a ) echo --------------------------- echo adb port has been released! echo --------------------------- pause exit :ReleasePort TASKKILL /f /PID %1
3、自动安装APK.bat
ECHO [安装APK]
ECHO -------------------------------
ECHO [等待插入手机...]
adb wait-for-device
ECHO [安装] %~nx1
adb install -r %1
ECHO [暂停5秒自动关闭...]
ping -n 5 127.0.0.1>nul
@ECHO ON
使用方法:将APK直接拖至bat文件上即可
4、读取手机信息存至文件.bat
ECHO [读取手机信息]
ECHO -------------------------------
adb shell cat /system/build.prop>%~dp0\phone.info
FOR /F "tokens=1,2 delims==" %%a in (phone.info) do (
IF %%a == ro.build.version.release SET androidOS=%%b
IF %%a == ro.product.model SET model=%%b
IF %%a == ro.product.brand SET brand=%%b
)
del /a/f/q %~dp0\phone.info
ECHO.
ECHO.手机品牌: %brand%
ECHO.手机型号: %model%
ECHO.系统版本: Android %androidOS%
ECHO.-------------------------------
ECHO.手机品牌: %brand%>"%~dp0\Phone_%model%.txt"
ECHO.手机型号: %model%>>"%~dp0\Phone_%model%.txt"
ECHO.系统版本: Android %androidOS%>>"%~dp0\Phone_%model%.txt"
ECHO [暂停5秒自动关闭...]
ping -n 5 127.0.0.1>nul
@ECHO ON
5、快速手机截屏.bat
ECHO.[快速手机截屏]
ECHO.-------------------------------
ECHO.[Exce ] 手机截屏
adb shell screencap -p /sdcard/screen.png
ECHO.[Tips ] 拷贝截屏图片至电脑
adb pull /sdcard/screen.png "%~dp0\screen.png"
ren screen.png "%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.png"
adb shell rm /sdcard/screen.png
ECHO [暂停2秒自动关闭...]
ping -n 2 127.0.0.1>nul
@ECHO ON
6、导出Logcat日志.bat
ECHO.[导出logcat日志]
ECHO.-------------------------------
adb logcat -d>"%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.log"
ECHO.[暂停5秒自动关闭...]
ping -n 5 127.0.0.1>nul
@ECHO ON
7、性能数据.bat
title 性能数据获取
@echo off
color 0a
set package1=com.huawei.appmarket
set package2=com.huawei.app
REM 获取日期和小时,小时格式为24小时制,10点前补0
SET c_date=%date:~0,4%%date:~5,2%%date:~8,2%
SET ctime=%time:~0,2%
IF /i %ctime% LSS 10 (
SET ctime=0%time:~1,1%
)
SET c_time=%ctime%%time:~3,2%%time:~6,2%
REM 用日期和时间点做日志文件名
IF NOT EXIST %~dp0\%c_date% md %~dp0\%c_date%_%c_time%
SET logdir="%~dp0\%c_date%_%c_time%"
SET nowtime=%c_date%%c_time%
adb shell cat /system/build.prop>phone.info
FOR /F "tokens=1,2 delims==" %%a in (phone.info) do (
IF %%a == ro.build.version.release SET androidOS=%%b
IF %%a == ro.product.model SET model=%%b
IF %%a == ro.product.brand SET brand=%%b
)
del /a/f/q phone.info
ECHO 手机基本信息>"%logdir%\%model%phone.txt"
ECHO 手机品牌:%brand%>>"%logdir%\%model%phone.txt"
ECHO.手机型号:%model%>>"%logdir%\%model%phone.txt"
ECHO.系统版本:Android%androidOS%>>"%logdir%\%model%phone.txt"
ECHO.测试时间:%nowtime%>>"%logdir%\%model%phone.txt"
::将命令放在单引号中命令会被执行,将命令放在双引号中,命令会被当成字符串读取。
for /f "tokens=2 delims= " %%y IN ('adb shell "ps | grep %package1%"') do @set PID=%%y
adb shell dumpsys meminfo %package1% | findstr "SwapPss" > "%logdir%\mem_info.txt"
adb shell top -n 1 | findstr "PID" >"%logdir%\cup_info.txt"
adb shell cat /proc/"%PID%"/net/dev |findstr "Inter-" >"%logdir%\net_info.txt"
REM 重置所有计数器
REM adb shell dumpsys gfxinfo %package1% reset
:start
adb shell dumpsys meminfo %package1% |findstr [^:] | findstr "TOTAL">> "%logdir%\mem_info.txt"
adb shell top -n 1 | findstr %package2% >>"%logdir%\cup_info.txt"
adb shell cat /proc/"%PID%"/net/dev |findstr wlan >>"%logdir%\net_info.txt"
adb shell dumpsys gfxinfo %package1% >>"%logdir%\fps_info.txt"
REM fps统计需要打开开发者--GPU呈现模式分析--选在屏幕上显示为条形图或在屏幕上显示为线型图
ping -n 5 127.1>nul
goto start