検索
連載

あなたの知らないAndroid SDKの便利tools、14選まとめAndroidで動く携帯Javaアプリ作成入門(50)(1/3 ページ)

SDKに含まれている便利なツールを、デバッガー/プロファイラー、コード解析/難読化、画像ファイル最適化、アプリ外部のデータリソース操作の4種類に分けて紹介。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

便利ツールを4種類に分けて紹介

 前回の「Android 4.4のメモリ使用状況を把握する3つのツールの使い方」では、Android 4.4で追加/機能強化された便利なツールを紹介しました。今回は最新版で追加される前からAndroid SDKに付随していた、普段はあまり使用しない知られざる便利ツールを以下の4種類に分けて紹介します。

 「こんなツールがAndroid SDKに付いてるなんて知らなかった!」という新たな発見があれば幸いです。


図1 Andrid SDKの「tools」フォルダーにあるファイル(「adt-bundle-windows-x86-20131030.zip」をWindows 7上で解凍した場合)

 なおAndroid SDKやEclipse ADTを含む、基本的なAndroidアプリの開発ツールについては、連載第27回の「Android 4.0でアプリ開発を始めるための環境構築」を参照してください。

デバッガー/プロファイラー

【1】デバッグ/解析を行うGUIツール「Device Monitor」

 Device MonitorはAndroidアプリのデバッグ/解析を行うGUIツールです。


図2 Device Monitorを起動したところ(デフォルトはDDMS)

 Androidアプリ開発者にとっては見慣れた画面ではないかと思います。このツールは以下のツールを包含しています。

 Device Monitorが包含しているツール、例えばDDMSやTraceviewを単体で使用するのではなく、今ではDevice Monitorからそれら機能を使用することが推奨されています。

 Device Monitorを起動するには「tools」ディレクトリでコマンドラインに以下のように入力します。

monitor

【2】バイナリ形式のトレースファイルをダンプする「dmtracedump」

 dmtracedumpは、バイナリ形式のトレースファイルをダンプするツールです。

 トレースは、メソッド呼び出し、メモリ割り当て、QEMU(OSSのPCエミュレーター)に対するトレースがあります。ここではメソッド呼び出しのトレースを取り上げます。

 まず、特定の期間のトレースファイルをダンプするには、ソースコードの該当箇所を「Debug.startMethodTracing(String)」と「Debug.stopMethodTracing()」で囲みます。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Debug.startMethodTracing("debug");
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }
        Debug.stopMethodTracing();
    }

 トレースファイルは「/sdcard/<TraceName>.trace」というファイル名で保存されるため、アプリに以下のパーミッションを設定しておく必要があります。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 今回は、「/sdcard/debug.trace」という名前で保存されるので、以下のように開発用PCに取り出します。

adb pull /sdcard/debug.trace .

 これを以下のようにdmtracedumpコマンドでダンプします。

dmtracedump debug.trace

 以下のようなサマリと、詳細が表示されます。

    Usecs  self %  sum %  Method
     6563   37.45  37.45  [1] java/util/ArrayList.add (Ljava/lang/Object;)Z
     4705   26.85  64.30  [2] java/lang/Integer.valueOf (I)Ljava/lang/Integer;
     3786   21.60  85.90  [0] (toplevel)
      549    3.13  89.03  [6] java/lang/ClassLoader.findLoadedClass (Ljava/lang/String;)Ljava/lang/Class;
      288    1.64  90.68  [5] java/lang/ClassLoader.loadClass (Ljava/lang/String;Z)Ljava/lang/Class;
      240    1.37  92.05  [8] java/lang/BootClassLoader.getInstance ()Ljava/lang/BootClassLoader;
      236    1.35  93.39  [4] java/lang/ClassLoader.loadClass (Ljava/lang/String;)Ljava/lang/Class;
      219    1.25  94.64  [9] java/lang/System.arraycopy (Ljava/lang/Object;ILjava/lang/Object;II)V
      217    1.24  95.88  [11] java/lang/VMClassLoader.findLoadedClass (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;
      203    1.16  97.04  [7] java/lang/BootClassLoader.loadClass (Ljava/lang/String;Z)Ljava/lang/Class;
      107    0.61  97.65  [3] dalvik/system/VMDebug.startClassPrep ()V
       73    0.42  98.07  [15] dalvik/system/VMDebug.startMethodTracing (Ljava/lang/String;II)V
       66    0.38  98.44  [16] java/util/AbstractCollection.<init> ()V
       63    0.36  98.80  [10] java/util/ArrayList.<init> ()V
       61    0.35  99.15  [17] android/os/Debug.stopMethodTracing ()V
       60    0.34  99.49  [14] java/util/AbstractList.<init> ()V
       32    0.18  99.67  [13] android/os/Debug.startMethodTracing (Ljava/lang/String;II)V
       29    0.17  99.84  [19] java/lang/Object.<init> ()V
       28    0.16 100.00  [12] android/os/Debug.startMethodTracing (Ljava/lang/String;)V

 「ArrayList#add(……)」とオートボクシングに必要な「Integer.valueOf(……)」、トップレベルルーチンがほぼ全体を占めています。囲んでいる領域からしてこれは妥当なのですが、その後、クラスローダー関連のメソッドが並んでいて、クラスロード処理は重いのだなと思わされる結果になりました。

 なお、このトレースファイルは、前述のDevice Monitorで可視化できます(前述の通りTraceViewを実行すると、「Please use Android Device Monitor (tools/monitor) instead.」というメッセージが出て、Device Monitorの使用を推奨します)。


図3 Device Monitorで可視化したトレース情報

 自身で手順を試してみたい方のために、アプリとダンプファイルを以下からダウンロード可能です。

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る