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

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

简介

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
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册