从logcat中删除onFlyCompress消息

19

我正在使用YuvImageandroid.hardware.Camera的视频流压缩为jpeg。自从那时起,我在logcat中一直看到skia onFlyCompress消息,这完全污染了它。有没有办法禁用这个消息?我知道我可以过滤logcat输出,但这意味着需要在任何地方始终执行,这不是解决方法,而只是一种解决方法。我根本不希望打印出这些消息。


1
这会影响您应用程序的发布版本吗?Skia在这些消息中使用DEBUG优先级,它们只应出现在调试版本中。 - Константин Осипов
你是否尝试过重新启动设备并进行调试? - krishank Tripathi
1
这可能会对你有所帮助:https://dev59.com/8XDXa4cB1Zd3GeqP-UWA - krishank Tripathi
你看过这个问题吗? - azizbekian
@shakram02 你接受在已经root的设备上运行吗? - KYHSGeekCode
我实际上想修复它,而不仅仅是删除日志消息。我压缩YuvImages,这就是导致该消息的原因。我不知道XPosed,感谢您的努力! - shakram02
2个回答

1

简短回答

尝试使用方法挂钩来实现您的目标。

您可以使用XPosed FrameworkROOTed设备上挂钩android.util.log方法。

详细方法

  1. 使用XPosed框架挂钩android.util.Log的方法。
  2. 在挂钩方法中,检查消息是否包含skia onFlyCompress
  3. 如果是,则调用setResult(null);以防止打印出日志消息。

虽然这些方法只能在ROOTed设备上使用,但我希望我的回答能帮助至少一些可以使用ROOTed设备的用户。

(嗯,因为没有客户需要阻止日志消息,所以您只需要ROOT 您的本地设备并安装使用XPosed框架的自动过滤应用程序即可。)

为了阻止一个方法执行其余代码的示例,请参见:此答案(尤其是最后一段)包含一些使用Xposed框架的示例。正如您所看到的,这些代码非常简短(不超过40行)。
如果需要或者潜在地有用,我将实现一些代码。 示例代码片段
由于某人投票支持我的建议,我认为有人喜欢我的建议,因此我发布了一些代码。
import android.util.*;
import de.robv.android.xposed.*;
import de.robv.android.xposed.callbacks.XC_LoadPackage.*;

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;

public class LogFilterApp implements IXposedHookLoadPackage
{

    private String TAG="LogFilter";
     public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable
{
    XposedBridge.log("Package name: " + lpparam.packageName);

            try
            {
                    findAndHookMethod("android.util.Log", lpparam.classLoader, "i", String.class, String.class, new XC_MethodHook()
                    {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable
                        {
                            //do something before
                            if(((String)(param.args[1])).indexOf("skia onFlyCompress")>=0)
                                                          { 
                                                          param.setResult(null);
                                                           }
                        }
                    });
            }
            catch (XposedHelpers.ClassNotFoundError e)
            {
                XposedBridge.log("ClassNotFoundError");
            }
            catch (NoSuchMethodError e)
            {
                XposedBridge.log("NoSuchMethodError");
            }
        }
     }
   }
}

代码参考:这个XDA主题

安装XPosed框架

XPosed开发者教程


开头与Windows相关的部分有点误导性,我建议删除它,因为它会让读者注意力从Xposed的想法上分散开来,而这个想法相当不错。特别是因为这个问题只与使用的调试设备有关。 - Robert
@Robert 你说得没错。感谢你的推荐。 - KYHSGeekCode
@Robert 已经应用了您的建议。 - KYHSGeekCode

1
你可以尝试子类化打印日志的YuvImage类并覆盖打印日志的方法,只需复制该方法的所有代码,但不包括Log.d()Log.v()Log.w()等打印日志的代码,将其粘贴到被覆盖的方法中即可。(我不确定是否可行)
另请参考以下答案: 如何在Android中启用/禁用日志级别?

2
android.util.Log 是一个 final 类,无法被覆盖。不过,调用的方法是静态的,因此覆盖也没有帮助。 - Robert
@Robert,没必要覆盖android.util.Log或其方法。但是,如果YuvImage的调用方法是静态的,则可以将代码复制到您的类中并根据需要更改它们。您需要以这种方式拥有源代码。 - ygngy
对不起,我误解了你的回答。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接