Android ADB命令整理,你不知道的玩法都在这里!

1.Android 调试桥概述

Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:

客户端,该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。

后台程序,该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。

服务器,该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

2.adb 的工作方式

启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程。如果没有,它将启动服务器进程。当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb 客户端发送的命令—所有 adb 客户端均使用端口 5037 与 adb 服务器通信。

然后,服务器设置与所有运行的模拟器/设备实例的连接。它通过扫描 5555 到 5585 之间(模拟器/设备使用的范围)的奇数号端口查找模拟器/设备实例。服务器一旦发现 adb 后台程序,它将设置与该端口的连接。请注意,每个模拟器/设备实例将获取一对按顺序排列的端口 — 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:

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

如上所示,在端口 5555 与 adb 连接的模拟器实例与侦听端口 5554 的控制台的实例相同。

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

3.adb命令

  1. 显示系统中全部Android平台:
android list targets
  1. 显示系统中全部AVD(模拟器):
android list avd
  1. 创建AVD(模拟器):
android create avd --name 名称 --target 平台编号
  1. 启动模拟器:
emulator -avd 名称 -sdcard ~/名称.img (-skin 1280x800)
  1. 删除AVD(模拟器):
android delete avd --name 名称
  1. 创建SDCard:
mksdcard 1024M ~/名称.img
  1. AVD(模拟器)所在位置:
Linux(~/.android/avd)      Windows(C:\Documents and Settings\Administrator\.android\avd)
  1. 启动DDMS:
ddms
  1. 显示当前运行的全部模拟器:
adb devices
  1. 对某一模拟器执行命令:
adb -s 模拟器编号 命令
  1. 安装应用程序:
adb install -r 应用程序.apk
  1. 获取模拟器中的文件:
adb pull <remote> <local>
  1. 向模拟器中写文件:
adb push <local> <remote>
  1. 进入模拟器的shell模式:
adb shell
  1. 启动SDK,文档,实例下载管理器:
android
  1. 缷载apk包:
adb shell 
cd data/app 
rm apk包 
exit 
adb uninstall apk包的主包名 
adb install -r apk包
  1. 查看adb命令帮助信息:
adb help
  1. 在命令行中查看LOG信息:
adb logcat -s 标签名
  1. adb shell后面跟的命令主要来自:

源码\system\core\toolbox目录和源码\frameworks\base\cmds目录。

  1. 删除系统应用:
adb remount (重新挂载系统分区,使系统分区重新可写)。 
adb shell 
cd system/app 
rm *.apk
  1. 获取管理员权限:
adb root
  1. 启动Activity:
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)。

23、发布端口:

你可以设置任意的端口号,做为主机向模拟器或设备的请求端口。如:

adb forward tcp:5555 tcp:8000

24、复制文件:

你可向一个设备或从一个设备中复制文件, 复制一个文件或目录到设备或模拟器上:

adb push <source> <destination></destination></source> 
如:adb push test.txt /tmp/test.txt 
从设备或模拟器上复制一个文件或目录: 
adb pull <source> <destination></destination></source> 
如:adb pull /android/lib/libwebcore.so .

25、搜索模拟器/设备的实例:

取得当前运行的模拟器/设备的实例的列表及每个实例的状态:

adb devices

26、查看bug报告:

adb bugreport

27、记录无线通讯日志:

一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:

adb shell 
logcat -b radio

28、获取设备的ID和序列号:

adb get-product 
adb get-serialno

29、访问数据库SQLite3

adb shell 
sqlite3

30、getevent/sendevent

Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]  
    -t: show time stamps  
    -n: don't print newlines  
    -s: print switch states for given bits  
    -S: print all switch states  
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)  
    -d: show HID descriptor, if available  
    -p: show possible events (errs, dev, name, pos. events)  
    -i: show all device info and possible events  
    -l: label event types and names in plain text  
    -q: quiet (clear verbosity mask)  
    -c: print given number of events then exit  
    -r: print rate events are received  
  
Usage: sendevent <device> <type> <code> <value>  

通过getevent获取到方向键按下和抬起事件,然后用sendevent发送对应的事件就可以模拟方向键的按下和抬起,从而实现本机上定义在方向键上的功能,以下是通过python包装adb命令触发方向键按下和抬起,达到大量触发定义在方向键的功能实现自动测试的目的。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import time

def main(times):
    os.popen("adb wait-for-device")
    for i in range(times):
        print("times:==>" + str(i + 1))
        #模拟方向键-上
        send_direction_key_event("方向键-上按下", "方向键-上抬起", 103, 5)
        #模拟方向键-下
        send_direction_key_event("方向键-下按下", "方向键-下抬起", 108, 5)
        #模拟方向键-左
        send_direction_key_event("方向键-左按下", "方向键-左抬起",105, 1)
        time.sleep(5)

def send_direction_key_event(keytipdown, keytipup, value, sleeptime):
    print(keytipdown)
    os.popen("adb shell sendevent /dev/input/event0 1 "+ str(value) + " 1")
    os.popen("adb shell sendevent /dev/input/event0 0 0 0")
    time.sleep(sleeptime)
    
    print(keytipup)
    os.popen("adb shell sendevent /dev/input/event0 1 "+ str(value) + " 0")
    os.popen("adb shell sendevent /dev/input/event0 0 0 0")
    time.sleep(1)
    print("==================")

if __name__ == "__main__":
    #一次耗时20s,一天为24 * 60 * 60秒,可测试4320次数,以下设置为10000
    main(10000)

发布了64 篇原创文章 · 获赞 42 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/tyyj90/article/details/103998895