2011-02-06

android.util.Config.DEBUGが役に立たない

public static final boolean DEBUG

If this is a debug build, this field will be true.

android.util.ConfigというクラスにDEBUGというbooleanの定数がある。説明の通りデバッグビルドかどうかこの定数を通じて調べることができる。これは嘘ではないのだが、アプリケーション(apk)のビルドのことではなく、デバイスがデバッグビルドかどうかというのを見るものらしい。つまり、アプリケーションの開発者の欲しがるような「LOGのメソッドを呼ぶか切り替えるスイッチ」ではない。

代案としてあがっているものはどれも微妙に意味あいが違う。

  • ユニットテストを真面目に書く (・・・ようにすれば、デバッグのためのログは必要なくなるはず)

ウィザードモードなんかをつけたい場合には応用がきかない。

  • デバッガが接続されているか調べる

if (Debug.isDebuggerConnected()) { ... }

見た目に綺麗だが、「実機に入れて動かしていたら落ちたのでログを見たい」という場合とは使いどころが合わない。

  • マニフェスト(AndroidManifest.xml) の属性設定でDebuggableを切り替え、それを調べる

if ((applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { ... }

おそらくこれが最もまっとうな方法。設定ファイルに書き込む欄があり、それを調べる手段があるのだから、利用しない手はない。ApplicationInfoを取得するのに手間がかかるのが難点。

  • 自前で定数を定義する

static import com.example.android.app.StaticConfig.DEBUG;

if (DEBUG) { ... }

上に出た代案の問題はどれも問題がある。条件がコンパイル時定数でないので最適化されず、結局コンパイル後にも条件の判定やLOG文は残ってしまう。「#ifdefの代わり」としては結局これしかないように思う。

DEBUG = true; DEBUG = false; を手で切り替える手間を省けないかと考えている。antの-pre-compileタスクあたりにコード生成を挟めばよいのだろうか。

(copied from tumblr)

0 件のコメント:

コメントを投稿