J2ME へのログイン
-
02-07-2019 - |
質問
j2me にはどのようなロギング ソリューションがありますか?
特に、パッケージとメモリのフットプリントを小さくするために、「リリース」バージョンのログを簡単に除外することに興味があります。
解決
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;
}
}
このようにして、エンド開発者は、関心のあるライブラリ内のログ レベルを有効にすることができます。何も有効にしない場合は、最終製品の難読化ですべてのロギング コードが削除されます。甘い :)
/ヤーヌス・シム
他のヒント
MicroLog は間違いありません。これは、Log4j のような Java ME (J2ME) 用の小さなログ ライブラリです。コンソール、ファイル、RecordStore、Canvas、Form、Bluetooth、シリアルポート (Bluetooth、IR、USB)、ソケット (SSL を含む)、UDP、Syslog、MMS、SMS、電子メール、または Amazon S3 へのログ記録をサポートしています。 。
proguard で -assumenosideaffects を使用すると、ロギング クラスを完全に削除できます。
-assumenosideeffects public class logger.Logger {*;}
前処理する必要はありません。
Symbian 自体によって変更された Sun 仮想マシンを備えた Series60 および UIQ 電話機には、標準出力リダイレクトがあります。
System.out をキャプチャできるだけでなく、Throwable.printStackTrace() も機能します。
初期のハンドセットでは、標準ライブラリ サーバー プロセスにフックする C++ アプリケーションを作成する必要があります。Symbian は、VM の標準出力をコンソールまたはファイルにキャプチャできるリダイレクター アプリケーションを作成しました。
新しいハンドセットでは、「redirect://」GCF プロトコルが導入され、VM の標準出力を Java byte[] または String オブジェクトに読み込むことができ (これは別の MIDlet で行う必要があります)、リダイレクタ アプリケーションは次のように書き直されました。ジャワ。
Series60 3rd Edition Feature Pack 2 ハンドセット (以降) で使用されている最新の J9 VM では、代わりに「redirect://test」を試行する必要がある場合があります。
私はバイトコード オプティマイザーを作成しました。クラス ファイルの形式により、クラス名と関数の UTF エンコーディングを指定できるため、MyClass.someFunc() でログを出力できます (型を取得したい場合は署名を処理できます) ) これにより、C スタイルのデバッグのようなことを行うことができます。 ライン & ファイル マクロ。
ロガー クラスの条件付きコンパイルを使用しても、ログ ステートメントを完全に削除するという問題は解決されません。これは、単純な文字列以上のログをログに記録することがよくあるためです。変数値を検索し、それらを文字列に組み立てます。例:WhateverLog.log( "ロード済み " + someclass.size() + " foos" )。
WhateverLog.log の本文のみを省略した場合 (承認された解決策に示されているように)、文字列の連結 (したがって StringBuffer の作成) を含む多くの不要なコードがそのまま残ります。そのため、proguard (前述) のようなバイト コード後処理ツールを使用することをお勧めします。Proguard の -assumenosideEffects を使用すると、オプティマイザはロギング ステートメントだけでなく、結果がロギング呼び出しでのみ使用されるすべてのコードも削除できるようになります。
J2ME の LWUIT フレームワークは、内部にステートメントのログを記録できるロギング フォームを提供します。例外が発生すると思われるすべての場所にログを追加できます。
例 :Log.getInstance().showLog();上記の行を追加すると、J2ME デバイスのロギングを追跡できるようになります。