Android隐藏日志的最佳方法是啥? [复制]

Posted

技术标签:

【中文标题】Android隐藏日志的最佳方法是啥? [复制]【英文标题】:Android what's the best way to hide logs? [duplicate]Android隐藏日志的最佳方法是什么? [复制] 【发布时间】:2015-08-05 06:48:15 【问题描述】:

所以.. 我正在使用 Log.d("", "");在我的应用程序的许多地方进行调试。 但我不希望这些日志出现在商店中。

现在为了将它们隐藏在商店版本中,我创建了一个 Constant.class 并在其中放置了一个名为 debugMode 的布尔值,并将我拥有的每个日志包装在这样的 if 语句中:

if (Constant.debugMode) 
Log.d(TAG, "check123");

然后当我构建一个谷歌商店 apk 时,我将该布尔值更改为 true 而不是 false。

在我看来这有点笨拙,有没有更有效的方法来做到这一点?

【问题讨论】:

【参考方案1】:

创建一个简单的记录器类,它具有公共静态方法和一个开关,以便仅为应用程序的调试版本启用日志。这是一个示例代码。

public class Logger 

    public static final boolean D = BuildConfig.DEBUG;

    public static void LogInfo(String TAG, String msg) 
        if (D) 
            Log.i(TAG, msg);
        
    

    public static void LogWarrning(String TAG, String msg) 
        if (D) 
            Log.w(TAG, msg);
        
    

    public static void LogDebug(String TAG, String msg) 
        if (D) 
            Log.d(TAG, msg);
        
    

    public static void LogError(String TAG, String msg) 
        if (D) 
            Log.e(TAG, msg);
        
    

用法

Logger.LogDebug("Test", "Example");

这样,您可以将 if 子句保存在一个地方,而不必担心它们。而且我不认为这样笨拙。

【讨论】:

【参考方案2】:

我发现一个更简单的解决方案是忘记所有的 if 检查 这个地方,只需使用 ProGuard 去除任何 Log.d() 或 Log.v() 当我们调用 Ant 发布目标时调用方法。

这样,我们总是可以定期输出调试信息 构建并且不必为发布构建进行任何代码更改。 ProGuard 还可以对字节码进行多次传递以删除其他 不需要的语句,空块并且可以自动内联short 适当的方法。

例如,这是一个非常基本的 android ProGuard 配置:

-dontskipnonpubliclibraryclasses -不要混淆 -强制处理 -优化通过 5

-keep class * 扩展 android.app.Activity -assumenosideeffects 类 android.util.Log 公共静态 * d(...); 公共静态 * v(...);所以你可以把它保存到一个文件中,然后从 Ant 调用 ProGuard,传入你刚刚编译的 JAR 和 您正在使用的 Android 平台 JAR。

@REF:Remove all debug logging calls before publishing: are there tools to do this?

【讨论】:

以上是关于Android隐藏日志的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

android中检查互联网是不是持续活动的最佳方法是啥(当互联网不活动时)? [复制]

在android中存储图像的最佳方式是啥? [复制]

检查属性是不是存在的最佳方法是啥? [复制]

Javascript:将数组转换为对象的最佳方法是啥? [复制]

检查变量是不是为列表的最佳方法是啥? [复制]

在 TabNavigator 中隐藏选项卡的最佳方法是啥?