[整理]ADB命令行学习笔记

global driver
# 元素定位
driver.find_element_by_id("id") # id定位
driver.find_element_by_name("name") # name定位
driver.find_element_by_link_text("text") # 链接名定位
driver.find_element_by_partial_link_text("text") # 通过元素部分可见链接文本定位
driver.find_element_by_tag_name("name") # 通过查找html的标签名称定位元素
driver.find_element_by_xpath("xpath") # 路径定位
driver.find_element_by_class_name("android.widget.LinearLayout") # 类名定位
driver.find_element_by_css_selector("css") # css选择器定位

# 元素集合复数定位
driver.find_elements_by_id("id") # id元素集合
driver.find_elements_by_name("name") # name元素集合
driver.find_elements_by_link_text("text") # 链接名元素集合
driver.find_elements_by_partial_link_text("text") # 部分元素可见链接集合
driver.find_elements_by_tag_name("name") # html标签名集合
driver.find_elements_by_xpath("xpath") # 路径定位集合
driver.find_elements_by_class_name("android.widget.LinearLayout") # 类名定位集合
driver.find_elements_by_css_selector("css") # css选择器定位集合

# 输入框输入
driver.element.send_keys("中英")

# 锁定屏幕
driver.lock(5)

# 把当前应用置于后台
driver.background_app(5)

# 收起键盘
driver.hide_keyboard()

# 打开一个应用或者activity,仅安卓端
driver.start_activity('com.example.android.apis', '.Foo')

# 打开下拉通知栏 仅Android
driver.open_notifications()

# 拖动元素,将元素origin_el拖到目标元素destination_el
driver.drag_and_drop(self, origin_el, destination_el):

# 检查app是否已安装
driver.is_app_installed('com.example.android.apis')

# 安装应用到设备
driver.install_app('path/to/my.apk')

# 删除应用
driver.remove_app('com.example.android.apis')

# 模拟设备摇晃
driver.shake()


# 关闭应用
driver.close_app()

# 启动 (Launch)
# 根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。
# 这不是用于启动指定的 app/activities ————你可以使用 start_activity 做到这个效果————
# 这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的。
driver.launch_app()

# 应用重置,相当于重新卸载安装
driver.reset()

# 可用上下文 (context) 列出所有的可用上下文
# 翻译备注:context可以理解为 可进入的窗口 。例如,对于原生应用,可用的context和默认context均为NATIVE_APP。
# 详情可查看对混合应用进行自动化测试
driver.contexts

# 列出当前上下文
driver.current_context

# 切换到默认的上下文 (context)
# 将上下文切换到默认上下文
driver.switch_to.context(None)

# 获取应用的字符串
driver.app_strings

# 按键事件 (Key Event)给设备发送一个按键事件
driver.keyevent(176)

# 获取当前的activity
driver.current_activity

# 触摸动作(TouchAction) / 多点触摸动作(MultiTouchAction)
action = TouchAction(driver)
action.press(element=el, x=10, y=10).release().perform()

# 滑动(Swipe)模拟用户滑动
# 注意:appium滑动规则是x从左到右变大,y从上到下变大
driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)

# 捏 (Pinch)捏屏幕 (双指往内移动来缩小屏幕)
driver.pinch(element=el)

# 放大 (Zoom)放大屏幕 (双指往外移动来放大屏幕)
driver.zoom(element=el)

# 滑动到某个元素 (Scroll To)
todo: python

# 从设备中拉出文件 (Pull File)
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')

# 推送文件到设备中去
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))

# 断言
Assert.assertEquals("I am a div", div.getText()); //跳转到指定页面并在该页面所以用元素id进行交互

# 检查文本是否符合预期
assertEqual('I am a div', div.text)

# 输入法是否有活动 返回真假
is_ime_active(self):

# 返回当前安卓设备可用的输入法
driver.available_ime_engines(self):

# 激活安卓设备中的制定输入法
driver.activate_ime_engine(self, engine):

# 关闭当前的输入法(android)
driver.deactivate_ime_engine(self):

# 打开安卓设备上的位置定位设置
driver.toggle_location_services()

# 设置设备的经纬度
:Args:
- latitude纬度 - String or numeric value between -90.0 and 90.00
- longitude经度 - String or numeric value between -180.0 and 180.0
- altitude海拔高度- String or numeric value
用法 driver.set_location(纬度,经度,高度)

# 点击
element.click()

# 清除元素内容
element.clear()

# 返回元素的文本内容
element.text()

# 提交表单
element.submit(self):

# 元素是否可用
element.is_enabled()

# 元素是否可选
element.is_slected()

# 元素是否可见
element.is_displayed()

# 获取元素的大小(高和宽)
new_size["height"] = size["height"]
new_size["width"] = size["width"]
driver.element.size

# 获取元素左上角的坐标
# 用法 driver.element.location
'''返回element的x坐标, int类型'''
driver.element.location.get('x')
'''返回element的y坐标, int类型'''
driver.element.location.get('y')

