SDKに含まれている便利なツールを、デバッガー/プロファイラー、コード解析/難読化、画像ファイル最適化、アプリ外部のデータリソース操作の4種類に分けて紹介。
前回の「Android 4.4のメモリ使用状況を把握する3つのツールの使い方」では、Android 4.4で追加/機能強化された便利なツールを紹介しました。今回は最新版で追加される前からAndroid SDKに付随していた、普段はあまり使用しない知られざる便利ツールを以下の4種類に分けて紹介します。
「こんなツールがAndroid SDKに付いてるなんて知らなかった!」という新たな発見があれば幸いです。
なおAndroid SDKやEclipse ADTを含む、基本的なAndroidアプリの開発ツールについては、連載第27回の「Android 4.0でアプリ開発を始めるための環境構築」を参照してください。
Device MonitorはAndroidアプリのデバッグ/解析を行うGUIツールです。
Androidアプリ開発者にとっては見慣れた画面ではないかと思います。このツールは以下のツールを包含しています。
Device Monitorが包含しているツール、例えばDDMSやTraceviewを単体で使用するのではなく、今ではDevice Monitorからそれら機能を使用することが推奨されています。
Device Monitorを起動するには「tools」ディレクトリでコマンドラインに以下のように入力します。
monitor
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の使用を推奨します)。
自身で手順を試してみたい方のために、アプリとダンプファイルを以下からダウンロード可能です。
Copyright © ITmedia, Inc. All Rights Reserved.