Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(12)

# デバッグ

## エミュレータ

### エミュレータで再現されるハードウェア

エミュレータで再現されるハードウェアをAndroid仮想デバイス（AVD:Android Virtual Device)という。

- ARMバージョン5以降のCPU
- 16ビットカラーの液晶ディスプレイ（1ピクセルあたり16ビットのカラー（6万5536色）を表現可能。
- Qwertyキーボード, Dpad/Phoneボタン
- サウンドチップ
- フラッシュメモリ
- SIMカードがシミュレートされたGSMシステム（Global System for Mobile Communications）
- ビデオカメラ
- 加速度計などのセンサー

### Android仮想デバイスの作成

toolsフォルダのandroid create avdコマンドを発行する（GUIでもできる）

Android create avdコマンドの使い方

|引数|役割|
|---|---|
|-n `<avd_name>`|作成するAVDの名前|
|-t `<targetID>`|AVDのOSのバージョンを指定する。OSのバージョンはAndroid2.3.3 APIレベル10の場合は「18」などandroid list targetsコマンドで表示する|
|-c `<size>`[K M]|エミュレータで使用するSDカードの容量を指定する|

#### androidコマンドのまとめ

|書式|役割|
|---|---|
|create avd -n `<avd_name>` -t `<targetID>` -c `<size>`[K M]|AVDを新規作成|
|move avd -n `<avd_name>` -r `<変更するavd_name>`|AVDの名前変更|
|delete avd -n `<avd_name>`|AVDを削除|
|list avds|一覧を表示|

### エミュレータの起動

emulatorコマンドでAVDを起動できる。

    emulator -avd `<avd_name>`
    emulator @`<avd_name>`

### エミュレータのコンソール機能

エミュレータにはコンソール機能がついている。エミュレータが起動している状態でtelnetコマンドを実行する
(telnet localhost `<port_no>`)ポート番号はウィンドウタイトルの位置に表示されている

### バッテリーをエミュレート

接続したら、power status unknownなどでバッテリーの状態を変更できる

powerコマンドの使い方

|引数|役割|
|---|---|
|display|バッテリーや充電の状態を表示する|
|capacity `<percent>`|バッテリーの充電％を変更する|
|present `<true/false>`|充電器につながってるどうかを設定する|
|status `<unkown/charging/discangeing/not-charging/full>`|バッテリーの状態を指定した状態に設定する|

### ネットワーク速度をエミュレート

network speedコマンドにより様々な環境下でのテストが可能となる

network speedコマンドの使い方

|引数|役割|
|---|---|
|gsm/hcsd/gprs/edge/umts/hsdpa|各通信のネットワークスピードになる|
|full|制限なし|
|`<num>`|上がりと下りのスピードが同じ|
|`<up>`:`<down>`|上がりと下りのスピードをそれぞれ指定する|

---

## DDMS

DDMS(Dalvik Debug Monitor Server)はバグの早期発見やテストに非常に役立つツール。

### DDMSを起動する

エミュレータが起動している状態でddmsコマンドを実行する

### 電話とSMSの送信

Emulator ControlタブをクリックしIncoming number欄に電話番号を入れVoiceにチェックマークを付けて、Callボタンをクリックする
SMSを送信する場合は、Emulator ControlタブでSMSを選びMessageに送信したい文字を入力してCallボタンをクリックする

### DDMSの画面

#### Deviceペイン

開発用のPCに接続しているAndroidデバイスと各プロセスの一覧を表示する。プロセスを強制停止したり、GCを発生させることが出来る(ゴミ箱のアイコン)

#### Infoタブ

選択されたプロセスのプロセスID、VMバージョン情報が表示される

#### Threadsタブ

選択したプロセスのスレッド一覧が表示される

#### VM Heapタブ

選択したプロセスでGCを行った場合に更新されたヒープの統計データが表示される。

####　Allocation Trackerタブ

メモリアロケーションの追跡が表示される

#### Emulator Controlタブ

エミュレータに電話を掛けたり、SMSメッセージを送ることが出来る。疑似ロケーションを送ることでGPS情報をシミュレーションすることもできる。

#### Logcatペイン

端末のlogcat情報を表示できる

#### スクリーンショット

