# 目录 * [Logcat 入口配置](#logcat-入口配置) * [Logcat Activity 方向配置](#logcat-activity-方向配置) * [设置 Logcat 显示的日志颜色](#设置-logcat-显示的日志颜色) * [设置 Logcat 默认筛选条件](#设置-logcat-默认筛选条件) * [设置 Logcat 日志过滤规则](#设置-logcat-日志过滤规则) * [设置显示所有应用打印的日志](#设置显示所有应用打印的日志) * [我如果要在线上使用这个库该怎么办](#我如果要在线上使用这个库该怎么办) * [在多进程情况下无法展示入口怎么办](#在多进程情况下无法展示入口怎么办) * [相同的 TAG 日志会自动合并打印怎么关闭](#相同的-tag-日志会自动合并打印怎么关闭) #### Logcat 入口配置 * 框架默认提供了两种入口 * 通知栏入口 * 悬浮窗入口 * 入口默认的规则:在有通知栏权限的情况下,会优先使用通知栏入口,否则则会显示悬浮窗入口 * 如何修改默认的规则?可在清单文件中加入以下配置即可 ```xml ``` #### Logcat Activity 方向配置 * `LogcatActivity` 默认是跟随手机屏幕方向的,如果你需要固定竖屏方向,那么需要在你的清单文件中加入此配置: ```xml ``` #### 设置 Logcat 显示的日志颜色 * 在项目的 `values/color.xml` 中加入你喜欢的配色,例如: ```xml #FFBBBBBB #FF33B5E5 #FF99CC00 #FFFFBB33 #FFFF4444 #FFFFFFFF ``` #### 设置 Logcat 默认筛选条件 * 如果要修改框架默认筛选条件,只需在清单文件中加入以下配置即可 ```xml ``` #### 设置 Logcat 日志过滤规则 * 在项目的 `values/string.xml` 中加入你要过滤的日志 TAG,例如: ```xml ActivityThread InputMethodManager OpenGLRenderer VideoCapabilities ViewRootImpl Settings Looper TextView TypefaceUtils MultiDex AudioManager ConnectivityManager NetworkSecurityConfig HwPolicyFactory: HwWidgetFactory: HwApiCacheMangerEx HwWechatOptimizeImpl HwSplineOverScrollerExImpl HwAppInnerBoostImpl HwCustConnectivityManagerImpl HwApsImpl HwPhoneWindow HwAutofillHelper hwbr_engine_mainprocess hwbr_engine_hwbr_event hwbr_engine_PathUtils hwbr_engine_AwContents hwbr_engine_cr_IMM hwbr_engine_LibraryLoader hwbr_engine_BrowserStartup hwbr_engine_cr_WebContentsImpl CrashReport CrashReportInfo CrashReport-Native LeakCanary Timeline AssistStructure EgretLoader OverScrollerOptimization HiTouch_PressGestureDetector HiTouch_HiTouchSensor FLTAG_SFM FLTAG_FM libEGL AwareLog AwareBitmapCacher AwareAppScheduleManager FeatureFactory WebViewFactory ConfigStore mali_winsys ZrHung.AppEyeUiProbe chatty stylus libc chromium Perf FeatureParser Binder:intercep cr_LibraryLoader cr_BrowserStartup DecorView DecorView[] ForceDarkHelper skia AdrenoGLES-0 ViewContentFactory MiuiFrameworkFactory MIUIInput cr_media cr_CachingUmaRecorder TetheringManager MiuiFreeDragHelper MiuiFreeDragImpl ContentProviderMonitor ContentCatcher ApplicationLoaders RenderInspector ``` #### 设置显示所有应用打印的日志 * 首先有一点,App 本身是无法获取其他 App 日志的 * 如果你有这个需要,也不是不能实现,在电脑端输入以下 adb 命令 ```text // 给指定的应用授予读取 Log 的权限,com.hjq.logcat.demo 需要改成你的包名 adb shell pm grant com.hjq.logcat.demo android.permission.READ_LOGS ``` * 重启应用即可生效(有的手机会自动杀死进程),授权过后除非应用被卸载,否则不会消失 * 如果执行上面的命令失败了,并且提示以下信息 ```text Exception occurred while executing 'grant': java.lang.SecurityException: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS. ``` * 则需要前往开发者选项中开启 `USB 调试(安全设置)` 的设置选项 ![](picture/zh/usb_debugging_security_setting.jpg) * 开启之后,如果还是一样的提示,证明没有生效,可以尝试以下操作 * 等待 5 分钟 * 重新拔插一下手机 * 检查 `USB 安装` 选项有没有开启 * 重新打开 `USB 调试(安全)`选项 * 重启一下 cmd 命令行终端 * 重启一下手机再试 * 换一台手机再试 * 作者建议如果没有这个需求,则不需要开启此项功能,因为这样会导致 Logcat 显示的日志变多,会增加日志的复杂度和查找的难度 #### 我如果要在线上使用这个库该怎么办 * 首先我是十分不推荐在线上使用这个库,因为这个库的定位是为了方便调试使用,我也不敢保证这个库在线上使用会有什么问题,当然你如果要一定这样做,也不是没有办法,具体步骤如下: * 第一步:将依赖方式从 `debugImplementation` 修改成 `implementation` ```groovy dependencies { debugImplementation 'com.github.getActivity:Logcat:x.x' } ``` ```groovy dependencies { implementation 'com.github.getActivity:Logcat:x.x' } ``` * 第二步:隐藏 Logcat 入口展示 ```xml ``` * 第三步:在合适的时机调起 Logcat ```java try { Class clazz = Class.forName("com.hjq.logcat.LogcatActivity"); startActivity(new Intent(this, clazz)); } catch (ClassNotFoundException e) { e.printStackTrace(); } ``` #### 在多进程情况下无法展示入口怎么办 * 这个问题其实之前就有人提出过 [Logcat/issues/35](https://github.com/getActivity/Logcat/issues/35),但是经过核实是无法修复的,这是因为在开启子进程的情况下,会二次创建 Application 对象,然后重新走一遍 onCreate 方法,但是 ContentProvider 组件就不一样了,并不会重复创建,这就导致一个问题,Logcat 这个框架本身就依赖 ContentProvider 作为框架的初始化入口,但是它在子进程并不会被系统二次创建,更别说调用了,这个属于硬伤。 * 当然不代表这就没有解决手段,你可以手动初始化 Logcat 框架来解决这一问题,具体方式如下: * 第一步:先在清单文件中去除 Logcat 框架初始化入口 ```xml ``` * 第二步:在 Application.onCreate 方法中手动初始化 Logcat 框架 ```java public final class XxxApplication extends Application { @Override public void onCreate() { super.onCreate(); try { Class logcatProviderClass = Class.forName("com.hjq.logcat.LogcatProvider"); Object logcatProvider = logcatProviderClass.newInstance(); Method attachInfoMethod = logcatProviderClass.getMethod("attachInfo", Context.class, ProviderInfo.class); attachInfoMethod.setAccessible(true); attachInfoMethod.invoke(logcatProvider, this, null); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 相同的 TAG 日志会自动合并打印怎么关闭 * 当发现有两个及以上相同的 TAG 的日志,且过程中没有插入新 TAG 的日志,为了日志显示的美观,框架会自动进行合并打印,你如果不需要该功能,在清单文件中加入以下配置即可: ```xml ```