移动测试基础 通过 ddmlib 使用 adb,构建框架基础库

Bluesky Yao · 2015年04月22日 · 最后由 Bluesky Yao 回复于 2015年04月27日 · 2010 次阅读
本帖已被设为精华帖!

简介

Android Debug Bridge 如其名,是连接Android Device/Emulator的桥梁,IDE如AS,ADT,Android测试框架Appium,Selendroid无不heavy的依靠adb。而ddmlib无疑是最好的adb api. 在刚使用时略复杂,好在有个lib让它的使用变得简单。

携程在构建无线测试框架的时候,非常重视ddmlib API的打造,充分参考Selendroid/Appium的实现,毕竟这是基础的基础,而不是各种乱造。

Quick Start

Maven

<dependency>
<groupId>com.github.cosysoft</groupId>
<artifactId>device-api</artifactId>
<version>0.9.1</version>
</dependency>

Gradle

dependencies {
compile 'com.github.cosysoft:device-api:0.9.1'
}

获取PC中连接的设备/模拟器

public class EchoTest {

@Test
public void takeDevices() {
TreeSet<AndroidDevice> devices = AndroidDeviceStore.getInstance()
.getDevices();
AndroidDevice device = devices.pollFirst();
System.out.println(device.getName());
}
}

截图 它可以直接在内存中,暴露restful服务有优势

BufferedImage image = device.takeScreenshot();
String imagePath = new File(System.getProperty("java.io.tmpdir"),
"screenshot.png").getAbsolutePath();
ImageUtils.writeToFile(image, imagePath);

安装/卸载

AndroidApp app = new DefaultAndroidApp(new File(
"d:\\uat\\com.android.chrome.apk"));
device.install(app);
if (device.isInstalled(app)) {
device.uninstall(app);
}

LogCat 过滤

final LogCatFilter filter = new LogCatFilter("", "", "com.android", "",
"", LogLevel.WARN);
final LogCatListener lcl = new LogCatListener() {
@Override
public void log(List<LogCatMessage> msgList) {
for (LogCatMessage msg : msgList) {
if (filter.matches(msg)) {
System.out.println(msg);
}
}
}
};

device.addLogCatListener(lcl);
Thread.sleep(60000);

List running client for app

List<ClientDataInfo> clientDataInfos = device.getClientDatasInfo();
for (ClientDataInfo client : clientDataInfos) {
System.out.println(client.getName());
System.out.println(client.getPid());
}

更多api可以参考其javadoc

共收到 19 条回复 时间 点赞

Thanks for sharing

我是勤劳的传送门:https://github.com/cosysoft/device

学习了!

提个小问题:在 Marven central repository 下载的 javadoc 的 html 文档中没有带有 UTF-8 编码声明,如果浏览器默认编码不是 utf-8 或者没打开自动检测编码,会显示乱码。建议这个 javadoc 用全英文的吧。中文看起来有些地方实在别扭

嗯 这个库,基本框架都会用到。我们也重度使用。

#3楼 @xuxu 原来 ddmlib 藏得这么深。。。谢谢分享!

#2楼 @chenhengjie123 locale改为en_US了,应该没编码问题,至于中文...其实方法名称就差不多了

可以用来取 Android 上的系统资源么

这个好! 我很快就能用上了,95555个赞!

#7楼 @testly
应该可以,adt/as 支持的应该都可以做到,比如做一个代码断点调试的功能

楼主,dependencies {
compile 'com.github.cosysoft:device-api:0.9.1'
}这个是要加入到我们被测app的build.gradle里么,加入后assembleDebug失败了。。
A problem occurred configuring project ':AndroidJD-Phone'.

Could not resolve all dependencies for configuration ':AndroidJD-Phone:_debugCompile'.
Could not find com.github.cosysoft:device-api:0.9.1.
Searched in the following locations:
file:/Users/fangcheng/Desktop/adt-bundle-mac-x86_64-20140624/sdk/extras/android/m2repository/com/github/cosysoft/device-api/0.9.1/device-api-0.9.1.pom
file:/Users/fangcheng/Desktop/adt-bundle-mac-x86_64-20140624/sdk/extras/android/m2repository/com/github/cosysoft/device-api/0.9.1/device-api-0.9.1.jar
Required by:
V4.1.0-really:AndroidJD-Phone:unspecified

#9楼 @cosyman 我用java 封装ADB shell 去取cpu 内存 电量 等等一些东西来跟UI自动化结合,不知道有没有别的简单的方法去取到

#10楼 @xxfcxx 需要配置一下ANDROID_HOME Android SDK目录。
确保能下下来仓库jar 默认的mavenCentral通常是下载不成功的,如果没有代理。

repositories {
maven {
url 'http://maven.oschina.net/content/groups/public/'
}
}

#11楼 @testly
一般ddmlib 对于一个app会是一个package 对应一个progress,然后又对应的Client监控,每个进程可以获取相应的内存信息,一直想做这块,但最近没有太多时间了

com.android.ddmlib.Client 这个类,对应一个Android中的VM监控,可以获取heap、Thread、等信息,甚至可以做debug

#13楼 @cosyman 牛B,我来用用,我做好了跟你分享

API详细说明那里可以看到呀 比如封装的执行adb shell命令这个方法

我用的 chimpchat

#16楼 @ganyunxiao
开始我也用的chimpchat 后来发现还是ddmlib更通用,功能也更全,忘记了,貌似chimpchat是基于ddmlib

#17楼 @cosyman 没具体研究过 ddmlib,chimpchat现在对我来说够用,也比较稳定。我给它加上了sikuli

@cosyman 编码问题具体怎么解决啊?thanks!

恒温 ddmlib 与 adb 中提及了此贴 06月19日 22:32
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册