ddmlib使用入門

ddmlib使用入門

ddmlib是DDMS工具的核心,堪稱Android SDK中最不為人知的隱藏Boss,它封裝了一系列對ADB的功能封裝。

DDMS工具雖然已經非常強大,可以展示非常多的Android性能監測數據,但是,它有一個很大的缺點,就是很多數據不能導出,而且很多功能也不能達到自定義的需求,因此,基于這些問題,利用ddmlib來完成自定義的功能定制,就是非常有用的了。

完成DDMS功能的自定義設置,就需要使用到ddmlib這個jar,同時,為了了解DDMS是如何實現這些功能的,還需要引人DDMS的一些庫,來了解其指令的實現原理,如圖所示:

1.png

分別是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,就可以查看其相關的方法和代碼了,如圖所示:

2.png

利用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,也就是下面這個界面:

3.png

假如我們要做App的性能監測,那么這里的CPU、Memory、Frame信息是非常好的,但是DDMS卻不能導出數據,所以我們需要進行自定義,那么這個功能,DDMS是如何實現的呢?打開ddmsuilib.jar,如圖所示:

4.png

找到其中的SysinfoPanel類,從命名就基本可以確定,這個就是我們在DDMS中看見的那個界面,進入代碼就更可以確定了,如圖所示:

5.png

在這里,就可以找到相應的實現原理了,原來就是dumpsys cpuinfo", "cat /proc/meminfo ; procrank", "dumpsys gfxinfo而已。OK,掌握了這個方法,再查看其它的功能,就非常簡單了。

開源項目

Github上對ddmlib研究的人并不多,可想而知,這個隱藏Boss藏的有多深,目前所知的比較出名的是下面這個項目:

https://github.com/cosysoft/device

但這個項目是運行不起來的,因為它引用了一些攜程內部的服務器地址,需要做修改才能運行,但它的原理還是不錯的,對ddmlib的研究也挺深入的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,124評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,946評論 6 342
  • Guide to BluetoothSecurity原文 本出版物可免費從以下網址獲得:https://doi.o...
    公子小水閱讀 8,223評論 0 6
  • 美的歷史 什么是美?什么是藝術?這是幾千年來人類一直不停探索的話題。 《說文解字》“美”甘也,從羊大。古人認為羊肥...
    琪00峰閱讀 463評論 0 0