# 获取当前元素的截图为Base64编码的字符串
img_b64 = element.screenshot_as_base64

# 执行JS
# 在当前窗口/框架(特指 Html 的 iframe )同步执行 javascript 代码
driver.execute_script('document.title')
# 异步执行代码,其他代码在执行
driver.execute_async_script('document.title')

# 获取当前url
driver.current_url

# 获取页面源
driver.page_source

# 关闭当前窗口
driver.close()


# 关闭应用
driver.quit()

# chrome上进行测试
{
'platformName': 'Android',
'platformVersion': '4.4',
'deviceName': 'Android Emulator',
'browserName': 'Chrome'
}

# 真机测试
{
'automationName': 'Selendroid',
'platformName': 'Android',
'platformVersion': '2.3',
'deviceName': 'Android Emulator',
'app': myApp,
'appPackage': 'com.mycompany.package',
'appActivity': '.MainActivity'
}

# 多点触控
"""
规范中的可用事件有:
* 短按 (press)
* 释放 (release)
* 移动到 (moveTo)
* 点击 (tap)
* 等待 (wait)
* 长按 (longPress)
* 取消 (cancel)
* 执行 (perform)
"""

 

5.8 服务器参数
Appium 服务器参数

使用方法: node . [标志]
服务器标志

所有的标志都是可选的,但是有一些标志需要组合在一起才能生效。


标志 默认值 描述 例子
--shell null 进入 REPL 模式
--localizable-strings-dir en.lproj IOS only: 定位 .strings所在目录的相对路径 --localizable-strings-dir en.lproj
--app null iOS: 基于模拟器编译的 app 的绝对路径或者设备目标的 bundle_id; Android: apk 文件的绝对路径--app /abs/path/to/my.app
--ipa null (IOS-only) .ipa 文件的绝对路径 --ipa /abs/path/to/my.ipa
-U, --udid null 连接物理设备的唯一设备标识符 --udid 1adsf-sdfas-asdf-123sdf
-a, --address 0.0.0.0 监听的 ip 地址 --address 0.0.0.0
-p, --port 4723 监听的端口 --port 4723
-ca, --callback-address null 回调IP地址 (默认: 相同的IP地址) --callback-address 127.0.0.1
-cp, --callback-port null 回调端口号 (默认: 相同的端口号) --callback-port 4723
-bp, --bootstrap-port 4724 (Android-only) 连接设备的端口号 --bootstrap-port 4724
-k, --keep-artifacts false 弃用,无效。trace信息现在保留tmp目录下,每次运行前会清除该目录中的信息。 也可以参考 --trace-dir 。
-r, --backend-retries 3 (iOS-only) 遇到 crash 或者 超时,Instrument 重新启动的次数。 --backend-retries 3
--session-override false 允许 session 被覆盖 (冲突的话)
--full-reset false (iOS) 删除整个模拟器目录。 (Android) 通过卸载应用(而不是清除数据)重置应用状态。在 Android 上,session 完成后也会删除应用。
--no-reset false session 之间不重置应用状态 (iOS: 不删除应用的 plist 文件; Android: 在创建一个新的 session 前不删除应用。)
-l, --pre-launch false 在第一个 session 前,预启动应用 (iOS 需要 --app 参数,Android 需要 --app-pkg 和 --app-activity)
-lt, --launch-timeout 90000 (iOS-only) 等待 Instruments 启动的时间
-g, --log null 将日志输出到指定文件 --log /path/to/appium.log
--log-level debug 日志级别; 默认 (console[:file]): debug[:debug] --log-level debug
--log-timestamp false 在终端输出里显示时间戳
--local-timezone false 使用本地时间戳
--log-no-colors false 不在终端输出中显示颜色
-G, --webhook null 同时发送日志到 HTTP 监听器 --webhook localhost:9876
--native-instruments-lib false (IOS-only) iOS 内建了一个怪异的不可能避免的延迟。我们在 Appium 里修复了它。如果你想用原来的,你可以使用这个参数。
--app-pkg null (Android-only) 你要运行的apk的java包。 (例如, com.example.android.myApp) --app-pkg com.example.android.myApp
--app-activity null (Android-only) 打开应用时,启动的 Activity 的名字(比如, MainActivity) --app-activity MainActivity
--app-wait-package false (Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp) --app-wait-package com.example.android.myApp
--app-wait-activity false (Android-only) 你想等待的 Activity 名字(比如, SplashActivity) --app-wait-activity SplashActivity
--android-coverage false (Android-only) 完全符合条件的 instrumentation 类。 作为命令 adb shell am instrument -e coverage true -w 的 -w 的参数 --android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation
--avd null (Android-only) 要启动的 avd 的名字
--avd-args null (Android-only) 添加额外的参数给要启动avd --avd-args -no-snapshot-load
--device-ready-timeout 5 (Android-only) 等待设备准备好的时间,以秒为单位 --device-ready-timeout 5
--safari false (IOS-Only) 使用 Safari 应用
--device-name null 待使用的移动设备名字 --device-name iPhone Retina (4-inch), Android Emulator
--platform-name null 移动平台的名称: iOS, Android, or FirefoxOS --platform-name iOS
--platform-version null 移动平台的版本 --platform-version 7.1
--automation-name null 自动化工具的名称: Appium or Selendroid --automation-name Appium
--browser-name null 移动浏览器的名称: Safari or Chrome --browser-name Safari
--default-device, -dd false (IOS-Simulator-only) 使用instruments自己启动的默认模拟器
--force-iphone false (IOS-only) 无论应用要用什么模拟器,强制使用 iPhone 模拟器
--force-ipad false (IOS-only) 无论应用要用什么模拟器,强制使用 iPad 模拟器
--language null iOS / Android 模拟器的语言 --language en
--locale null Locale for the iOS simulator / Android Emulator --locale en_US
--calendar-format null (IOS-only) iOS 模拟器的日基本用法
基本命令
adb基本命令,基本语法如下:

