ACRA

Application Crash Reports for Android というソレを云々してみることに。ソースは APL で配布されてて以下から取得できるとのこと。

ソースツリーを見るに maven で云々なのか。端末で mvn って入力したら導入はされている模様。なのでとりあえずソース取得してみることに。

$ git clone https://github.com/ACRA/acra.git

で、ディレクトリ移動して mvn って入力したら BUILD FAILURE と言われるなど。

出力メセジを見るに

以下なのかどうか。

$ mvn compile

なんかもごもご動いてます。gradle にって PR 投げたらどうなるのかな (ぇ

あら

以下とのこと。

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
Fatal Error: Unable to find package java.lang in classpath or bootclasspath

で、色々云々してたのですが、mvn package で BUILD SUCCESS 出ました。target ディレクトリに .jar がいくつかできてます。SNAPSHOT って付いてるのがアレですが。

とりま SD に保存したいというリクエスト

自分で云々した方が早そげ。とは言いつつ ACRA で何とかできんかな、と思っていたら

というソレを発見。ReportSender という interface を実装したクラスをでっちあげて以下で云々とあります。

@Override
  public void onCreate() {
      ACRA.init(this);
      YourOwnSender yourSender = new YourOwnSender(whatever, parameters, needed);
      ACRA.getErrorReporter().setReportSender(yourSender);
      super.onCreate();
  }

ええと、ReportSender な実装見てみるに以下。

public interface ReportSender {
    /**
     * Send crash report data. You don't have to take care of managing Threads,
     * just implement what is necessary to handle the data. ACRA will use a
     * specific Thread (not the UI Thread) to run your sender.
     * 
     * @param errorContent
     *            Stores key/value pairs for each report field. A report field
     *            is identified by a {@link ReportField} enum value.
     * @throws ReportSenderException
     *             If anything goes fatally wrong during the handling of crash
     *             data, you can (should) throw a {@link ReportSenderException}
     *             with a custom message.
     */
    public void send(CrashReportData errorContent) throws ReportSenderException;
}

メソド一つで良いらしい。HttpSender とか確認しておこうかな。

HttpSender#send

定義を順に確認してみます。

    @Override
    public void send(CrashReportData report) throws ReportSenderException {

引数で渡される report をどうしてるかというと、以下。

            // Generate report body depending on requested type
            switch (mType) {
            case JSON:
                reportAsString = report.toJSON().toString();
                break;
            case FORM:
            default:
                final Map<String, String> finalReport = remap(report);
                reportAsString = HttpRequest.getParamsAsFormString(finalReport);
                break;

            }

getParamsAsFOrmString で何をしてるかというと以下な模様。

    public static String getParamsAsFormString(Map<?, ?> parameters) throws UnsupportedEncodingException {

        final StringBuilder dataBfr = new StringBuilder();
        for (final Object key : parameters.keySet()) {
            if (dataBfr.length() != 0) {
                dataBfr.append('&');
            }
            final Object preliminaryValue = parameters.get(key);
            final Object value = (preliminaryValue == null) ? "" : preliminaryValue;
            dataBfr.append(URLEncoder.encode(key.toString(), "UTF-8"));
            dataBfr.append('=');
            dataBfr.append(URLEncoder.encode(value.toString(), "UTF-8"));
        }

        return dataBfr.toString();

なので、テキストとして取り出して SD に出力するような処理を書いてしまえば良いはず。

とりあえず

LibraryProject にしてやれ、って思ったのですがこれって acra な jar を libs に入れた形にしてやらないと駄目ですね。動作確認含めて、でヤッてみたいと思います。

  • LibraryProject 作る
  • libs にさっき作った acra な jar を放りこむ
  • HttpSender を実装したクラスを作る (とりあえずガワのみ)

これで、このライブラリを使う側が acra な部品まで使えれば OK、て事なのですが大丈夫かなぁ。とりあえず色々確認して Build Path の外部 jar に acra な jar を設定することに。
とりあえず以下なソースがでっち上がったので

public class SDCardSender implements ReportSender {

    @Override
    public void send(CrashReportData arg0) throws ReportSenderException {
        // TODO Auto-generated method stub

    }

}

これで initial commit 作ってしまえ。

あら?

でもこれって外部 jar の情報ってどこに記述されるんだったっけ。あ、.classpath だ。ignore しちゃってますね。とりあえず uses-library を AndroidManifest に追加するなど。

    <uses-library
        android:name="org.acra"
        android:required="true" />

これが正解かどうかは不明。とりあえず育てます。

build はできた

以下な問題が出ましたが何故かは分からず。

試験は別途で。作業続行したら追記するかもしれません。