# 目录
* [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 调试(安全设置)` 的设置选项

* 开启之后,如果还是一样的提示,证明没有生效,可以尝试以下操作
* 等待 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
```