隐藏Boss——ddmlib使用入门

简介: ddmlib使用入门ddmlib是DDMS工具的核心,堪称Android SDK中最不为人知的隐藏Boss,它封装了一系列对ADB的功能封装。

ddmlib使用入门

ddmlib是DDMS工具的核心,堪称Android SDK中最不为人知的隐藏Boss,它封装了一系列对ADB的功能封装。

DDMS工具虽然已经非常强大,可以展示非常多的Android性能监测数据,但是,它有一个很大的缺点,就是很多数据不能导出,而且很多功能也不能达到自定义的需求,因此,基于这些问题,利用ddmlib来完成自定义的功能定制,就是非常有用的了。

完成DDMS功能的自定义设置,就需要使用到ddmlib这个jar,同时,为了了解DDMS是如何实现这些功能的,还需要引人DDMS的一些库,来了解其指令的实现原理,如图所示:

这里写图片描述

分别是ddmlib.jar、ddms.jar和ddmuilib.jar,其中ddmlib.jar是核心功能,其它两个是为了查看其实现原理而引人的。

搭建研究环境

在IDEA中创建一个Java项目,并导入这些jar包:

.
├── lib
│   ├── ddmlib.jar
│   ├── ddms.jar
│   ├── ddmuilib.jar
│   └── guava-18.0.jar

可以看见这里多了一个guava的jar包,该jar是Google的一些拓展库,在导入这些jar包的时候需要进行依赖。这些jar全部引人后,研究DDMS的环境就搭建好了。点击每一个jar,就可以查看其相关的方法和代码了,如图所示:

这里写图片描述

利用ddmlib连接设备

要使用ddmlib,首先需要连接设备,这是学习、研究ddmlib.jar的第一步,代码如下所示:

import com.android.ddmlib.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        IDevice device;
        AndroidDebugBridge.init(false);
        AndroidDebugBridge bridge = AndroidDebugBridge.createBridge(
                "/Users/xuyisheng/Library/Android/sdk/platform-tools/adb", false);
        waitForDevice(bridge);
        IDevice devices[] = bridge.getDevices();
        device = devices[0];
    }

    private static void waitForDevice(AndroidDebugBridge bridge) {
        int count = 0;
        while (!bridge.hasInitialDeviceList()) {
            try {
                Thread.sleep(100);
                count++;
            } catch (InterruptedException ignored) {
            }
            if (count > 300) {
                System.err.print("Time out");
                break;
            }
        }
    }
}

这里的代码中使用循环来进行处理的原因是,ADB需要时间来进行设备连接,所以需要等待一段时间来进行连接,一旦设备连接成功,就可以通过IDevice类来进行设备操作了。

ddmlib api使用示例

ddmlib提供了很多API,但是其文档很少,很多东西只能从源码中找,这里举一个例子,利用ddmlib来进行设备截图,代码如下所示:

private static void takeScreenshot(IDevice device) {
    try {
        RawImage rawScreen = device.getScreenshot();
        if (rawScreen != null) {
            int width = rawScreen.width;
            int height = rawScreen.height;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            int index = 0;
            int indexInc = rawScreen.bpp >> 3;
            for (int y = 0; y < rawScreen.height; y++) {
                for (int x = 0; x < rawScreen.width; x++, index += indexInc) {
                    int value = rawScreen.getARGB(index);
                    image.setRGB(x, y, value);
                }
            }
            ImageIO.write(image, "PNG", new File("/Users/xuyisheng/Downloads/temp/test.png"));
        }
    } catch (TimeoutException | AdbCommandRejectedException | IOException e) {
        e.printStackTrace();
    }
}

利用IDevice的API就可以完成设备的截图操作。

DDMS功能自定义

要使用ddmlib来实现DDMS的功能自定义,就需要先了解DDMS是如何获取这些数据的,例如,我们需要了解DDMS是如何统计cpuinfo、meminfo和gfxinfo,也就是下面这个界面:

