在发布Android应用程序中完全禁用LogCat输出?

And*_*Eve 50 android release logcat android-logcat google-play

在将应用程序发布到市场之前关闭我自己的应用程序的LogCat输出是很简单的.我也知道如何根据标签和/或id有选择地过滤LogCat消息,以便我自己调试.

但是现在我对一些可能更难的事情感兴趣(也许是不可能的?):禁用所有LogCat输出,包括来自第三方服务(如TtsService,GoogleLoginService等)的输出.

这可能吗?

进一步澄清:我对自己过滤消息感兴趣.对于从Android电子市场下载我的应用程序的用户,我很感兴趣禁用第三方邮件.这可能吗?

Dav*_*unt 186

通过告诉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(...);
}
Run Code Online (Sandbox Code Playgroud)

最终结果是这些日志行不在您的发行版apk中,因此任何具有logcat的用户都不会看到d/v/i日志.

  • 你需要小心这个,因为你添加了一个像Log.d这样的评论(someStrVar +"敏感信息在这里"); 敏感信息字符串仍然会进入APK中的classes.dex文件.因为在隐式使用stringbuilder时,Proguard存在优化问题 (10认同)
  • 这应该添加到答案中!正如@phnmnn所说 - 以下行应该设置为grade.build文件:proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' (4认同)
  • 不知怎的,这对我不起作用,我正在使用Gradle 2.2.1. (3认同)
  • ProGuard非常强大!您还可以使用此提示删除其他形式的开发代码,而不仅仅是日志记录. (2认同)

Win*_*tet 10

如果你不使用proguard,你必须自己管理日志,并在清单文件中make dubuggable false

<application
    android:name="MyApplication"
    android:icon="@drawable/gift"
    android:label="@string/app_name" android:debuggable="@bool/build_log">
Run Code Online (Sandbox Code Playgroud)

这是我的自定义日志类

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 自[SDK Tools 8](http://developer.android.com/sdk/tools-notes.html)以来,没有必要手动设置android:debuggable标志.这消除了发布可调试版本的风险. (8认同)
  • 只是好奇(我刚才偶然发现了这个问题),你有没有理由使用`true&ENABLE_LOG`而不只是`ENABLE_LOG`?我没有看到任何明显的功能...... (5认同)