2011年1月25日火曜日

Androidアプリのエラーレポートの中身を紹介「個人情報が送られることはない」

Androidにはアプリの「エラーレポート」を送信する機能があります。
しかし、この機能に関して解説が見あたらず、如何なる情報が送られるか一般の人には知られていません。 
そこで、安心してエラーレポートを送れるように、どのような内容の情報が渡されるかを紹介します。


1.Androidアプリの停止

アンドロイドアプリの使用中に以下の様なダイアログが表示されて、アプリケーションが停止してしまったことは無いでしょうか?
送信者 sakaneya

残念ながらこの時点で、アプリはどうにもならない状態です。
まれにこのダイアログが出ることもなく再起動してしまうエラーもありますが、
この画面が出ていれば、これからの行動でアプリが改良される可能性があります。



2.「Force close」と「Report」
エラー時に表示されるこのダイアログは、利用者にはエラーの発生と開発者にエラーレポートを送る為に存在します。

Force close」そのまま終了します。
Report」開発者にエラーレポートを送ります。

「Report」ボタンを押してエラーレポートを送ったことのある方はどの位いらっしゃるでしょうか?
一般的な開発者にとってエラーレポートはWelcomeなんですよ たぶん。

そもそも「Report」を送る気がない、「携帯内の個人情報が送信されるかも知れないから送らない」と「Force close」でアプリを停めてそれっきりって事はありませんか?
この先どのような情報が送られるのかを紹介します。



3.「Report」ボタンを押すとなにが送られるのか?

結論から 
端末機種名や使用者の情報はありません。
以下の2枚の画像が開発者に開示される内容のすべてです。

書かれている内容は、「アプリ名、バージョン、エラー発生時刻、発生箇所、発生回数、ユーザーメッセージ 」です。
これらはGoogleが用意した開発者用のWEBページで確認します。
メールなどで直接開発者に送信されるわけではありません。また無関係の者がそのエラーを見ることもできません。


画像をクリックすると大きく表示されます。
内容:プログラムのどの部分で発生したか
送信者 sakaneya

画像をクリックすると大きく表示されます。
内容:ユーザーメッセージ(エラーレポートを送信したユーザーが書き込んだメッセージ)
送信者 sakaneya

ユーザーメッセージは、ユーザーが端末で入力したままが送られます。
下の画像は、上のメッセージを入力したときの端末キャプチャーです。
このユーザーメッセージはオプションのため、書かないで空のまま送る事も選択出来ます。
送信者 sakaneya
上記に見る通り開発者に送られるレポートはプログラムのエラー情報だけです。




4.どんどんエラーレポートを送ろう

Android標準のエラーレポートでは、端末内の個人情報が送信されることはありません。
安心して「レポート」ボタンを押してもらってよいと思います。
終了したプロジェクトでない限り、アプリが改良される可能性が高くなるでしょう。
一度だけのエラー情報では行動が起きないかも知れませんが、複数集まると動かざるを得ない.....

元ネタは、Galakabe に送られてきたエラーレポートを元にエラーを再現して紹介しました。
今回のアップデート(Galakabe Ver2.1.0.1)では、WEB上の画像リンクを押した時に発生したエラーでアプリが落ちることなく適切なメッセージを出せるようになりました。
下のソースは修正した部分です。おまけに載せておきます。


具体的には以下の様にチェックが甘かった部分に
/**
* Urlに指定した先の画像をビットマップにして返す
* @param url 画像のurl
* @return 成功:Bitmap
*/
public static Bitmap getImage(String url) {
  byte[] byteArray = getByteArrayFromURL(url);
  return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
}
nullチェックを追加して、問題が起きないよう修正
/**
* Urlに指定した先の画像をビットマップにして返す
* @param url 画像のurl
* @return 成功:Bitmap 失敗:null
*/
public static Bitmap getImage(String url) {
  byte[] byteArray = getByteArrayFromURL(url);

  if(byteArray==null)
    return null;

  return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
}

0 件のコメント:

コメントを投稿