Xamarin逆引きTips
Xamarin.iOS/Androidでログを出力するには?
Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。
アプリケーションのログ出力は、ネイティブAndroidの開発ではandroid.util.Log
クラスが、iOS開発ではNSLog
関数が一般的に使われている。
今回は、これらの機能をXamarin.Android/iOSで使用する方法と、Xamarin.iOS/Androidで共通なログ出力処理を行う方法を解説する。
1. Xamarin.Androidでのログ出力
Xamarin.Androidでは、ネイティブで使っていたLog
クラス(XamarinではAndroid.util
名前空間)がそのまま使用できる。
……省略……
private const string TAG = "MainActivity";
……省略……
// ActivityにButtonを追加し、それを押した時のイベントハンドラー
button.Click += (sender, e) =>
{
Android.Util.Log.Verbose(TAG, "細かな情報を記録します");
Android.Util.Log.Info(TAG, "情報を記録します");
Android.Util.Log.Debug(TAG, "デバッグ情報を記録します");
Android.Util.Log.Warn(TAG, "警告情報を記録します");
Android.Util.Log.Error(TAG, "エラー情報を記録します");
};
|
出力されたログは、adb logcat
コマンドの他、Xamarin Studioでも確認できる。
2. Xamarin.iOSでのログ出力
ネイティブiOSのNSLog
関数は、Xamarin.iOSには用意されていない。よって、次に示す共通なログ出力処理を使用する。
3.Xamarin.iOS/Androidで共通なログ出力処理を行う
.NETの開発者にはおなじみだと思うが、.NET Frameworkには、初期からDebug
クラスやTrace
クラス(いずれもSystem.Diagnostics
名前空間)、Console
クラス(System
名前空間)という情報出力系のクラスがある。これらのクラスはXamarin.iOS/Androidにおいても適切に実装されているので、これらを使うことでログ出力処理を共通化できる。
これらのクラスを使うと、Log
クラスを使ったXamarin.Androidの処理は次のように書ける。
// ActivityにButtonを追加し、それを押した時のイベントハンドラー
button.Click += (sender, e) =>
{
System.Diagnostics.Debug.WriteLine("Debug.WriteLine による出力です");
System.Diagnostics.Trace.WriteLine("Trace.WriteLine による出力です");
System.Console.WriteLine("Console.WriteLine による出力です");
};
|
また、Xamarin.iOSでも同じように記述できる。
// ViewControllerにNSButtonを追加し、それを押した時のイベントハンドラー
button1.TouchUpInside += (sender, e) =>
{
System.Diagnostics.Debug.WriteLine("Debug.WriteLine による出力です");
System.Diagnostics.Trace.WriteLine("Trace.WriteLine による出力です");
System.Console.WriteLine("Console.WriteLine による出力です");
};
|
Debug/Trace/Consoleクラスの実行条件
同じようなメソッドを持つクラスが、なぜ3つもあるのか。それは、以下のような違いによるものだ。
Debug
クラス: デバッグビルド時にのみ評価、出力されるTrace
クラス: リリースビルド時にのみ評価、出力されるConsole
クラス: デバッグ/リリース関係なく常に出力される(もともとは「標準出力」へ書き出すためのクラスだ)
Xamarin Studioの左上にあるビルド構成を「Debug」にすると、下の画面のようにTrace.WriteLine
の行が灰色となり、無効化されるのが分かるだろう。これは、デバッグモードではTrace.WriteLine
の行が「存在しないもの」として扱われ、ビルドされたアプリケーションには含まれないことを意味している。
次にビルド構成を「Release」に変更すると、Debug.WriteLine
の行が無効に、Trace.WriteLine
の行が有効になるはずだが、両方とも無効で、Console.WriteLine
の行のみが有効となっている(図2参照)。
これは、リリースビルドでも既定ではTrace
クラスが無効になっているためで、[システムメニュー]-[プロジェクト]-[<プロジェクト名>のオプション]から、図3に示す設定ダイアログを表示させ、[ビルド]-[コンパイラ]の設定で、[コンフィグレーション]を「Release」とした後、[シンボルを定義]にTRACE;
と記述して[OK]ボタンを押す。
すると、図4のようにTrace
の行が有効化されるはずだ。
図3の設定を、Debug、Releaseで見比べると分かるが、シンボルにDEBUG;
が定義されているとDebug
クラスが有効となり、TRACE;
が定義されているとTrace
クラスが有効になる。つまり、コードを変更せずとも、プロジェクトの設定によりログの出力がON/OFFできるということだ。一方でConsole
クラスは設定に関係なく必ず出力される。
まとめ
Debug
クラス、Trace
クラスを利用すると、iOS/Androidアプリ開発でログ出力を共通化できる例を解説した。しかしこれらのクラスはログ出力としては簡易的なものであり、利用用途は開発中のアプリに限られるだろう。
配布したアプリケーションのログの収集や分析、クラッシュレポートの収集などを行いたい場合は、DeployGateやCrittercismなどのユーザー分析サービスが提供するネイティブのライブラリを検討するべきだろう。Xamarinとしても、先日開催されたEvolve 2014で、Xamarin Insightsという新機能が発表されたので、今後の情報に注目したい。
【コラム】Xamarinに対応したログ出力ライブラリは存在するのか?
.NET開発でのログ出力ライブラリでは、log4jを.NETへ移植したlog4netが有名だろう。log4netはXamarinで利用できるのだろうか?
- [LOG4NET-435] Port log4net to Xamarin Android and Xamarin iOS targets - ASF JIRA(英語)
- monotouch - How to use Log4Net in Xamarin - Stack Overflow(英語)
- log4net usage - Xamarin Forums(英語)
これらの情報を見る限り、積極的に利用を勧められる状態にはないようだ。Xamarinでの開発でlog4netが使われている雰囲気も感じられない。
他には、アプリ開発のフレームワークとして、MvvmCrossを利用しているならば、MvxTrace
というクラスが利用できる。MvvmCrossは利用者の多いライブラリであるため、このクラスを使っている開発者も多いだろう。
※以下では、本稿の前後を合わせて5回分(第23回~第27回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
23. Xamarin.Androidで地図にマーカーを表示するには?(Google Maps使用)
「Google Maps Android API v2」を使って、Xamarin.Androidアプリで地図上にマーカーや吹き出しを表示する方法を解説する。
24. Xamarin Studio で画面を分割するには?(ショートカットキー情報あり)[Mac&Win対応]
Xamarin Studioの新機能として、コードエディターを左右の領域に分割して表示できるようになった。マウスとショートカットキーによる操作方法を説明する。
25. 【現在、表示中】≫ Xamarin.iOS/Androidでログを出力するには?
Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。
26. Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。
27. Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)
Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。