这里写图片描述

假如我们要做App的性能监测,那么这里的CPU、Memory、Frame信息是非常好的,但是DDMS却不能导出数据,所以我们需要进行自定义,那么这个功能,DDMS是如何实现的呢?打开ddmsuilib.jar,如图所示:

这里写图片描述

找到其中的SysinfoPanel类,从命名就基本可以确定,这个就是我们在DDMS中看见的那个界面,进入代码就更可以确定了,如图所示:

这里写图片描述

在这里,就可以找到相应的实现原理了,原来就是dumpsys cpuinfo”, “cat /proc/meminfo ; procrank”, “dumpsys gfxinfo而已。OK,掌握了这个方法,再查看其它的功能,就非常简单了。

开源项目

Github上对ddmlib研究的人并不多,可想而知,这个隐藏Boss藏的有多深,目前所知的比较出名的是下面这个项目:

https://github.com/cosysoft/device

但这个项目是运行不起来的,因为它引用了一些携程内部的服务器地址,需要做修改才能运行,但它的原理还是不错的,对ddmlib的研究也挺深入的。

目录
相关文章
|
5月前
|
前端开发
前端基础(十四)_隐藏元素的方法
本文介绍了几种在前端开发中隐藏元素的方法,包括使用`display:none`、`visibility:hidden`、`opacity:0`等CSS属性,并提供了相应的示例代码。此外,还提到了其他隐藏元素的技巧,如通过设置元素位置、使用`overflow`属性和`filter`属性以及`rgba`颜色值来实现元素的隐藏。
80 1
前端基础(十四)_隐藏元素的方法
|
7月前
仿Boss直聘我的界面滑动效果
仿Boss直聘我的界面滑动效果
74 0
|
JavaScript 前端开发 数据安全/隐私保护
boss直聘__zp_stoken__参数分析
boss直聘__zp_stoken__参数分析
1022 1
|
9月前
|
JavaScript 前端开发
【UI】 网站都变成灰色了,它是怎么实现的?
【UI】 网站都变成灰色了,它是怎么实现的?
68 0
|
9月前
|
Android开发 容器
Android开发第二次课 布局方式
Android开发第二次课 布局方式
51 0
|
JavaScript Python
boss直聘参数__zp_stoken__分析第二弹
boss直聘参数__zp_stoken__分析第二弹
520 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏20之enemy被攻击显示后退动画(block效果)
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏20之enemy被攻击显示后退动画(block效果)
175 0
|
缓存 前端开发 JavaScript
从零开始实现放置游戏(十三)——实现战斗挂机(4)添加websocket组件
前两张,我们已经实现了登陆界面和游戏的主界面。不过游戏主界面的数据都是在前端写死的文本,本章我们给game模块添加websocket组件,实现前后端通信,这样,前端的数据就可以从后端动态获取到了。
从零开始实现放置游戏(十三)——实现战斗挂机(4)添加websocket组件
|
SQL 缓存 前端开发
从零开始实现放置游戏(十一)——实现战斗挂机(2)注册登陆和游戏主界面
 本章主要实现注册登陆功能和游戏的主界面。有了游戏的界面,大家能有更直观的认识。   本章我们主要开发的是idlewow-game模块,其实就是游戏的客户端展示层。因为是放置游戏,为了方便,主要使用spring-mvc来开发,整个游戏形式是类似web端的文字mud游戏,会稍带一些图形图片。当然,游戏的客户端可以是多种多样的,也可以使用U3D开发成移动端或者C++/flash/silver light,开发成PC端、网页端、微端等等形式,但需要更多的美术资源。
从零开始实现放置游戏(十一)——实现战斗挂机(2)注册登陆和游戏主界面
|
前端开发 JavaScript
好客租房78-setState方法说明(3第二个参数)
好客租房78-setState方法说明(3第二个参数)
141 0