スクリーンショットを取るには、プルダウンメニューから[Device]->[Screen Capture]を選択する

---

## adb

adb(Android Debug Bridge)コマンドラインで開発用PCとAndroid端末を接続し、操作するためのツール

### adbの構成

adbは開発用PCで動作する「クライアント」「サーバ」とAndroid端末で動作する「デーモン」の3つから構成される。

#### adb client

adbコマンドのこと。adb logcatやadb devices等のコマンドがある。adb clientとadb serverのやり取りはTCPポート5037が使われる

#### adb server

adb clientでの操作をAndroid端末に送信するもの。adb clientが発行したコマンドをadb daemonに仲介する。

#### adb daemon

Android端末（実機、エミュレータ）で動くバックグラウンドプロセス。adb serverからのコマンドを実行し結果を返す。adb serverとのやり取りはTCPポートの5555-5585の奇数ポートを利用する

### adbのコマンド

エミュレータがadb接続されるかどうかを確認するにはadb devicesコマンドを使用する

主なadbコマンドの一覧

|コマンド|役割|
|---|---|
|adb start-server|adb serverを起動する|
|adb kill-server|adb serverを停止する|
|adb devices|adb接続されている端末の一覧を表示する|
|adb push|Android端末にファイルを書き込む adb push <開発用PCのファイル名> <Androidのファイルパス>|
|adb pull|Android端末からファイルを取り込む adb pull <Androidのファイル名> <開発用PCのファイルパス>|
|adb install|apkファイルを指定して端末にインストールする|
|adb uninstall|パッケージ名を指定して、アプリをアンインストールする|

---

## 階層ビューワ(Hierarchy Viewer)

Androidのユーザインターフェース部分を階層表示するビューワ。レイアウトの最適化に役立つ。

### 階層ビューワを起動する

エミュレータを起動した状態で、hierarchyviewerコマンドを入力する
Load View Hierarchyボタンでレイアウトビューが表示される
Inspect Screenshotボタンでパーフェクトピクセルビューが表示される

---

## Traceview

処理のボトルネックを調べるツール。

### Traceviewを使う

Android SDKに含まれるツール。使うには準備が必要である。
android.os.Debugをimportしたうえで、計測したい場所をDebug.startMethodTracing(<ファイル名>);とDebug.stopethodTracing();で囲む。

計測結果は/sdcard/<ファイル名>.traceに書き出される。SDカードに出されるので、マニフェストファイルにandroid.permission.WRITE_EXTERNAL_STORAGEを指定する必要がある

プログラムを実行することで計測結果のファイルを取得できる。
adb pullコマンドもしくは、DDMSのエクスプローラ機能を利用してファイルを確認できる
traceview <ファイル名>コマンドで計測結果をグラフィカルに表示できる。

---

## mksdcardコマンド、androidコマンド

### 仮想SDカードを作成する

mksdcardコマンドで、エミュレータで使用する仮想SDカードを作成できる。AVD作成時にも指定できるがmsdcardコマンドであとで変更もできる
fat32形式で作成でき容量は9MB以上。
作成した、仮想SDカードをエミュレータで使用するには、-sdcardオプションをつけてemulatorコマンドを実行する。

### プロジェクトを作成する

androidコマンドでAndroid仮想デバイスの作成・削除・参照、プロジェクトの作成・更新、AndroidSDKの更新ができる。
新規作成するにはandroid create projectコマンドを使用する。

---

## monkeyツール

アプリケーションに対して、クリック、タッチ、ジェスチャをランダムで実行することでバグを発見するツール。

### monkeyの起動

エミュレータが起動しているか、USBで認識されている端末がある状態で、adb shell monkeyコマンドを実行する。
adb shell monkey [options] `<event-count>`のevent-countはイベントのカウント数

monkeyツールの主なオプション一覧

|オプション|役割|
|---|---|
|-v|出力レベルの調整0（デフォルト）~2の範囲で指定する|
|-s|疑似ランダムイベントのもとになるSeed値を指定する|
|-throttle|イベントの間隔値をミリ秒で指定する|
|-p|テストをするパッケージ名を指定する|

monkeyツールを使うと簡単にUIイベントのストレステストができる。ストレステストをする際はthrottleオプションを指定すると良い。（指定しないと0になるため）