Linux基本知识(三):Android命令行工具

参考官方文档

adb命令

adb一种客户端-服务器程序,包括三个组件

  • 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端。
  • 守护进程:在设备上运行命令。守护进程在每个设备上作为后台进程运行。
  • 服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行。
工作原理

当您启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。

然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:

模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推

如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。

服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端(或从某个脚本)控制任意设备。

设备连接:USB调试连接、WLAN连接
  • 在设备上启用adb调试
adb start-server #启动adb-server
adb kill-server #关闭adb-server
  • 通过WLAN连接到设备-用于模拟器
设置目标设备以监听端口 5555 上的 TCP/IP 连接
adb tcpip 5555
通过 IP 地址连接到设备
adb connect device_ip_address

查询设备

adb devices -l #生成已连接设备的列表

序列号+状态+设备详细信息
状态

  • offline:设备未连接到 adb 或没有响应。
  • device:设备现已连接到 adb 服务器。请注意,此状态并不表示 Android 系统已完全启动并可正常运行,因为在设备连接到 adb 时系统仍在启动。不过,在启动后,这是设备的正常运行状态。
  • no device:未连接任何设备。
    已连接设备列表
应用安装卸载查看

pm命令:软件包管理命令

adb shell pm list packages #设备中所有应用
adb shell pm list packsges -s #设备中系统自带应用
adb shell pm list packsge -3 #设备中第三方应用
adb install pah_to_apk#安装包
adb uninstall pm clear "packageName" #卸载包,且清除应用数据与缓存
设置端口转发
adb foward tcp:port1 tcp:port2
复制文件
#要从设备复制文件或目录及其子目录,local是本地机器
adb pull remote local
#要将文件或目录及其子目录复制到设备,remote是远程设备
adb push local remote
adb push 来源文件名称 目标目录
adb shell提供了大多数Unix命令行工具
adb shell ls /system/bin
am命令:调用Activity管理器

Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器,具体不做多讲,常用的有以下:
查看前台 Activity命令:adb shell dumpsys activity activities | grep mFocusedActivity
查看正在运行的 Services命令:adb shell dumpsys activity services “packagename” 其中参数不是必须的,指定 “packagename” 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
查看应用详细信息命令:adb shell dumpsys package “packagename”
调起 Activity命令格式:adb shell am start [options]
例如:adb shell am start -n com.tencent.mm/.ui.LauncherUI表示调起微信主界面
调起 Service命令格式:adb shell am startservice [options]
例如:adb shell am startservice -n
com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService 表示调起微信的某 Service。
强制停止应用命令:adb shell am force-stop “packagename”
例如强制停止淘宝:adb shell am force-stop com.taobao.taobao

截屏
adb shell screencap Filename # 截图
adb pull Filename #将截图下载到本地
录屏
adb shell screenrecord Filename #录屏
adb pull Filename #将截图下载到本地

按 Ctrl + C 键(在 Mac 上,按 Command + C 键)可停止屏幕录制;如果不手动停止,到三分钟或 --time-limit 设置的时间限制时,录制将会自动停止。

模拟器未列出

adb devices 命令的极端命令序列会导致正在运行的模拟器不显示在 adb devices 输出中(即使在您的桌面上可以看到该模拟器)。当满足以下所有条件时,就会发生这种情况:

  1. adb 服务器未在运行
  2. 您在使用 emulator 命令时,将 -port 或 -ports 选项的端口值设为 5554 到 5584 之间的奇数,且
  3. 您选择的奇数号端口处于空闲状态,因此可以与指定端口号的端口建立连接,或者该端口处于繁忙状态,模拟器切换到符合第 2 条中要求的另一个端口,且
  4. 启动模拟器后才启动 adb 服务器。
    要避免出现这种情况,一种方法是让模拟器自行选择端口,并且每次运行的模拟器数量不要超过 16 个。另一种方法是始终先启动 adb 服务器,然后再使用 emulator 命令
停止adb服务器
adb kill-server
获取avd名称列表
emulator -list-avds
从命令行启动模拟器
emulator -avd avd_name
adb devices

avd是什么?Android设备管理器创建和配置运行在Android模拟器中的Android虚拟设备,每个AVD都是一个模拟器配置,模拟一个Android物理设备。
emulator命令位于android_sdk/tools目录下
获取avd名称列表
emulator command参考文档

将命令发送至特定设备

