Androidでログを出力する方法.マーケットにアップロードする際に,簡単に全ログ出力をオフにできる方法です.
Androidで自動オフできるログ出力
Androidでログを出力する場合,標準のandroid.util.Logクラスを使えばいいので簡単なのですが,
これをそのまま使うと,Android Marketにアップロードするためのapkを作る前に,全てのログをオフにするという作業が面倒です.
そこで,地図ロイドで使っている方法を紹介します.
考え方は,以下のページを参考にしました.
読んでいて本当に賢い方法だと感心したのですが,AndroidManifest.xmlの以下の箇所,
android:debuggableの設定を使って,判断します.
これがtrueかfalseかで,ログのオンオフを自動切り替えします.リリース前にandroid:versionCodeを増やしますが,
そのついでにここをfalseに変えてからapkを生成するというフローです.まず作業漏れは起こらないです
AndroidManifest.xml
<application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name">
Activityクラス
public
class
MainView extends
Activity {
public
static
boolean
isDebugMode;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
isDebugMode = DeployUtil.isDebuggable(this
);
・・・
}
private
static
void
log(String mes) {
if
(isDebugMode) {
Log.d("**chiz MainView"
, mes);
}
}
}
このように,Activityクラスでは以下のユーティリティメソッドを呼び出して,デバッグモードかどうかを自身の
public staticな変数に格納しています.
ユーティリティクラス
import
android.content.Context;
import
android.content.pm.ApplicationInfo;
import
android.content.pm.PackageInfo;
import
android.content.pm.PackageManager;
import
android.content.pm.PackageManager.NameNotFoundException;
public
class
DeployUtil {
/**
* マニフェストファイルからデバッグモードかどうかを取得する
* @param ctx
* @return
*/
public
static
boolean
isDebuggable(Context ctx) {
PackageManager manager = ctx.getPackageManager();
ApplicationInfo appInfo = null
;
try
{
appInfo = manager.getApplicationInfo(ctx.getPackageName(), 0);
} catch
(NameNotFoundException e) {
return
false
;
}
if
((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE)
return
true
;
return
false
;
}
/**
* マニフェストファイルからバージョン名を取得する
* @param ctx
* @return
*/
public
static
String getVersionName(Context ctx) {
String versionName = ""
;
PackageManager pm = ctx.getPackageManager();
try
{
PackageInfo info = null
;
info = pm.getPackageInfo(ctx.getPackageName(), 0);
versionName = info.versionName;
} catch
(NameNotFoundException e) {
}
return
versionName;
}
}
getVersionName()は,今回のログ出力には関係ないメソッドです.アプリから自分のバージョン番号を表示する時に,
このメソッドを呼び出しています.
Activityクラス以外からログを出力する場合は,以下のようなメソッドを各クラスに作成して,
それを呼び出すようにしています.
private
static
void
log(String mes) {
if
(MainView.isDebugMode) {
Log.d("**chiz Storage"
, mes);
}
}
このメソッドは各クラスに作るのではなく,Activityクラスに移して集約し,それを各クラスから呼び出すという方法もありえますが,
開発中にプログラムにログ出力を入れるときの打鍵数をできるだけ少なくしたかったので,あえてこうしています.