preload
1月 13

UncaughtExceptionクラスを継承して例外をキャッチした後、例外が発生するまでのスタックトレースを、SDカードに書き込む & 特定のURLにPostさせる方法を紹介。元ネタはこちら

これによって、アプリ開発者はユーザーからの報告を受ける事なくアプリで発生した例外を知る事ができるようになる。もちろんバグチェックしているのだが、やっぱり起こる時は起こる。作ったのは人間だもの。

Androidアプリ

コード抜粋。サンプルとしてボタンを押すとゼロ除算の例外が発生するアプリを作成した。

public class MainActivity extends Activity {
 
	protected static final String TAG = "MainActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        String url = "http://(どこかのURL)/upload.php";
		Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler("/sdcard/", url));
 
		Button button1 = (Button)findViewById(R.id.button1);
		button1.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				int val1 = 10;
				int val2 = 0;
				int val3 = val1 / val2; // ここで例外が発生する
				Log.d(TAG, "val3:"+val3);
			}
		});
    }
}

サンプルアプリダウンロード:exception_app

Server側

記録された例外が一覧表示される。

  • index.php
<?php
    $myDirectory = opendir(".");
    while($entryName = readdir($myDirectory)) {
                $dirArray[] = $entryName;
    }
    closedir($myDirectory);
    $indexCount = count($dirArray);
    sort($dirArray);
    print("<TABLE border=1 cellpadding=5 cellspacing=0 \n");
    print("<TR><TH>Filename</TH><TH>Filetype</th><th>Filesize</TH></TR>\n");
    for($index=0; $index < $indexCount; $index++) {
                if ((substr("$dirArray[$index]", 0, 1) != ".") 
                                    && (strrpos("$dirArray[$index]", ".stacktrace") != false)){ 
                                print("<TR><TD>");
                                print("<a href=\"$dirArray[$index]\">$dirArray[$index]</a>");
                                print("</TD><TD>");
                                print(filetype($dirArray[$index]));
                                print("</TD><TD>");
                                print(filesize($dirArray[$index]));
                                print("</TD></TR>\n");
                }
    }
    print("</TABLE>\n");
?>
  • upload.php

アプリからの例外情報をファイルに保存している。

<?php
$filename = isset($_POST['filename']) ? $_POST['filename'] : "";
$message = isset($_POST['stacktrace']) ? $_POST['stacktrace'] : "";
    if (!ereg('^[-a-zA-Z0-9_. ]+$', $filename) || $message == ""){
                die("This script is used to log debug data. Please send the "
                                    . "logging message and a filename as POST variables.");
    }
    file_put_contents($filename, $message . "\n", FILE_APPEND);
?>

これらの動作例は、こちらで確認できる。

セキュリティに注意

この仕組みを使えば、例外が発生するほどの問題はユーザーから教えてもらう事なく知る事ができる。

ただ、この通知先URLを公開してしまうといろいろ問題になる可能性があるので、これらの情報の取扱には気をつけましょう、という事で。

コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチ
コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチ安生 真

日経BP社 2010-01-14
売り上げランキング : 1314


Amazonで詳しく見る
by G-Tools

関連記事

TrackBack URL :

コメントをどうぞ

Comments links could be nofollow free.