adb [-d|-e|-s ]
复制代码
如果当前连接只有一个设备,可以直接省略掉[-d|-e|-s ] 这一部分,直接使用 adb

为命令行指定目标设备
如果有多台设备或模拟器连接,需要指定目标设备

参数 含义
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s 指定相应 serialNumber 号的设备/模拟器为命令目标
在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过 adb devices 命令获取。如:

$ adb devices

List of devices attached
cf668fa device
emulator-555 device
196.168.1.150:5555 device
复制代码
这里的cf668fa以及emulator-555和196.168.1.150:5555都称为serialNumber。

停止/启动
adb start-server
复制代码
启动adb,但是由于系统会自动启动,无需主动调用

adb kill-server
复制代码
停止adb,多用于PC存在多个adb时,全部关闭

查看adb的版本
adb version
复制代码
运行后结果如下:

可见版本为1.0.40. 安装地址在D:\SDK\platform-tools\adb.exe.但是需要在环境变量中配置adb的path路径。
root权限
adb虽然可以用来做一些Root操作,但是前提是设备必须具备root权限,学习可以考虑用虚拟机。 命令:

adb root
复制代码
恢复root:

adb unroot
复制代码
设置adb的网络端口
命令:

adb -P start-server
复制代码
这个几乎很少使用,不知到具体用处,之后补充记录

设备连接
查询设备
查询当前adb连接的设备信息

adb devices
复制代码
List of devices attached
0000119030001002 device
复制代码
输出的组成格式为[serialNumber] [state],其中0000119030001002为设备编号SN,device为设备的状态。设备的状态可以分为以下几种:

offline —— 表示设备未连接成功或无响应。

device —— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。

no device —— 没有设备/模拟器连接。

该命令为常用命令,多会使用。

