戌印-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
11

スポンサーサイト

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

ログの入出力 : Logcat

Android ではログ管理として Logcat が用意されています。

【ソフトウェア技術ドキュメントを勝手に翻訳】
6.4 ログの読み書き
‎8. ツール‎ - logcat

【参考サイト】
Android Wiki* - Androidアプリケーションからlogcatコマンドを実行する
BRILLIANT SERVICE - LogcatをAndroid端末上で見るツール LogcatViewer


■ ログの入力
Logcat にログを入力するには Log クラスを使用します。

Log#v(String tag, String msg) ( 冗長 )
Log#d(String tag, String msg) ( デバッグ )
Log#i(String tag, String msg) ( 情報 )
Log#w(String tag, String msg) ( 警告 )
Log#e(String tag, String msg) ( エラー )

ログを入力する際に注意しなければいけないことは、アプリのリリース/デバッグ関係なく全てのログが入力されてしまうことです。
そのため、デバッグログなどデバッグ時のみに出力したい場合には BuildConfig.DEBUG (※) 等をつけて制御を行う必要があります。
※ リリースビルド以外では必ず true になる。

実行例
if (BuildConfig.DEBUG) {
Log.d("TAG", "MESSAGE");
}
android_log.png


■ ログの出力
ログの出力には2つの方法があります。

① DDMS から Logcat を出力する
eclipse を使用している場合、メニューの [ウィンドウ(W)] - [ビューの表示(V)] - [その他()] から Android - Logcat を選択することで表示されます。
android_logcat_ddms.png


② adb シェルを介して logcat を実行する
logcat を実行する際のオプションやフォーマットはこちらのサイトを参照してください。
Android Wiki* - Androidアプリケーションからlogcatコマンドを実行する

・デバイスが接続されたPCにリモートで Logcat を出力
Windows の場合、コマンドプロンプトを起動して adb logcat と入力すれば表示されます 。
※ [ANDROID_SDK]\platform-tools のパスが通っている必要があります

・Android アプリで Logcat を取得する方法
Android アプリから Logcat を参照する場合、AndroidManifest.xmlandroid.permission.READ_LOGS パーミッションを追加する必要があります。
<uses-permission android:name="android.permission.READ_LOGS" />

なお、Logcat を読み込むための API は用意されていません。
そのため Runtime.getRuntime().exec(String prog) を使い、アプリ上で Logcat を実行します。
Process process = Runtime.getRuntime().exec("logcat");
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()), 1024);
String line;
while ((line = reader.readLine()) != null) { // -d オプションなければ読み続ける
// ログ処理
}

最後に Logcat をリアルタイム監視するサンプル
android_logcat.png
package jp.inujirushi.android.sample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TestActivity extends Activity {

private static final int LOG_COUNT = 100; // ログ行数
private static final int RELOAD_TIME = 500; // 再取得時間
private Thread mThread;
private Timer mTimer;
private TextView mTextView;
private List<String> mLogList = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
mTextView = (TextView) findViewById(R.id.textView);
}

@Override
protected void onResume() {
super.onResume();

// Logcat 取得スレッド開始
if (mThread == null) {
mThread = new Thread(mRunnable);
}
mThread.start();

// Logcat 表示タイマー開始
if (mTimer == null) {
mTimer = new Timer();
}
mTimer.schedule(mTimerTask, 0, RELOAD_TIME);
};

@Override
protected void onPause() {
super.onPause();

if (mThread != null) {
mThread.interrupt();
}
if (mTimer != null) {
mTimer.cancel();
}
};

// Logcat の内容をリストに出力する
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
Process process = null;
BufferedReader reader = null;
try {
// Logcat 出力コマンド
// String command = "logcat";
String[] command = { "logcat", "-v", "time", "*:V" };

// Logcat を出力する
process = Runtime.getRuntime().exec(command);
reader = new BufferedReader(new InputStreamReader(
process.getInputStream()), 1024);
String line;
while ((line = reader.readLine()) != null) {
if (mLogList.size() > LOG_COUNT) {
mLogList.remove(0);
}
mLogList.add(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};

// 出力した Logcat を一定時間毎に画面に表示する
private TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
// Logcat を取得する
final StringBuilder sb = new StringBuilder();
List<String> list = new ArrayList<String>(mLogList);
for (String log : list) {
sb.insert(0, log + "\n");
}

// Logcat を表示する
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText(sb);
}
});
}
};
}

サービスを介した本格的な Logcat 監視アプリが以下のサイトでソースコード付きで公開されています。
BRILLIANT SERVICE - LogcatをAndroid端末上で見るツール LogcatViewer
実際にアプリとして作るならこちらを参考にすることをオススメします。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

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

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

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

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