如果有多个设备正在运行,则当您发出 adb 命令时,必须指定目标设备。为此,请使用 devices 命令获取目标设备的序列号。获得序列号后,请结合使用 -s 选项与 adb 命令来指定序列号。如果您要发出很多 adb 命令,可以将 $ANDROID_SERIAL 环境变量设为包含序列号。如果您同时使用 -s 和 $ANDROID_SERIAL,则 -s 会替换 $ANDROID_SERIAL。

adb devices
adb -s emulator -5555 install helloWorld.apk

如果有多个可用设备,但只有一个是模拟器,请使用 -e 选项将命令发送至该模拟器。同样,如果有多个设备,但只连接了一个硬件设备,请使用 -d 选项将命令发送至该硬件设备。

发出adb命令
发出shell命令

adb [-d |-e | -s serial_number] shell shell_command
adb [-d | -e | -s serial_number] shell

要退出交互式 shell,请按 Ctrl + D 键或输入 exit。
adb shell 本身就是一个Linux的shell,可以调用Android内置命令

echo $PATH
ls /system/bin/

常见可操作命令

其他命令

  • apkanalyzer 了解APK的组成;比较两个APK的差异
  • apksigner:为APK签名;验证签名在不同平台上可以通过验证
  • avdmanager:从命令行创建和管理Android虚拟设备(AVD)

adb logcat

logcat命令行工具参考文章
Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用中使用 Log 类写入的消息。

要使用 adb 查看日志输出,请转到您的 SDK platform-tools/ 目录并执行以下命令:
adb shell logcat # 输出全部日志,并且实时
adb shell logcat -e com.ibs.sz #正则表达式筛选匹配的日志
adb shell logcat -d #输出当前全部日志,不实时
adb shell logcat *:W # 输出不低于警告的日志
#V详细--D调试--I信息--W警告--E错误--F严重错误--S静默   由低到高

控制日志输出格式

adb shell logcat -v thread #控制日志输出格式 thread

brief【优先级、标记、发出消息的进程PID】
long【所有元数据字段,使用空白行分隔消息】
process【显示PID】
raw 【显示不包含其他元数据字段的原始日志消息】
tag【仅显示优先级和标记】
thread【旧版格式、显示优先级、PID以及发出消息的线程TID】
threadtime【默认,显示日期、调用时间、优先级、标记、PID以及发出消息线程的TID】
time【日期、调用时间、优先级、标记以及发出消息的进程PID】

格式修饰符

查看备用日志缓冲区

通过代码记录日志

dumpsys命令

dumpsys参考文章
dumpsys比top命令更精确详细

dumpsys -l #Android的所有服务列表
dumpsys input #指定输入服务
dumpsys gfxinfo com.ibs.sz #指定fxinfo,输出中会包含录制阶段所发生的动画帧的相关性能信息
dumpsys gfxinfo com.ibs.sz framestat #提供有关最近发生的帧的更加详细的帧时间信息
dumpsys netstats detail #设备上次启动以来收集的网络使用情况统计信息:活动接口、UID接口、Dev、Xt、UID统计信息
adb shell dumpsys package com.ibs.sz | adb shell grep userId #查找应用的UID
adb shell dumpsys batterystats --charged com.ibs.sz #输出自设备上次充电以来指定应用软件包的电池用量统计信息
adb shell dumpsys procstats --hours 1 #过去一个小时内应用的内存占用情况统计信息

meminfo

统计内存数据
dumpsys meminfo com.xueqiu.android

查看是否有内存泄露,思路:进入一个界面,再返回上级界面,监控Dalvik Heap的Private Dirty指标是否正常的回落到原来的值
meminfo性能查询
cpuinfo

dumpsys cpuinfo

cpuinfo

uiautomator–自动化
uiautomator参考文章

执行自动化
adb shell uiautomator runtest
针对当前的ui布局,创建xml配置文件
adb shell uiautomator dump
adb shell "uiautomator dump --compressed && cat /storage/emulated/legacy/window_dump.xml"

uiautomatorviewer 工具提供了一个方便的 GUI,用于扫描和分析当前显示在 Android 设备上的界面组件。您可以使用此工具来检查布局层次结构并查看设备前台可见的界面组件的属性。利用此信息,您可以使用 UI Automator 创建更精细的测试。例如,通过创建与特定可见属性匹配的界面选择器来做到这一点。

uiautomatorviewer 工具位于 /tools/bin 目录中。
可以实现控件定位。

input

输入
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
点击
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
滚动
press (Default: trackball)
roll <dx> <dy> (Default: trackball)

使用adb连接模拟器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值