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 はできた
以下な問題が出ましたが何故かは分からず。
試験は別途で。作業続行したら追記するかもしれません。