戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ANR と traces.txt

Android ではアプリが一定時間応答が無いとき ANR (Application Not Responding) ダイアログが表示されます。

android_anr.png

ソフトウェア技術ドキュメントを勝手に翻訳 - 7. レスポンスのための設計

一定時間とは以下の時間をさします。
・メインスレッドから 5 秒以上応答が無い
・BroadcastReceiver が 10 秒以内に完了しない
ただし、この時間はメーカーがいじっている場合があるため必ずしも上記の時間で発生するとは限りません。

時間のかかる処理は避けるべきですが、ファイル作成など時間のかかる処理を行う場合には子のスレッド(Thread や AsyncTask)や Service など介して行うことで対処できます。


ANR が発生したときには Logcat にログは出力されないため、どこの処理で時間がかかっているか分かりません。
しかし、traces.txt というファイルに最後に発生した ANR の情報が出力されているのでこのファイルを元に原因を特定することが可能です。

出力パス: /data/anr/traces.txt
出力例: traces.txt

一般の root 権限の無いデバイスではこのファイルが出力されている /data フォルダの中を見ることはできませんが、ファイル自体は参照可能になっています。

・adb シェルを介して traces.txt を操作する
Windows の場合、コマンドプロンプトを起動して以下のコマンドを入力して操作します。
※ [ANDROID_SDK]\platform-tools のパスが通っている必要があります

① 直接ファイルを参照する
adb cat /data/anr/traces.txt

② ファイルをローカルにコピーする
adb pull /data/anr/traces.txt [出力先]


・Android アプリで traces.txt を取得する
ファイル自体は参照可能なため、通常のファイルコピー等によりファイルを取得できます。
package jp.inujirushi.android.sample;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class TestActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);

// traces.txt をコピーする
String srcPath = "/data/anr/traces.txt";
String destPath = Environment.getExternalStorageDirectory() + "/traces.txt";
try {
copyTo(srcPath, destPath);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* ファイルを指定されたパスにコピーします。
*
* @param srcPath
* コピー元ファイルパス
* @param destPath
* コピー先のファイルパス
* @throws IOException
*/
public static void copyTo(String srcPath, String destPath)
throws IOException {
FileChannel srcChannel = null;
FileChannel destChannel = null;
try {
srcChannel = new FileInputStream(srcPath).getChannel();
destChannel = new FileOutputStream(destPath).getChannel();
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} finally {
srcChannel.close();
destChannel.close();
}
}

}
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。