8

最近行ったアプリのコードに、Log.iLog.dLog.eがたくさんあります。このアプリを公開しようとしています。電話をadbに接続したときに、他の人に見られたくないのですが、自分でデバッグするためにアプリを公開したいと思います。

android.util.logを拡張し、そこにブールスイッチを入れたいと思っていたので、公開時にログをオフにし、開発時にオンにすることができましたが、このクラスは最終的なものですが、トリックがありませんか?

コードをすべて削除したくはありません。最悪の場合は、//Logに対してctrl+ hグローバル置換Logを実行できますが、それは答えとしてはうまくいきません。

また、Log.dは実行時に削除されますが、実行されている(パフォーマンスが少し低下している)ため、実行しないと追加のボーナスになります。

ええ、基本的に私はプログラムでデバッグのオンとオフを切り替える方法を探しています。これにより、後でデバッグを表示したり、手伝って送信したりする場合に、デバッグを好みにすることができます。

あなたたちはこれのために何を実装しますか?

ありがとう

4

3 に答える 3

16

Octavianが指摘しているように、ロギング定数を挿入することがこれを行うための最良の方法です。デバッグが有効になっている場合に元のロギングメソッドを呼び出すこのための新しいクラスを作成することはお勧めできません。

いい練習:

if (C.D) { Log.d(C.T, "your log text here " + foo + bar); }

悪い習慣:

YourLog.d("your log text here " + foo + bar);

// and in YourLog.java's d() method:
... { if (debugging) Log.d(tag, text); }

クラスCの定数Dが偽の場合、最初の解は非常に高速です。ロギング文字列を作成するための複雑な文字列操作がある場合、デバッグが非アクティブ化されていると、それらは実行されません。Dがfalseの場合、コンパイラはコンパイル時にこれらの操作を削除することもできます。これにより、実行時のオーバーヘッドがゼロになる可能性があります。2番目の(悪い)ソリューションは、常に文字列全体を構築し、メソッドを呼び出します。これは、必要のないオーバーヘッドです。

一般に、最初の解決策が最適です。そして、はい、私は実際にクラスとメンバーをC、D、T(定数/デバッグ/タグ)と呼んでいます-入力中のパフォーマンス上の理由から。;-)

于 2010-11-16T22:58:49.433 に答える
2

Proguardを使用して難読化するproguardには、proguard構成ファイルを作成するときに、Proguardを除外するために使用するコマンドがあります。

于 2010-11-16T22:27:47.313 に答える
2

それらは処理する必要があり、不要なバッテリーの消耗につながるため、一般に、配布コードにそれらを含めないことをお勧めします。

アプリケーションのどこかにブール値を設定して、コードの開発バージョンまたはリリースバージョンを示し、フラグをチェックしてログコードを実行するかどうかに関係なく、多くのifブロックを設定できますが、これはコードの膨張につながります。

それらが不要になったら、それらを取り除く必要があります。

于 2010-11-16T22:29:11.887 に答える