0

次のコードでproguardを実行すると、Loggingステートメントが削除されます。

Log.d(TAG, "field= "+field+“ : enhancedfield=”+enhancedfield);

しかし...コンパイル後、これが表示されます:

Log.d(TAG, new StringBuilder().append("Field= ").append(field)
     .append(“ : enhancedfield=”).append(enhancedfield).toString());

これでプロガードを実行すると、残り物が発生します。

new StringBuilder().append("Field= ").append(field)
    .append(“ : enhancedfield=”).append(enhancedfield).toString();

これは潜在的なハッカーに情報を漏らします...

何ができますか:aを宣言しfinal static boolean、値が。の場合にのみログに記録しますtrue。この値はコンパイル時に決定できるため、値がfalseの場合、ロギングコードは含まれません。しかし、それは私のコードを汚すので、私はそれにそれほど満足していません。

今私の質問:どうすればこの動作を改善できますか?残り物を減らし、情報の漏洩を減らしますか?

4

3 に答える 3

2

ステートメントを強制的に分離することにより、コンパイラがStringbuilderを使用しないようにすることができます。

Log.d(TAG, "field:");
Log.d(TAG, field);
Log.d(TAG, "enhancedfield:");
Log.d(TAG, enhancedfield);

もちろん、これはログの結果に影響を与え(1行ではなく4行)、コードはあまり保守できません。

于 2012-12-10T14:44:44.213 に答える
1

これは、 ProGuardの最適化中に未使用の文字列を削除するという質問の複製です。StringBuilder呼び出しを回避するために、独自のロギングメソッドを定義できます。

于 2012-12-11T16:33:12.090 に答える
0

ログ文字列は常に難読化の問題です。難読化することはできません。別のクラスに移動することしかできず、あまり役に立ちません。

その文字列の暗号化はより安全になります。私たちの実践では、ノウハウの中心である非常に特別なアルゴリズムでは、あまり気にしません。これらのメソッドがエラーなしで機能することがわかったら、ロギングをまったく削除できます。

static final boolean isDebug を使用すると、ロギングを有効にできなくなり、再構築してデバッグ バージョンをインストールする必要があるという欠点があります。

static final dbg = false で解決策を実行します
:

if (dbg) Log.d("unwanted debug log");

本当にあなたのコードを汚染しますか?

于 2012-12-10T13:28:25.123 に答える