web-dev-qa-db-ja.com

リリースでLogCat出力を完全に無効にするAndroid app?

my ownアプリを市場にリリースする前にアプリのLogCat出力を停止するのは簡単です。また、デバッグの利便性のために、タグやIDでLogCatメッセージを選択的にフィルタリングする方法も知っています。

しかし今、私はもっと難しいかもしれないものに興味があります(おそらく不可能ですか?):特にTtsService、GoogleLoginServiceなどのサードパーティサービスからのものを含むすべてのLogCat出力を無効にします.

これは可能ですか?

さらに明確にするために:私はnot自分のためにメッセージをフィルタリングすることに興味があります。 Androidマーケットからアプリをダウンロードした人に対してサードパーティのメッセージを無効にすることに興味があります。これは可能ですか?

50
Android Eve

ProGuard を使用して、ProGuardに問題がないと想定するように指示することにより、戻り値が使用されていない行を完全に削除できます。

次のproguard.cfgチャンクは、Log.d、Log.v、およびLog.i呼び出しを削除するよう指示します。

-assumenosideeffects class Android.util.Log {
    public static *** d(...);
    public static *** w(...);
    public static *** v(...);
    public static *** i(...);
}

最終的な結果は、これらのログ行がリリースapkにないため、logcatを持つユーザーにはd/v/iログが表示されないことです。

185

プロガードを使用しない場合は、ログを自分で管理する必要があり、マニフェストファイルでダブガブルをfalseにする

<application
    Android:name="MyApplication"
    Android:icon="@drawable/gift"
    Android:label="@string/app_name" Android:debuggable="@bool/build_log">

ここに私のカスタムログクラス

public class Lol {

    public static final boolean ENABLE_LOG = true & MyApplication.sDebug;

    private static final boolean DEBUG = true & ENABLE_LOG;

    private static final boolean VERBOSE = true & ENABLE_LOG;

    private static final boolean TEMP = true & ENABLE_LOG;

    private static final boolean WARNING = true & ENABLE_LOG;

    private static final boolean INFO = true & ENABLE_LOG;

    private static final boolean ERROR = true & ENABLE_LOG;

    public static void obvious(String tag, String msg) {
        if (DEBUG) {
            msg = "*********************************\n" + msg
                    + "\n*********************************";
            Log.d(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (DEBUG)
            Log.d(tag, msg);
    }

    public static void d(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.d(tag, msg);
    }

    public static void i(String tag, String msg) {
        if (INFO)
            Log.i(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (ERROR)
            Log.e(tag, msg);
    }

    public static void e(boolean bool, String tag, String msg) {
        if (TEMP&bool)
            Log.e(tag, msg);
    }

    public static void v(String tag, String msg) {
        if (VERBOSE)
            Log.v(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (WARNING)
            Log.w(tag, msg);
    }

    public static String getStackTraceString(Exception e) {
        return Log.getStackTraceString(e);
    }

    public static void w(String tag, String msg, Exception e) {
        if (WARNING)
            Log.w(tag, msg,e);
    }
}
10
Win Myo Htet

アプリbuild.gradleファイルセット:

release {
    minifyEnabled true
     ……
}

Proguard-rules.pro put:

-assumenosideeffects class Android.util.Log {
  public static *** v(...);
  public static *** d(...);
  public static *** i(...);
  public static *** w(...);
  public static *** e(...);
}
-ignorewarnings

それは私のために働いた。

2
snehal

David Caunt によって提供される素晴らしい答えは、proguard-Android-optimize.txtで定義されたルールに対して機能しないようです。

ワイルドカード***を使用する代わりに、ProGuardの現在のバージョンは戻りパラメーターの型修飾子を期待しているようです:

-assumenosideeffects class Android.util.Log {
    public static int   d(...);
    public static int   w(...);
    public static int   v(...);
    public static int   i(...);
    public static int wtf(...);
}
1
Mapsy

組み合わせたDavid Snabel-Caunt's受け入れられた回答に加えて、デフォルトのスワップアウトProGuard設定(「proguard-Android.txt」ファイル)からAndroid「proguard-Android-optimize.txt」最適化ファイルのSDK。このファイルは、このAndroid同じルールで最適化が有効になっているSDKフォルダーでも利用可能です。

0

BuildTypesリリースではdebuggable falseを使用できます。

buildTypes {

     release {
        debuggable false
        ...
     }

}
0
heronsanches

私は通常次を行います:

if (BuildConfig.DEBUG) Log.i(TAG, msg);

ただし、多くの依存関係(ライブラリ)があり、それらが正しくない場合は、 https://stackoverflow.com/a/5553290/454852 を使用します

行を短くする:

private final static boolean DEBUG = BuildConfig.DEBUG;

if (DEBUG) Log.i(TAG, msg_1);

if (DEBUG) Log.e(TAG, msg_error_2);
0
user25