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

问题描述 投票:52回答:8

我自己的应用程序的LogCat输出关闭,然后再将其发布到市场上很简单。我也知道如何为我自己的调试方便性按标签和/或ID选择性过滤LogCat消息。

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

这可能吗?

进一步说明:我不是有兴趣自行过滤邮件。无论是谁从Android电子市场下载我的应用,我都想禁用第三方消息。这可能吗?

android release google-play logcat android-logcat
8个回答
187
投票

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


10
投票

如果不使用proguard,则必须自己管理日志,并在清单文件中将其设置为dubugable 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);
    }
}

2
投票

在应用程序build.gradle文件中:

release {
    minifyEnabled true
     ……
}

在proguard-rules.pro中:

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

对我有用。


1
投票

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(...);
}

0
投票

您可以在buildTypes版本上放入debuggable false

buildTypes {

     release {
        debuggable false
        ...
     }

}

0
投票

我通常接下来做:

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

尽管如果您有很多依赖项(库)并且它们写得不好,那么请使用https://stackoverflow.com/a/5553290/4548520

缩短行数:

private final static boolean DEBUG = BuildConfig.DEBUG;

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

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

0
投票

我合并了David Snabel-Caunt's接受的答案,除了将Android SDK中的默认ProGuard设置(“ proguard-android.txt”文件)换成“ proguard-android-optimize”。 txt”优化文件。该文件在此Android SDK文件夹中也可用,具有相同的规则,但启用了优化。


0
投票
  implementation 'androidx.webkit:webkit:1.2.0'

   <"meta-data android:name="android.webkit.WebView.EnableSafeBrowsing">
            android:value="true" />

    buildTypes {
        debug {
            debuggable false
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }
        release {
            debuggable false
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }


-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
    public static int wtf(...);
}

mWebView.loadUrl(url);
CookieManager.getInstance().setAcceptCookie(false);
WebViewDatabase.getInstance(this).clearFormData();
mWebView.getSettings().setAppCacheEnabled(false);
mWebView.getSettings().setSavePassword(false);
mWebView.getSettings().setSaveFormData(false);
mWebView.clearCache(true);
mWebView.clearFormData();
mWebView.clearHistory();

mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setLoadWithOverviewMode(false);
mWebView.getSettings().setUseWideViewPort(false);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportZoom(false);
mWebView.getSettings().setPluginState(WebSettings.PluginState.OFF);

PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(getActContext());
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);
© www.soinside.com 2019 - 2024. All rights reserved.