java代码adb命令 java adb命令

如何在Java代码中调用adb命令

代码如下:

成都创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!成都创新互联具备承接各种类型的网站设计、成都做网站项目的能力。经过十余年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。

package com.symbio.ltp.adb;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.List;

import com.symbio.ltp.model.ConfigPropertiesData;

import com.symbio.ltp.util.Log;

public class ShellCommand {

private String name;

private Process process;

private BufferedWriter writer;

private BufferedReader reader;

private BufferedReader errorReader;

private ListString list;

private String[] returnValue;

public ShellCommand(String name) {

this.name = name;

}

public String getName() {

return name;

}

public Process getProcess() {

return process;

}

public BufferedWriter getOutputWriter() {

return writer;

}

public BufferedReader getInputReader() {

return reader;

}

public BufferedReader getErrorReader() {

return errorReader;

}

public boolean start(String cmd) {

try {

process = Runtime.getRuntime().exec(cmd);

writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public boolean exec(String cmd) {

String line;

try {

writer.write(cmd + "\n");

writer.flush();

while((line = reader.readLine()) != null) {

Log.debug(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

return true;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

return false;

}

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return false;

}

return true;

}

public String [] execReturn(String cmd) {

String line;

list = new ArrayListString();

try {

writer.write(cmd + "\n");

writer.flush();

line = reader.readLine();

while((line = reader.readLine()) != null) {

if(line.length()0 !(line.startsWith("#"))){

Log.debug(line);

list.add(line);

if(line.equals(ConfigPropertiesData.ltp_success)) {

break;

} else if(line.equals(ConfigPropertiesData.ltp_fail)) {

break;

}

}

}

int size = list.size();

returnValue = new String[size];

for (int i = 0; i size; i++) {

returnValue[i] = list.get(i);

}

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

return null;

}

return returnValue;

}

public void terminate() {

try {

writer.write(0x03);

writer.flush();

} catch (IOException e) {

Log.debug("Exception in shell(" + name + ") -- " + e.getMessage());

}

}

}

用Java调用adb出现问题

①、重启

ADB 响应失败,最先想到的就是重启工具了

不过重启一般都没有用,建议跳过该方法哈哈

②、使用 cmd 工具重启 ADB 进程

关掉所有工具

快捷键 Windows + R,输入 cmd

进入 AndroidStudio 的 sdk 工具文件夹 

以我的AndroidStudio安装在D盘为例

其中,cd 命令为打开某文件夹,这里我们需要打开 sdk 中的 platform-tools 文件夹

杀死并启动 adb 进程

其中 adb kill-server 为杀死 adb 进程 

adb start-server 为启动 adb 进程

若显示 上图中的 daemon started successfully 那么恭喜你,你的问题解决了,启动开发工具就可以正常使用了

③、关闭 adb 被占用的进程

如果使用第2种方法的时候,最终显示 failed to start deamon 那么,你就需要用到本方法了

关掉所有工具

快捷键 Windows + R,输入 cmd

输入netstat -aon|findstr “5037”

可以看到进程号为9460的进程(这个进程号因机器和时间而异)在占用5037端口(adb需要使用此端口)

打开任务管理器,选择“进程”选项卡,点击选项栏“查看-选择列…”,勾选“PID(进程标识符)”,点确定。会看到每个进程都会显示它们的PID了。找到进程号为9406的进程,结束这个进程。 

在cmd中,重新 adb start-server,可以看到成功启动

最后启动开发工具,就可以正常使用了

④、更改 Genymotion 使用的 ADB 路径

在第3种方法中,我们在任务管理器里有时是无法关闭某进程的,它会不断自动重启,比较顽固

这就需要放大招了:

打开 Genyotion 模拟器,依次选择 Settings、ADB 

选中上图中的 Use Custom Android SDK tools

点击 Browse 选择 AndroidStudio 所使用的 SDK 的文件夹

启动 Genymotion ,启动 AndroidStudio,正常使用

该解决方法对应的原因就是,Genymotion 本身有自带的 adb 工具,启动时会打开自带的 adb。

但是 Genymotion 和 AS 一起使用的时候,两者都会启动一份 adb ,所以这里我们让两者都启动 AS 的 adb ,问题就解决了!

干货|做App测试,那些必知必会的Adb常用命令

本文节选自霍格沃兹测试学院内部教材

为了让大家更好的学习Adb常用命令,我们先从安装Android环境搭建开始讲解哦。

安装jdk  

###  **  

**

**  

**

### 因为 Android SDK 是依赖于 java 环境的,所以需要先把 java 的环境搭建好。Java

环境可以参考搭建帖子:

安装Android SDK  

###  

###  

### adb 包含在 Android SDK 平台工具软件包中。具体的 Android SDK

环境搭建步骤请参考帖子:

adb简介  

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android

模拟器或真机的工具。

adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作,例如安装和调试应用。

adb组成  

采用了客户端-服务器(C/S)模型,包括三个部分:

* adb client

* adb server

* adb daemon

ADB client:运行在电脑上,可以在命令行中运行 adb 命令来调用该客户端。Client 本质上就是 Shell,用来发送命令给

Server。发送命令时,首先检测 PC 上有没有启动 Server,如果没有 Server,则会自动启动一个,然后将命令发送到 Server。

ADB server:是运行在电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。

ADB Daemon:守护进程作为一个后台进程在 Android 设备或模拟器系统中运行。它的作用是连接 adb 服务端,并且为运行在主机上的 adb

客户端提供一些服务。

adb工作原理  

当 adb 客户端启动时,客户端会先检查 adb 服务端是否启动。如果没有,会先启动服务端进程。adb 服务端在启动后,会与 5037 端口绑定,并监听

adb 客户端发出的命令。

然后,服务端会与所有正在运行的 Android 设备建立连接。它通过扫描 5555 到 5585 之间的奇数号端口查找 Android 设备。服务端一旦发现

Android 设备上的 adb 守护进程在运行,便会与相应的端口建立连接。每个 Android 设备都使用一对端口,偶数端口用于控制台连接,奇数端口用于

adb 连接。

例如:服务端与所有 Android 设备建立连接后,就可以使用 adb 命令来访问这些设备了。服务端会管理已经建立的连接,并处理来自 adb 客户端的命令。

启动adb调试  

### Android 真机可以通过 USB 连接到 adb,连接时需要在设备的系统设置中启用 USB 调试(位于开发者选项下),启动 USB

调试后,设备上的 adb 守护进程就会被启动,adb 服务端才可以和设备建立连接。除了用 USB 的方式连接之外,也可以通过 WLAN

的方式连接,这种方式不做赘述。

1. 模拟器:不需要手动设置 USB 调试开关,默认是打开的

2. 真机通过 USB 连接

* 安装 Android 手机驱动

* 设备启用 USB 调试

adb命令格式  

adb [-d|-e|-s serialNumber] command

* -d:指定当前唯一通过 USB 连接的 Android 设备为命令目标

* -e:指定当前唯一运行的模拟器为命令目标

* -s:指定相应 serialNumber 号的设备/模拟器为命令目标

方括号中的内容是可选的,尖括号内容的是必填的。方括号中参数可以指定设备,关于设备的指定有三个参数可以使用。-d、-e 和 -s,其中使用最多的是 -s

参数,在连接多台设备的时候,一般都是使用 -s 加上设备的序列号这种方式去指定具体设备。

adb 可以同时连接多台设备,但是一次只能对一台设备执行命令。所有连接多台设备的时候,是必须要制定设备,命令才可以执行成功的。

查询设备  

把 Android 设备连接到 adb 服务端后,需要确认设备的连接状态。这时可以使用查询命令进行查询。

**连接模拟器** (以 mumu 模拟器为例)

*   * 

adb connect 127.0.0.1:7555adb devices

* `adb connect` 命令可以通过 WLAN 的方式连接到模拟器,7555 为 mumu 模拟器的端口

* `adb devices` 可以查询设备连接的状态

Windows 系统中,连接模拟器需要先执行 connect 命令去连接模拟器,127.0.0.1 是本地的 IP

地址,因为模拟器就是安装在本地的,所以要使用本地的 IP 地址,加上模拟器本身规定的一个端口号。mumu 的端口号是

7555,如果使用的是其他的模拟器的话,需要先去了解它的端口号是什么,然后再去连接。MacOS 系统中连接模拟器不需要先执行 connect 命令,直接执行

`adb devices` 命令即可。

**连接真机**

**  

**

真机直接用 USB 连接到电脑,不需要执行 connect 命令。

直接用 `adb devices`命令查看已经连接的设备列表即可。

feier@ ~ % adb devices  

List of devices attached  

emulator-5554    device

直接命令后,如果设备已经成功连接,那么设备列表中就会展示已连接设备的信息。以图中的信息为例:

* emualotr-5554:设备序列号

* device:设备连接状态为成功

安装卸载应用  

测试过程中,如果需要安装或者卸载应用,可以直接用 adb 命令来操作。

* 普通安装:`adb install apk路径`

* 覆盖安装:`adb install -r apk路径`

* 完全卸载:`adb uninstall 包名`

* 保留配置文件:`adb uninstall -k 包名 `

设备与电脑传输文件  

adb 命令支持电脑和 Android 设备之间的文件互传。比如我们需要提取 Android 设备中的日志文件到本地,就可以通过 adb 命令的方式来完成。

* 从电脑上传文件至设备:`adb push 电脑路径 设备路径`

* 从设备复制文件至电脑:`adb pull 设备路径 电脑路径`

日志  

打印链接设备的 log 信息

* 屏幕输出日志:`adb logcat`

* 通过标签过滤:`adb logcat -s 标签`

* 显示时间:`adb logcat -v time`

* 输出所有信息:`adb logcat -v long`

* 输出日志到文件:`adb logcat -v time log.txt`

* 清除旧日志信息:`adb logcat -c`

adb shell命令  

使用 adb shell 命令相当于远程登录了 Android 系统,可以进入 Android 设备的系统内部。进入系统内部既可以执行一些简单的 Linux

命令也支持很多特有的命令。

使用 adb shell 命令有两种方式。

一种是直接在 adb shell 后面跟上命令。

adb [-s serial_number] shell command

比如:

*   *   *   *   *   *   *   *   *   *   * 

feier@ ~ % adb shell lsacctcachechargerconfigddatadefault.propdevetc...

另一种方式是在设备上启动交互式 shell

adb [-s serial_number] shell

进入 shell 之后,再执行对应的命令。

比如我们进入设备内部,可以查看设备内部的目录结构和内容

*   *   *   *   *   *   *   *   *   *   * 

feier@ ~ % adb shellroot@x86:/ # lsacctcachechargerconfigddatadefault.propdev...

要退出交互式 shell,可以按 Ctrl + D 键或输入 exit。

**Android常用测试命令**  

下面整理出了Android常用的一些测试命令及用法。  

设备截图/录屏  

在测试过程中,如果需要截图或者是录屏,也可以直接使用 adb 命令来完成。

* 截图:`adb shell screencap 设备路径`

* 录屏:`adb shell screenrecord 设备路径`

调用Activity管理器  

在 adb shell 中,可以使用 Activity 管理器 (am) 工具发出命令以执行各种系统操作,如启动

Activity、强行停止进程、修改设备屏幕属性,等等。

在测试过程中,如果需要启动 app 或者强制关闭 app,可以通过 adb 命令来实现。

* 启动应用:`adb shell am start -n 包名/Activity名`

* 强制停止应用:`adb shell am force-stop 包名`

调用软件包管理器  

在 adb shell 中,可以使用软件包管理器 (pm) 工具发出命令,以对设备上安装的应用软件包执行操作和查询。

如果需要查询设备里都安装了什么应用,就可以使用 adb shell pm list 来查看,还可以加上不同的参数去查看不同类型的应用。而且也可以通过 adb

命令来清除应用相关的数据。

* 显示设备中安装的所有应用:`adb shell pm list packages`

* 只显示系统应用:`adb shell pm list packages -s`

* 只显示第三方应用:`adb shell pm list packages -3`

* 删除与软件包关联的所有数据:`adb shell pm clear 包名`

adb shell dumpsys  

dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。可以使用 adb 从命令行调用

dumpsys,获取在连接的设备上运行的所有系统服务的诊断输出。

比如在测试中,如果需要通过 adb 命令启动 app,则需要知道 app 的包名和入口的 Activity

名。这个时候,就可以通过下面这条命令获取到这两个信息。

这个场景,需要先把要获取信息的应用启动,让它在前台运行,然后执行命令

`adb shell dumpsys activity | grep mFocusedActivity`

*   *   * 

feier@ ~ % adb shell dumpsys activity | grep mFocusedActivity  mFocusedActivity: ActivityRecord{9dae968 u0 com.xueqiu.android/.common.MainActivity t139}  

下方的日志中就会展示出来当前的包名和 Activity 名称。

* 包名:`com.xueqiu.android`

* Activity 名:`.common.MainActivity`

adb shell dumpsys  

adb 命令还支持直接获取应用的页面信息。这个页面信息包含了页面中元素的属性,可以方便做自动化测试的时候去定位元素。获取到的页面布局会输出到一个 xml

文件中。

* 当前窗口的 UI 布局简化信息:`adb shell uiautomator dump --compressed`

*   * 

feier@ ~ % adb shell uiautomator dump --compressedUI hierchary dumped to: /sdcard/window_dump.xml

不指定输出文件路径时,dump 下来的文件默认存储路径为 `/sdcard/window_dump.xml`

可以通过 adb pull 命令把文件传输到电脑中,然后用 uiautomatorviewer 工具打开查看布局。

* 指定输出文件路径:`adb shell uiautomator dump file 设备路径`

adb常用命令就先讲到这里啦,下期我们分享App常见bug解析。大家还想看什么内容的文章也可以留言告诉我们哦!

** _ 

来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力

QQ交流群:484590337

公众号 TestingStudio

视频资料领取:;url=

点击查看更多信息


当前名称:java代码adb命令 java adb命令
网页地址:http://azwzsj.com/article/ddcophh.html