55

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

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

これは可能ですか?

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

4

8 に答える 8

196

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ログが表示されません。

于 2011-04-05T14:14:05.470 に答える
9

proguard を使用しない場合は、ログを自分で管理し、マニフェスト ファイルで dubuggable を 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);
    }
}
于 2012-03-16T21:17:08.607 に答える
0

buildTypes リリースに debuggable falseを置くことができます。

buildTypes {

     release {
        debuggable false
        ...
     }

}
于 2017-09-25T18:58:20.997 に答える
0

「proguard-android-optimize.txt」最適化ファイルのAndroid SDKからデフォルトのProGuard設定(「proguard-android.txt」ファイル)を交換することに加えて、 David Snabel-Cauntの受け入れられた回答を組み合わせました。このファイルは、この Android SDK フォルダーでも利用できます。ルールは同じですが、最適化が有効になっています。

于 2019-02-23T23:26:28.687 に答える
0

すべてのクラスのメソッドを列挙する代わりに、単に<methods>短縮形を使用することもできるようです:

-assumenosideeffects class a.b.c.DebugLogs {
    <methods>;
}

com.android.tools.build:gradleversionで私のために働いた4.0.0

于 2020-07-07T16:08:00.733 に答える