差分表示


Androidでログを出力する方法.マーケットにアップロードする際に,簡単に全ログ出力をオフにできる方法です.
//parent=Android

*Androidで自動オフできるログ出力
Androidでログを出力する場合,標準のandroid.util.Logクラスを使えばいいので簡単なのですが,
これをそのまま使うと,Android Marketにアップロードするためのapkを作る前に,全てのログをオフにするという作業が面倒です.

そこで,[[地図ロイド]]で使っている方法を紹介します.

考え方は,以下のページを参考にしました.
-&link(Taosoftware: Android ApiキーをRelease版とDebug版で切り替える方法,http://www.taosoftware.co.jp/blog/2009/03/android_apireleasedebug.html)

読んでいて本当に賢い方法だと感心したのですが,AndroidManifest.xmlの以下の箇所,
''android:debuggable''の設定を使って,判断します.
これがtrueかfalseかで,ログのオンオフを自動切り替えします.リリース前にandroid:versionCodeを増やしますが,
そのついでにここをfalseに変えてからapkを生成するというフローです.まず作業漏れは起こらないです

&ltitle(AndroidManifest.xml);
--(
<application ''android:debuggable="true"'' android:icon="@drawable/icon" android:label="@string/app_name">
--)
&ltitle(Activityクラス);
--(,java
public class MainView extends Activity {
	public static boolean isDebugMode;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		isDebugMode = DeployUtil.isDebugAble(this);
		isDebugMode = DeployUtil.isDebuggable(this);
		・・・
	}

	private static void log(String mes) {
		if (isDebugMode) {
			Log.d("**chiz MainView", mes);
		}
	}
}
--)
このように,Activityクラスでは以下のユーティリティメソッドを呼び出して,デバッグモードかどうかを自身の
public staticな変数に格納しています.

&ltitle(ユーティリティクラス);
--(1,java
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クラス以外からログを出力する場合は,以下のようなメソッドを各クラスに作成して,
それを呼び出すようにしています.
--(,java
private static void log(String mes) {
	if (MainView.isDebugMode) {
		Log.d("**chiz Storage", mes);
	}
}
--)
このメソッドは各クラスに作るのではなく,Activityクラスに移して集約し,それを各クラスから呼び出すという方法もありえますが,
開発中にプログラムにログ出力を入れるときの打鍵数をできるだけ少なくしたかったので,あえてこうしています.


© 2023 KMIソフトウェア