j2me にはどのようなロギング ソリューションがありますか?
パッケージとメモリのフットプリントを小さくするために、「リリース」バージョンのログを簡単に除外することに特に興味があります。
j2me にはどのようなロギング ソリューションがありますか?
パッケージとメモリのフットプリントを小さくするために、「リリース」バージョンのログを簡単に除外することに特に興味があります。
MicroLog は確かに賭けます。Log4j のような Java ME (J2ME) 用の小さなロギング ライブラリです。コンソール、ファイル、RecordStore、キャンバス、フォーム、Bluetooth、シリアル ポート (Bluetooth、IR、USB)、ソケット (SSL を含む)、UDP、Syslog、MMS、SMS、電子メール、または Amazon S3 へのロギングをサポートしています。 .
Proguard で前処理と難読化を使用している場合は、単純なログ クラスを使用できます。
public class Log {
public static void debug(final String message) {
//#if !release.build
System.out.println(message);
//#endif
}
}
または、必要な場所でログを記録します。release.build プロパティが true に設定されている場合、このコードはコメント アウトされ、空のメソッドになります。Proguard は空のメソッドのすべての使用を削除します - 実際、リリース ビルドではすべてのデバッグ メッセージが削除されます。
編集:
ライブラリ レベルで考えてみると (J2ME ライブラリのマッピングに取り組んでいます)、おそらくより良い解決策が見つかりました。
public class Log {
private static boolean showDebug;
public static void debug(final String message) {
if (showDebug) {
System.out.println(message);
}
}
public static void setShowDebug(final boolean show) {
showDebug = show;
}
}
このようにして、最終開発者は、関心のあるライブラリ内のログ レベルを有効にできます。何も有効にしない場合、最終製品の難読化ですべてのログ コードが削除されます。甘い :)
/JaanusSiim
proguardで-assumenosideaffectsを使用して、ロギングクラスを完全に削除できます。
-assumenosideeffects public class logger.Logger {*;}
前処理する必要はありません。
Symbian 自体によって変更された Sun 仮想マシンを持つ Series60 および UIQ 電話には、標準出力リダイレクトがあります。
System.out をキャプチャできるだけでなく、Throwable.printStackTrace() も機能します。
初期のハンドセットでは、標準ライブラリ サーバー プロセスにフックする C++ アプリケーションを作成する必要がありました。Symbian は、VM の標準出力をコンソールまたはファイルにキャプチャできる Redirector アプリケーションを作成しました。
新しいハンドセットでは、VM の標準出力を Java の byte[] または String オブジェクトに読み込むことができる "redirect://" GCF プロトコルが導入され (別の MIDlet で実行する必要があります)、Redirector アプリケーションは で書き直されました。ジャバ。
Series60 3rd Edition Feature Pack 2 ハンドセット (およびそれ以降) で使用される最新の J9 VM では、代わりに「redirect://test」を試す必要がある場合があります。
MIDPLoggerを本番アプリケーションである程度許容できるレベルまで使用しましたが、スイート内の別の Midlet などとしてではなく、アプリケーションに統合した後により多くの用途があることがわかりました。MicroLogも見つけましたが、詳細には使用していません。
私はバイトコードオプティマイザを作成しました。クラスファイルの形式により、クラス名と関数のUTFエンコーディングを指定できます。これにより、MyClass.someFunc()を使用してログを出力できます(タイプを取得する場合は、署名を処理できます。 )これにより、 LINE&FILEマクロを使用してCスタイルのデバッグのようなことができます。
ロガー クラスの条件付きコンパイルを使用しても、ロギング ステートメントを完全に削除するという問題は解決されません。変数の値を調べて、それらを文字列に組み立てます。たとえば、WhateverLog.log( "Loaded " + someclass.size() + " foos" ) です。
ここで、WhateverLog.log の本体のみを省略した場合 (受け入れられた解決策に示されているように)、文字列の連結 (したがって、StringBuffer の作成) を含む多くの不要なコードが残ります。そのため、proguard などのバイト コード後処理ツールを使用することをお勧めします (前述)。Proguard の -assumenosideeffects を使用すると、オプティマイザはロギング ステートメントだけでなく、結果がロギング呼び出しによってのみ使用されるすべてのコードも削除できます。
J2ME の LWUIT フレームワークは、内部にステートメントのログを記録できる Logging フォームを提供します。例外が発生する可能性があると思われるすべての場所にログを追加できます。
例: Log.getInstance().showLog(); 上記の行を追加すると、J2ME デバイスでのログを追跡できます。