隐藏Boss——ddmlib使用入门

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的研究也挺深入的。

时间: 2024-10-13 14:21:06

隐藏Boss——ddmlib使用入门的相关文章

PhotoShop CS6打造一只冰冻的冰雕手特效制作教程

教程教大家用PhotoShop CS6打造一只冰冻的冰雕手特效效果,想学的同学就起来学习吧! 教程效果图: 原图: 打开我一开始给你们的素材,在路径面板中单击路径1,在画面中显示路径 载入路径中的选区,将选区内的图像复制到四个新的图层,选择图层1和图层1副本,将其他两个隐藏 分类: PS入门教程

黑暗之光 首服7月3日隆重登场时空之战

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;       [科技讯]7月1日信息,3721.html">2014年最新史诗巨著.首款超时空真3D网游,735wan<黑暗之光>首服将于2014年7月3日15点震撼登场.735wan<黑暗之光>采用自主研发的3D引擎,率先尝试将中国传统文化与西方骑士精神的完美融合,构建亘古未有的异度空间.你从未到过的世界,你最想进入的仙境,将

《魔兽世界》各大顶尖游戏公会介绍

Ensidia: 2008年11月25日,一支由SK-Gaming与Nihilum合并的公会. 由Kungen(昆哥),Philip "Mek" Curry ,Markus "Mackzter" Dahlgren当任会长 阿拉伯联合酋长国迪拜投资了一笔私人资产赞助他们 公会主要战绩 开放WLK仅仅3天后,就完成了25人模式T7副本所有BOSS的世界首杀 第二周,25人副本黑曜石神殿留三龙模式萨塔里奥世界FD 2009年4月16日 25人奥杜尔 约格萨隆简单模式世界F

stars率先拿下奈法利安完成大灾变首杀

在台服<魔兽世界>开放资料片"大灾变"之后,众多公会都开始了进军团队副本,而几家实力强劲的公会已经进入了FD争夺战,华人团队星辰.bluesea.梦想等公会,一度齐头并进,首杀争夺异常激烈.昨天晚上,在经过艰苦厮杀后星辰拿下最终BOSS奈法利安普通模式的首杀. 当前版本,普通模式13个BOSS中有一个隐藏BOSS需要英雄难度才能激活,所以本周的FD争夺战主要是普通模式BOSS击杀,而普通模式BOSS击杀将决定能否开启英雄模式,所以不仅仅是争夺首杀,也是为团队前往英雄模式打通

Ensidia世界第一达成零阵亡击杀赛丝特拉成就

今天,外服公会Ensidia成为世界上第一个达成暮光堡垒5号隐藏Boss赛丝特拉成就:"我被赞美我的声音吵到听不见你说什么".该成就的达成条件非常苛刻,要求团队在第一次尝试中全团无一人死亡的情况下击杀赛丝特拉.让我们一起祝贺他们! 赛丝特拉成就 Ensidia世界第一达成成就 Ensidia公会资料: 公会的由来及简介 Ensidia公会可以说是是热门网络游戏魔兽世界中实力最强劲的PVE团队了.这个公会由原来的SK-Gaming与Nihilum的PvE团队合并,作为现如今魔兽世界PvE

大灾变战报:梦想公会世界首杀困难奥拉基尔

四风的奥拉吉尔,梦想完成了世界首杀,这是CWOWER的骄傲. 恭喜梦想,第七天堂的失败没有击垮这些有梦想的人,他们正如他们的公会名一样,实现了他们的梦想. 目前全世界目前争夺FD的团队,都是以25人模式进行的(现在的大灾变团队副本10人25人共CD,难度一样.装备一样.只是掉落数量不一样) 而梦想是以10人模式打掉困难奥拉基尔,目前梦想世界排名第七.加油! 星辰共勉啊,目前星辰排名第四,而梦想也已经跻身了10/13俱乐部. 而世界第一的PARAGON已经12/13了--差距啊剩下的全是10/13

魔兽世界星辰公会击杀丘加利排名升至世界第二

由于某些原因,网易<魔兽世界>的新版3.3.5被推迟更新了,官方定于明天0点开始维护,为期24小时.让我们把目光转向其他地区服务器:北京时间今天凌晨2点34分,来自中国台湾地区服务器的星辰公会成功击杀了英雄难度BOSS丘加利(注:大陆服译名为寇加尔),总进度榜升至世界第二. 自一个周前游久网为大家报道了"大地的裂变"BOSS击杀进度后,这一个周来榜单没有太大的变化,毕竟排名靠前的公会均只剩下三大副本的最终BOSS尚未击杀,其难度决定了不可能一两天就被攻破.星辰公会于今天凌晨

大灾变首杀花落谁家stars率先拿下奈法利安

在台服<魔兽世界>开放资料片"大灾变"之后,很多公会都已经开始了进军团队副本,几家实力强劲的公会已经进入了FD争夺战,华人团队比较著名的星辰.bluesea.梦想等公会进度非常接近,一度齐头并进,首杀争夺异常激烈.昨天晚上,一切终于尘埃落定,星辰拿下当前最终BOSS奈法利安普通模式的首杀. 在当前版本中,一共有3个团队副本,普通模式共13个BOSS,其中一个隐藏BOSS需要英雄难度才能激活,所以本周的FD争夺战主要是普通模式BOSS击杀,而普通模式BOSS击杀将决定能否开启

jQuery入门(5) 显示/隐藏内容

jQuery的hide()和show()可以用来显示和隐藏内容.比如下面的例子:jQuery的hide()和show()可 以用来显示和隐藏内容.比如下面的例子: <!doctype html> <html> <head> <meta charset="utf-8"> <title>JQuery Demo</title> <script src="scripts/jquery-1.9.1.js&qu