1. ホーム
  2. android

[解決済み] Androidアプリのリリース版をビルドする前に、すべてのデバッグログ呼び出しを削除するにはどうすればよいですか?

2022-03-23 18:10:16

質問

Googleによると、私は"しなければなりません。 ソースコード内のLogメソッドの呼び出しをすべて無効化する。 AndroidアプリをGoogle Playに公開する前に、" を実行してください。のセクション3より抜粋 出版チェックリスト :

リリース用にアプリケーションをビルドする前に、ロギングを無効にして、デバッグオプションを無効にしていることを確認してください。ソースファイル内のLogメソッドの呼び出しを削除することで、ロギングを無効にすることができます。

私のオープンソースプロジェクトは規模が大きく、リリースのたびに手作業で行うのは面倒です。さらに、Logの行を削除することなどは、潜在的に厄介なことです。

if(condition)
  Log.d(LOG_TAG, "Something");
data.load();
data.show();

Logの行をコメントすると、その次の行に条件が適用され、load()が呼ばれない可能性があります。このような状況は、存在すべきではないと判断できるほど稀なことなのでしょうか?

では、ソースコードレベルでもっと良い方法はないのでしょうか?あるいは、効率的に、しかし安全にすべてのログ行を削除するための巧妙なProGuard構文があるのでしょうか?

解決方法は?

私は、はるかに簡単な解決策は、すべての if のチェックがあちこちにあり、単に プロガード を除去するために、すべての Log.d() または Log.v() メソッドを呼び出すと、Antの release ターゲットになります。

こうすることで、通常のビルドでは常にデバッグ情報が出力され、リリースビルドではコードを変更する必要がありません。 また、ProGuardはバイトコードに対して複数のパスを行い、その他の不要なステートメントや空のブロックを削除し、適切な場合には短いメソッドを自動的にインライン化することができます。

例えば、以下はAndroid向けの非常に基本的なProGuardの設定です。

-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5

-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

そこで、それをファイルに保存し、Antから、コンパイルしたばかりのJARと、使用しているAndroidプラットフォームのJARを渡して、ProGuardを呼び出すことになります。

参照 サンプル ProGuardのマニュアルに記載されています。


アップデート(4.5年後)。 現在では、私は 木材 をAndroidのロギングに使用しました。

デフォルトの Log log タグは自動的に設定され、フォーマットされた文字列や例外を簡単に記録することができます。

この例では、アプリのデバッグビルドにおいてのみ、ロギングステートメントがlogcatに書き込まれます。

ティンバーは、私の Application onCreate() メソッドを使用します。

if (BuildConfig.DEBUG) {
  Timber.plant(new Timber.DebugTree());
}

そして、私のコード内の他のどこでも、簡単にログを取ることができます。

Timber.d("Downloading URL: %s", url);
try {
  // ...
} catch (IOException ioe) {
  Timber.e(ioe, "Bad things happened!");
}

をご覧ください。 Timberサンプルアプリ では、開発時にはすべてのログステートメントがlogcatに送られ、本番ではデバッグステートメントはログに残りませんが、エラーは静かにCrashlyticsに報告されます。