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

在发布的Android应用程序中完全禁用LogCat输出?,android,release,google-play,logcat,android-logcat,Android,Release,Google Play,Logcat,Android Logcat,在向市场发布应用程序之前关闭我自己的应用程序的LogCat输出是很简单的。我还知道如何根据标记和/或id选择性地过滤LogCat消息,以方便调试 但现在我感兴趣的事情可能要困难得多(也许不可能?):禁用所有LogCat输出,包括&特别是来自第三方服务的输出,如TtsService、GoogleLoginService等 这可能吗 进一步澄清:我对自己过滤信息不感兴趣。我对从Android Market下载我的应用程序的人禁用第三方消息很感兴趣。这是可能的吗?您可以通过告诉ProGuard假设不会

在向市场发布应用程序之前关闭我自己的应用程序的LogCat输出是很简单的。我还知道如何根据标记和/或id选择性地过滤LogCat消息,以方便调试

但现在我感兴趣的事情可能要困难得多(也许不可能?):禁用所有LogCat输出,包括&特别是来自第三方服务的输出,如TtsService、GoogleLoginService等

这可能吗

进一步澄清:我对自己过滤信息不感兴趣。我对从Android Market下载我的应用程序的人禁用第三方消息很感兴趣。这是可能的吗?

您可以通过告诉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日志。

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

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

提供的最佳答案似乎不适用于
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(...);
}

您可以在buildTypes发行版上设置可调试false

buildTypes {

     release {
        debuggable false
        ...
     }

}

应用内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
这对我很管用。

我通常下一步做:

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

虽然如果你有很多依赖项(库),它们写得不好,那就用吧

缩短行数:

private final static boolean DEBUG = BuildConfig.DEBUG;

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

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

除了将android SDK中的默认设置(“ProGuard android.txt”文件)替换为“ProGuard android optimize.txt”优化文件之外,我还结合了David Snabel Caunt接受的答案。该文件也可在此Android SDK文件夹中使用相同的规则,但已启用优化

除了列举所有类的方法,您还可以简单地使用
速记:

-assumenosideeffects class a.b.c.DebugLogs {
    <methods>;
}
-假设影响类别a.b.c.DebugLogs{
;
}

为我工作的
com.android.tools.build:gradle
version
4.0.0

,所以你想阻止用户设备上的任何应用程序写入LogCat输出?你是指你从应用程序中包含(或使用)的那些第三方库的日志消息吗?@eldarethis No,我想阻止我的应用程序直接或间接使用的任何应用程序写入LogCat输出。抱歉说得不够清楚。@Rajath DSouza是的,这正是我的意思。当其他应用程序独立运行或被其他应用程序使用时,我不在乎它们会显示什么。我只关心他们在响应我的应用程序的请求/调用时输出内容。好吧,这更有意义……这个技巧真是难以置信。它已经应该得到+1。在确保我的应用程序确实产生了预期的结果后,我将接受答案。非常感谢。ProGuard真的很强大!您还可以使用此技巧删除其他形式的开发代码,而不仅仅是日志记录。启用开发人员功能的代码,比如其他菜单选项。日志记录是我能想到的唯一应该删除的常见内容。您需要小心,因为您添加了类似Log.d(someStrVar+“此处敏感信息”)的注释;敏感信息字符串仍将进入APK中的classes.dex文件。由于Proguard在隐式使用stringbuilder时存在优化问题,因此应将其添加到答案中!正如@phnmnn所说的,应该将以下行设置为grade.build文件:proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard rules.pro',因为不需要手动设置android:debugable标志。这消除了发布可调试版本的风险。只是好奇(我刚才偶然发现了这个问题),您有什么理由使用
true&ENABLE_LOG
而不是仅使用
ENABLE_LOG
?在功能方面,我看不出有什么不同……您仍然在尝试调用函数和发送参数,不认为这是一个好主意,最好使用
if(BuildConfig.DEBUG)Log.I(TAG,msg)
-assumenosideeffects class a.b.c.DebugLogs {
    <methods>;
}