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("Filename Filetype Filesize n");
for($index=0; $index < $indexCount; $index++) {
if ((substr("$dirArray[$index]", 0, 1) != ".")
&& (strrpos("$dirArray[$index]", ".stacktrace") != false)){
print("");
print("$dirArray[$index]");
print(" ");
print(filetype($dirArray[$index]));
print(" ");
print(filesize($dirArray[$index]));
print(" n");
}
}
print("n");
?>
- upload.php
アプリからの例外情報をファイルに保存している。
これらの動作例は、こちらで確認できる。
セキュリティに注意
この仕組みを使えば、例外が発生するほどの問題はユーザーから教えてもらう事なく知る事ができる。
ただ、この通知先URLを公開してしまうといろいろ問題になる可能性があるので、これらの情報の取扱には気をつけましょう、という事で。
コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチ | |
![]() | 安生 真 日経BP社 2010-01-14 売り上げランキング : 1314 Amazonで詳しく見る by G-Tools |