USB连接
USB连接就是通过USB线,以及adb来连接Android设备,也是开发工作中使用得最多的连接方式。一般手机需要打开[ 设置」-「开发者选项」-「Android 调试」。如果没有该选项,可以到「设置」-「关于手机」连续点击「版本号」可以打开开发者选项。

USB无线
其实除了USB连接设备外,还可以通过无线网的方式连接,虽然开始需要USB线连接,但是想想可以离开USB线的限制,是不是也有一点小激动呢。操作步骤如下

首先,确认PC和设备是处于同一局域网下,比如同一个路由下的wiffi。这是非常重要的。
其次,将PC和设备通过USB连接在一起,通过adb devices确认是否连接成功.
然后,让设备在555端口监听TCP/IP 连接,当然部分特殊设备端口不是555,酌情调整:
adb tcpip 555
复制代码
之后,断开USB线连接
通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.
使用命令行和得到的IP地址连接设备
adb connect
复制代码
也就是之前找到的ip地址.

最后,使用adb devices检测是否成功连接设备
无线连接(root)
无线连接的首要条件就是需要root权限.所以一开始就是adb root开启root权限。然后操作步骤与USB一样,但是无需连接USB线。 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。

首先,打开 Android 设备上的终端模拟器,在里面依次运行命令:
su
setprop service.adb.tcp.port 5555
复制代码
再者,通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.

最后,在电脑上通过 adb 和 IP 地址连接 Android 设备。

adb connect
复制代码
这里的 就是上一步中找到的设备 IP 地址。

如果能看到 connected to :端口 这样的输出则表示连接成功。

Package管理
查阅应用列表
查阅应用列表的adb命令行模式如下:

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
复制代码
前部分adb shell pm list packages为获取当前设备中所有应用的package信息,后面为过滤符。其中支持的过滤参数列表整理如下:

参数 显示列表
无 所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
包名包含 字符串
ps:除了直接可以过滤外,还可以使用grep做筛选 比如:

adb shell pm list packages clouwalk
复制代码

adb shell pm list packages |grep cloudwalk
复制代码
(部分设备不支持)

安装应用
安装应用为常用的adb命令行,其格式如下:

adb install [-xxx]
复制代码
其中xxx为修饰参数,用来指定应用apk的安装方式,具体可以有以下几种修饰方式:

参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
出现如Success标识,代表安装成功。出现Failure [xxx],代表失败.常见的失败选项如下:

输出 含义 解决方法
INSTALL_FAILED_ALREADY_EXISTS 应用已经存在,或卸载了但没卸载干净 adb install 时使用 -r 参数,或者先 adb uninstall 再安装
INSTALL_FAILED_INVALID_APK 无效的 APK 文件 检查apk文件的完整性和有效性
INSTALL_FAILED_INVALID_URI 无效的 APK 文件名 确保 APK 命名文件名里无中文或特殊字符
INSTALL_FAILED_INSUFFICIENT_STORAGE 空间不足 清理空间
INSTALL_FAILED_DUPLICATE_PACKAGE 已经存在同名程序 更改应用名或adb uninstall 再安装
INSTALL_FAILED_NO_SHARED_USER 请求的共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致 先 adb uninstall 再安装
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 请求的共享用户存在但签名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安装包使用了设备上不可用的共享库
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替换时无法删除
INSTALL_FAILED_DEXOPT dex 优化验证失败或空间不足
INSTALL_FAILED_OLDER_SDK 设备系统版本低于应用要求
INSTALL_FAILED_CONFLICTING_PROVIDER 设备里已经存在与应用里同名的 content provider
INSTALL_FAILED_NEWER_SDK 设备系统版本高于应用要求
INSTALL_FAILED_TEST_ONLY 应用是 test-only 的,但安装时没有指定 -t 参数
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容设备 CPU 应用程序二进制接口的 native code
INSTALL_FAILED_MISSING_FEATURE 应用使用了设备不可用的功能
INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 访问失败;
2. 应用签名与 ROM 签名一致,被当作内置应用。 1. 确认 sdcard 可用,或者安装到内置存储;
2. 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安装到指定位置;
2. 应用签名与 ROM 签名一致,被当作内置应用。 1. 切换安装位置,添加或删除 -s 参数;
2. 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_MEDIA_UNAVAILABLE 安装位置不可用 一般为 sdcard,确认 sdcard 可用或安装到内置存储
INSTALL_FAILED_VERIFICATION_TIMEOUT 验证安装包超时
INSTALL_FAILED_VERIFICATION_FAILURE 验证安装包失败
INSTALL_FAILED_PACKAGE_CHANGED 应用与调用程序期望的不一致
INSTALL_FAILED_UID_CHANGED 以前安装过该应用,与本次分配的 UID 不一致 清除以前安装过的残留文件
INSTALL_FAILED_VERSION_DOWNGRADE 已经安装了该应用更高版本 使用 -d 参数
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限
INSTALL_PARSE_FAILED_NOT_APK 指定路径不是文件,或不是以 .apk 结尾
INSTALL_PARSE_FAILED_BAD_MANIFEST 无法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到异常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安装包没有签名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安装该应用,且签名与 APK 文件不一致 先卸载设备上的该应用,再安装
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK 文件时遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest 文件里没有或者使用了无效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件里指定了无效的共享用户 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest 文件时遇到结构性错误
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest 文件里找不到找可操作标签(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR 因系统问题安装失败
INSTALL_FAILED_USER_RESTRICTED 用户被限制安装应用 在开发者选项里将「USB安装」打开,如果已经打开了,那先关闭再打开。
INSTALL_FAILED_DUPLICATE_PERMISSION 应用尝试定义一个已经存在的权限名称
INSTALL_FAILED_NO_MATCHING_ABIS 应用包含设备的应用程序二进制接口不支持的 native code
INSTALL_CANCELED_BY_USER 应用安装需要在设备上确认,但未操作设备或点了取消 在设备上同意安装
INSTALL_FAILED_ACWF_INCOMPATIBLE 应用程序与设备不兼容
INSTALL_FAILED_TEST_ONLY APK 文件是使用 Android Studio 直接 RUN 编译出来的文件 通过 Gradle 的 assembleDebug 或 assembleRelease 重新编译,或者 Generate Signed APK
does not contain AndroidManifest.xml 无效的 APK 文件
is not a valid zip file 无效的 APK 文件
Offline 设备未连接成功 先将设备与 adb 连接成功
unauthorized 设备未授权允许调试
error: device not found 没有连接成功的设备 先将设备与 adb 连接成功
protocol failure 设备已断开连接 先将设备与 adb 连接成功
Unknown option: -s Android 2.2 以下不支持安装到 sdcard 不使用 -s 参数
No space left on device 空间不足 清理空间
Permission denied ... sdcard ... sdcard 不可用
signatures do not match the previously installed version; ignoring! 已安装该应用且签名不一致 先卸载设备上的该应用,再安装
参考:PackageManager.java adb install 实际是分三步完成:

push apk 文件到 /data/local/tmp。

调用 pm install 安装。

删除 /data/local/tmp 下的对应 apk 文件。

所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。

卸载应用
命令:

adb uninstall [-k]
复制代码
表示应用的包名,-k参数可选,表示卸载应用但保留数据和缓存目录。

命令示例:

adb uninstall com.qihoo360.mobilesafe
复制代码
表示卸载设备上的360 手机卫士。

清除应用数据和缓存数据
adb shell pm clear
复制代码
例如:

adb shell pm clear com.tecent.mobleqq
复制代码
这个命令就可以清除掉手机QQ上所有的本地缓存数据和应用数据。这个命令为常用命令

查看正在运行的service
adb shell dumpsys activity services []
复制代码
参数不是必须的,指定表示查看与某个包名相关的 Services,不指定表示查看所有 Services。

不一定要给出完整的包名

查看应用详细信息
adb shell dumpsys package
复制代码
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。

表示应用包名。

查看应用安装途径
adb shell pm path
复制代码
输出应用安装路径.效果如下:

应用交互
与应用交互的关键字为am 命令,常用的command命令如下:

command 用途
start [options] 启动 指定的 Activity
startservice [options] 启动 指定的 Service
broadcast [options] 发送 指定的广播
force-stop 停止 相关的进程
参数很灵活,和写 Android 程序时代码里的 Intent 相对应。 用于决定 intent 对象的选项如下:

参数 含义
-a 指定 action,比如 android.intent.action.VIEW
-c 指定 category,比如 android.intent.category.APP_CONTACTS
-n 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity
启动应用/ 调起 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 startservice -n com.android.systemui/.SystemUIService
复制代码
停止service
adb shell am stopservice [options]
复制代码
发送广播
adb shell am broadcast [options]
复制代码
可以向所有组件广播,也可以只向指定组件广播。

例如,向所有组件广播 BOOT_COMPLETED:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
复制代码
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceive
复制代码
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。 既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:

action 触发时机
android.net.conn.CONNECTIVITY_CHANGE 网络连接发生变化
android.intent.action.SCREEN_ON 屏幕点亮
android.intent.action.SCREEN_OFF 屏幕熄灭
android.intent.action.BATTERY_LOW 电量低,会弹出电量低提示框
android.intent.action.BATTERY_OKAY 电量恢复了
android.intent.action.BOOT_COMPLETED 设备启动完毕
android.intent.action.DEVICE_STORAGE_LOW 存储空间过低
android.intent.action.DEVICE_STORAGE_OK 存储空间恢复
android.intent.action.PACKAGE_ADDED 安装了新的应用
android.net.wifi.STATE_CHANGE WiFi 连接状态发生变化
android.net.wifi.WIFI_STATE_CHANGED WiFi 状态变为启用/关闭/正在启动/正在关闭/未知
android.intent.action.BATTERY_CHANGED 电池电量发生变化
android.intent.action.INPUT_METHOD_CHANGED 系统输入法发生变化
android.intent.action.ACTION_POWER_CONNECTED 外部电源连接
android.intent.action.ACTION_POWER_DISCONNECTED 外部电源断开连接
android.intent.action.DREAMING_STARTED 系统开始休眠
android.intent.action.DREAMING_STOPPED 系统停止休眠
android.intent.action.WALLPAPER_CHANGED 壁纸发生变化
android.intent.action.HEADSET_PLUG 插入耳机
android.intent.action.MEDIA_UNMOUNTED 卸载外部介质
android.intent.action.MEDIA_MOUNTED 挂载外部介质
android.os.action.POWER_SAVE_MODE_CHANGED 省电模式开启
(以上广播均可使用 adb 触发)

强制停止应用
命令:

adb shell am force-stop 命令示例:

adb shell am force-stop com.qihoo360.mobilesafe 表示停止 360 安全卫士的一切进程与服务

文件管理
复制设备里的文件到本地
该命令为常用命令,多用于导出log日志和一些关键文件。

adb pull <设备里的文件路径> [电脑上的目录]
复制代码
其中 电脑上的目录 参数可以省略,默认复制到当前目录。

复制电脑上的文件到设备
adb push <电脑上的文件路径> <设备里的目录>
复制代码
其中电脑上的文件路径既可以是绝对路径也可以是相对路径。

模拟按键输入
在某些测试情况下,可以通过编写bat命令行来做相应的测试,这就需要模拟按键输入。并且在一些特殊的设备,没有物理按键的情况下,也需要模拟按键输入。该命令在adb shell命令下的input下,在adb下使用help可以得到如下的信息:

Usage: input [] [...]

The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad

The commands and default sources are:
text (Default: touchscreen)
keyevent [--longpress] ... (Default: keyboard)
tap (Default: touchscreen)
swipe [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll (Default: trackball)
复制代码
比如使用 adb shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,其中摘录部分比较常用的命令:

keycode 含义
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
24 增加音量
25 降低音量
26 电源键
27 拍照(需要在相机应用里)
64 打开浏览器
82 菜单键
85 播放/暂停
86 停止播放
87 播放下一首
88 播放上一首
122 移动光标到行首或列表顶部
123 移动光标到行末或列表底部
126 恢复播放
127 暂停播放
164 静音
176 打开系统设置
187 切换应用
207 打开联系人
208 打开日历
209 打开音乐
210 打开计算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系统休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让系统休眠
下面是 input 命令的一些用法举例。

电源键
命令:

adb shell input keyevent 26
复制代码
执行效果相当于按电源键。

菜单键
命令:

adb shell input keyevent 82
复制代码
HOME 键
命令:

adb shell input keyevent 3
复制代码
返回键
命令:

adb shell input keyevent 4
复制代码
音量控制
增加音量:

adb shell input keyevent 24
复制代码
降低音量:

adb shell input keyevent 25
复制代码
静音:

adb shell input keyevent 164
复制代码
媒体控制
播放/暂停:

adb shell input keyevent 85
复制代码
停止播放:

adb shell input keyevent 86
复制代码
播放下一首:

adb shell input keyevent 87
复制代码
播放上一首:

adb shell input keyevent 88
复制代码
恢复播放:

adb shell input keyevent 126
复制代码
暂停播放:

adb shell input keyevent 127
复制代码
点亮/熄灭屏幕
可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。

点亮屏幕:

adb shell input keyevent 224
复制代码
熄灭屏幕:

adb shell input keyevent 223
复制代码
滑动解锁
如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。

命令(参数以机型 Nexus 5,向上滑动手势解锁举例):

adb shell input swipe 300 1000 300 500
复制代码
参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。

输入文本
在焦点处于某文本框时,可以通过 input 命令来输入文本。

命令:

adb shell input text hello
复制代码
现在 hello 出现在文本框了。

Android日志查看
从Android日志方面分为底层的 Linux 内核和Android 的日志。底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。,两者存储位置完全不一样。

Android日志
[adb] logcat [

按级别过滤日志
Android系统对于日志按照优先级(priority)进行分级,分级情况如下:

V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出) 其中常用的为前四种。排序为从低到高。使用时按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:

adb logcat *:W
复制代码
会将 Warning、Error、Fatal 和 Silent 日志输出。 (注: 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)

按照tag和级别过滤日志
可以由多个 [:priority]组成。

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S
复制代码
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。

日志格式
清空日志
adb logcat -c
复制代码
内核日志
adb shell dmesg
复制代码
我这里运行结果如下:

[ 826.802773] init: Service 'mediacodec' (pid 241) killed by signal 6
[ 826.802849] init: Service 'mediacodec' (pid 241) killing any children in process group
[ 826.805858] init: Starting service 'mediacodec'...
[ 826.806083] rk-vcodec ff650000.vpu_service: closed
[ 826.808325] binder: send failed reply for transaction 291855 to 232:745
[ 826.866578] binder: 219:219 transaction failed 29189/0, size 96-0 line 2880
[ 2962.286136] hrtimer: interrupt took 228959 ns
复制代码
[]中为运行的内核开始启动后的时间,单位为秒。

查看设备信息
设备型号
adb shell getprop ro.product.model
复制代码
我的为:

XiaoMi Note 3
复制代码
设备电池状态
adb shell dumpsys battery
复制代码
该命令可以获取设备的电池信息,结果如下:

Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 0
status: 2
health: 2
present: true
level: 100
scale: 100
voltage: 0
temperature: 424
technology:
复制代码
其中 scale 代表最大电量,level 代表当前电量,这里代表电量为满电。

屏幕分辨率
adb shell wm size
复制代码
设备结果:

Physical size: 1920x1080
复制代码
该设备的物理分辨率为1920x1080.

屏幕密度
adb shell wm density
复制代码
这个在定制开发的时候常用的参数,用来决定dp和px之间的参数比.结果格式:

Physical density: 320
复制代码
该屏幕的密度为320dpi(Android设备基础dpi为160dpi)

显示屏参数
adb shell dumpsys window displays
复制代码
结果:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1920x1080 320dpi cur=1920x1080 app=1824x1080 rng=1080x1032-1824x1776
deferred=false layoutNeeded=false
复制代码
mDisplayId为屏幕显示id,init为屏幕分辨率,init 是初始分辨率和屏幕密度,app为可用界面,相当于排除非物理按键后的屏幕分辨率。

android_id
adb shell settings get secure android_id
复制代码
结果:7b666149274fbd13 什么是android_id?google 原文 A hardware serial number, if available.(一个硬件的序列码,如果有效的话)

IMEI(Device ID)
android 4.4及以下版本可以通过以下命令获取IMEI值:

adb shell dumpsys iphonesubinfo
复制代码
其中的 Device ID 就是IMEI。

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

adb shell
su
service call iphonesubinfo 1
复制代码
运行结果: Result: Parcel( 0x00000000: 00000000 0000000f 00360038 00370039 '........8.6.9.7.' 0x00000010: 00360035 00340030 00300033 00380030 '5.6.0.4.3.0.0.8.' 0x00000020: 00380037 00000035 '7.8.5... ') 其中有效数字就是IMEI值:869756043008785

Android系统版本
adb shell getprop ro.build.version.release
复制代码
结果:7.1.2,这就是系统版本号

IP地址
每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。

adb shell ifconfig
复制代码
结果:

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:709503 errors:0 dropped:0 overruns:0 frame:0
TX packets:709503 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:75473583 TX bytes:75473583
复制代码
这里的设备地址为:127.0.0.1(loacal地址)

Mac 地址
adb shell
cat /sys/class/net/wlan0/address
复制代码
当然部分设备无法成功获取

CPU 信息
adb shell
cat /proc/cpuinfo
复制代码
结果:

processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4

processor : 1
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4

processor : 2
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4

processor : 3
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4

processor : 4
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2

processor : 5
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2

Serial : d59a3c2fc7c848c4
复制代码
可以分析出设备为6核。

内存信息
adb shell
cat /proc/meminfo
复制代码
结果:

MemTotal: 2021484 kB
MemFree: 65888 kB
MemAvailable: 784708 kB
Buffers: 284 kB
Cached: 923468 kB
SwapCached: 196 kB
Active: 1154216 kB
Inactive: 526232 kB
Active(anon): 690720 kB
Inactive(anon): 229288 kB
Active(file): 463496 kB
Inactive(file): 296944 kB
Unevictable: 256 kB
Mlocked: 256 kB
SwapTotal: 520908 kB
SwapFree: 475536 kB
Dirty: 1764 kB
Writeback: 0 kB
AnonPages: 756924 kB
Mapped: 246860 kB
Shmem: 163312 kB
Slab: 92916 kB
SReclaimable: 41080 kB
SUnreclaim: 51836 kB
KernelStack: 13760 kB
PageTables: 16476 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1531648 kB
Committed_AS: 63485416 kB
VmallocTotal: 258867136 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 16384 kB
CmaFree: 13800 kB
复制代码
其中,MemTotl 就是设备的总内存,MemFree 是当前空闲内存。

修改设置
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。

分辨率
adb shell wm size 480x1024
复制代码
表示将分辨率修改为 480px * 1024px。

恢复原分辨率命令:

adb shell wm size reset
复制代码
屏幕密度
adb shell wm density 160
复制代码
将屏幕密度修改为160dpi. 恢复原屏幕密度命令:

adb shell wm density reset
复制代码
显示区域
adb shell wm overscan 0,0,0,200
复制代码
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。

恢复原显示区域命令:

adb shell wm overscan reset
复制代码
关闭USB调试模式
adb shell settings put global adb_enabled 0
复制代码
但是关闭后就无法恢复了,需要到【开发者模式】去开启

实用功能
屏幕截图
截图保存到电脑:

adb exec-out screencap -p > sc.png
复制代码
如果 adb 版本较老,无法使用 exec-out 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:

先截图保存到设备里:

adb shell screencap -p /sdcard/sc.png 然后将 png 文件导出到电脑:

adb pull /sdcard/sc.png 可以使用 adb shell screencap -h 查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:

参数 含义
-p 指定保存文件为 png 格式
-d display-id 指定截图的显示屏编号(有多显示屏的情况下)
实测如果指定文件名以.png 结尾时可以省略-p参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。

录制屏幕
录制屏幕以 mp4 格式保存到 /sdcard:

adb shell screenrecord /sdcard/filename.mp4
复制代码
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。

如果需要导出到电脑:

adb pull /sdcard/filename.mp4
复制代码
可以使用 adb shell screenrecord --help查看 screenrecord 命令的帮助信息,下面是常见参数及含义:

参数 含义
--size WIDTHxHEIGHT 视频的尺寸,比如 1280x720,默认是屏幕分辨率。
--bit-rate RATE 视频的比特率,默认是 4Mbps。
--time-limit TIME 录制时长,单位秒。
--verbose 输出更多信息。
查看连接过的 WiFi 密码
注:需要 root 权限. 命令:

adb shell
su
cat /data/misc/wifi/*.conf
复制代码
输出结果:

network={
ssid="TP-LINK_9DFC"
scan_ssid=1
psk="123456789"
key_mgmt=WPA-PSK
group=CCMP TKIP
auth_alg=OPEN
sim_num=1
priority=13893
}

network={
ssid="TP-LINK_F11E"
psk="987654321"
key_mgmt=WPA-PSK
sim_num=1
priority=17293
}
复制代码
ssid 即为我们在 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式。

设置系统日期和时间
注:需要 root 权限。

命令:

adb shell
su
date -s 20160823.131500
复制代码
表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。

重启设备
adb reboot
复制代码
检测设备是否已 root
命令:

adb shell
su
复制代码
此时命令行提示符是$则表示没有 root 权限,是 #则表示已 root。

使用Monkey调试设备
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

简单用法:

adb shell monkey -p -v 500
复制代码
表示向 指定的应用程序发送 500 个伪随机事件。 Monkey 的详细用法参考官方文档,当然需要FQ。

开启/关闭 WiFi
注:需要 root 权限。 有时需要控制设备的 WiFi 状态,可以用以下指令完成。

开启 WiFi:

adb root
adb shell svc wifi enable
复制代码
关闭 WiFi:

adb root
adb shell svc wifi disable
复制代码
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。

刷机相关命令
重启到Recovery模式
命令:

adb reboot recovery
复制代码
从 Recovery 重启到 Android
命令:

adb reboot
复制代码
重启到 Fastboot 模式
命令:

adb reboot bootloader
复制代码
通过 sideload 更新系统
如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。

以 Recovery 模式下更新为例:

1.重启到 Recovery 模式。

命令:

adb reboot recovery
复制代码
2.在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。

注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。

3.通过 adb 上传和更新系统。

命令:

adb sideload
复制代码
更多 adb shell 命令
Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 adb shell 里可以调用。本文档前面的部分内容已经用到了 adb shell 命令。

查看进程
adb shell ps
复制代码
结果:

USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 10628 2192 0 0000000000 S /init
root 2 0 0 0 0 0000000000 S kthreadd
root 3 2 0 0 0 0000000000 S ksoftirqd/0
root 4 2 0 0 0 0000000000 S kworker/0:0
root 5 2 0 0 0 0000000000 S kworker/0:0H
root 6 2 0 0 0 0000000000 S kworker/u12:0
root 7 2 0 0 0 0000000000 S rcu_preempt
...
复制代码
其中各个列表的含义如下:

列名 含义
USER 应用所属用户
PID 进程ID
PPID 父进程ID
NAME 进程名
查看实时资源占用情况
adb shell top
复制代码
结果:

User 15%, System 6%, IOW 0%, IRQ 2%
User 70 + Nice 198 + Sys 119 + Idle 1328 + IOW 0 + IRQ 0 + SIRQ 53 = 1768

PID USER PR NI CPU% S #THR VSS RSS PCY Name
1675 system 10 -10 15% S 67 3692336K 586336K ta cn.cloudwalk.app
231 camerase 20 0 4% S 15 111520K 40072K fg /system/bin/cameraserver
214 system -2 -8 2% S 30 296260K 22412K unk /system/bin/surfaceflinger
442 system 18 -2 0% S 88 3773608K 199724K fg system_server
2034 shell 20 0 0% R 1 9112K 3180K fg top
3 root 20 0 0% S 1 0K 0K fg ksoftirqd/0
649 radio 20 0 0% S 31 2825084K 110728K fg com.android.phone
720 media_rw 20 0 0% S 4 13868K 3344K fg /system/bin/sdcard
50 root RT 0 0% S 1 0K 0K fg cfinteractive
164 root -2 0 0% S 1 0K 0K fg mmcqd/1
7 root 20 0 0% S 1 0K 0K fg rcu_preempt
160 root 0 -20 0% S 1 0K 0K fg kworker/u13:1
8 root 20 0 0% S 1 0K 0K fg rcu_sched
159 root 0 -20 0% S 1 0K 0K fg kworker/u13:0
18 root RT 0 0% S 1 0K 0K fg migration/2
19 root 20 0 0% S 1 0K 0K fg ksoftirqd/2
20 root 20 0 0% S 1 0K 0K fg kworker/2:0
21 root 0 -20 0% S 1 0K 0K fg kworker/2:0H
22 root RT 0 0% S 1 0K 0K fg watchdog/3
...
复制代码
其中各个列的含义如下:

列名 含义
PID 进程 ID
PR 优先级
CPU% 当前瞬间占用 CPU 百分比
S 进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
#THR 线程数
VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY 调度策略优先级,SP_BACKGROUND/SPFOREGROUND
UID 进程所有者的用户 ID
NAME 进程名
top命令后面还可以添加一些命令行参数来限制。详细的用法如下:

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多显示多少个进程
-n num 刷新多少次后退出
-d num 刷新时间间隔(单位秒,默认值 5)
-s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
-t 显示线程信息
-h 显示帮助文档
复制代码
查看进程的UID
该任务有两种实现方式:

adb shell dumpsys package | grep userId=(http://www.my516.com)
在高版本可能会提醒grep不可用,可以将grep换成findstr,

adb shell dumpsys package | findstr userId

结果:

userId=1000
userId=1000
userId=1000
复制代码
2.通过 ps 命令找到对应进程的 pid 之后adb shell cat /proc//status | grep Uid

结果:

D:\work\206cwmenjyuny-master>adb shell
rk3399_mid:/ $ ps|grep cn.cloudwalk.app
system 1409 229 3689804 580168 0 0000000000 S cn.cloudwalk.app
rk3399_mid:/ $ cat /proc/1409/status | grep Uid
Uid: 1000 1000 1000 1000
rk3399_mid:/ $
复制代码
其它
如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:

命令 功能
cat 显示文件内容
cd 切换目录
chmod 改变文件的存取模式/访问权限
df 查看磁盘空间使用情况
grep 过滤输出
kill 杀死指定 PID 的进程
ls 列举目录内容
mount 挂载目录的查看和管理
mv 移动或重命名文件
ps 查看正在运行的进程
rm 删除文件
top 查看进程的资源占用情况

转载于:https://www.cnblogs.com/hyhy904/p/11069788.html

你可能感兴趣的:(shell,移动开发,测试)