-
框架默认提供了两种入口
-
通知栏入口
-
悬浮窗入口
-
-
入口默认的规则:在有通知栏权限的情况下,会优先使用通知栏入口,否则则会显示悬浮窗入口
-
如何修改默认的规则?可在清单文件中加入以下配置即可
<manifest>
<application>
<!-- 悬浮窗入口 -->
<meta-data
android:name="LogcatWindowEntrance"
android:value="false" />
<!-- 通知栏入口 -->
<meta-data
android:name="LogcatNotifyEntrance"
android:value="true" />
</application>
</manifest>
LogcatActivity
默认是跟随手机屏幕方向的,如果你需要固定竖屏方向,那么需要在你的清单文件中加入此配置:
<activity
android:name="com.hjq.logcat.LogcatActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleInstance"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
tools:node="replace" />
- 在项目的
values/color.xml
中加入你喜欢的配色,例如:
<color name="logcat_level_verbose_color">#FFBBBBBB</color>
<color name="logcat_level_debug_color">#FF33B5E5</color>
<color name="logcat_level_info_color">#FF99CC00</color>
<color name="logcat_level_warn_color">#FFFFBB33</color>
<color name="logcat_level_error_color">#FFFF4444</color>
<color name="logcat_level_other_color">#FFFFFFFF</color>
- 如果要修改框架默认筛选条件,只需在清单文件中加入以下配置即可
<manifest>
<application>
<!-- 默认搜索关键字 -->
<meta-data
android:name="LogcatDefaultSearchKey"
android:value="MainActivity" />
<!-- 默认日志等级 -->
<meta-data
android:name="LogcatDefaultLogLevel"
android:value="E" />
</application>
</manifest>
- 在项目的
values/string.xml
中加入你要过滤的日志 TAG,例如:
<string-array name="logcat_filter_list" tools:ignore="ExtraTranslation">
<item>ActivityThread</item>
<item>InputMethodManager</item>
<item>OpenGLRenderer</item>
<item>VideoCapabilities</item>
<item>ViewRootImpl</item>
<item>Settings</item>
<item>Looper</item>
<item>TextView</item>
<item>TypefaceUtils</item>
<item>MultiDex</item>
<item>AudioManager</item>
<item>ConnectivityManager</item>
<item>NetworkSecurityConfig</item>
<item>HwPolicyFactory:</item>
<item>HwWidgetFactory:</item>
<item>HwApiCacheMangerEx</item>
<item>HwWechatOptimizeImpl</item>
<item>HwSplineOverScrollerExImpl</item>
<item>HwAppInnerBoostImpl</item>
<item>HwCustConnectivityManagerImpl</item>
<item>HwApsImpl</item>
<item>HwPhoneWindow</item>
<item>HwAutofillHelper</item>
<item>hwbr_engine_mainprocess</item>
<item>hwbr_engine_hwbr_event</item>
<item>hwbr_engine_PathUtils</item>
<item>hwbr_engine_AwContents</item>
<item>hwbr_engine_cr_IMM</item>
<item>hwbr_engine_LibraryLoader</item>
<item>hwbr_engine_BrowserStartup</item>
<item>hwbr_engine_cr_WebContentsImpl</item>
<item>CrashReport</item>
<item>CrashReportInfo</item>
<item>CrashReport-Native</item>
<item>LeakCanary</item>
<item>Timeline</item>
<item>AssistStructure</item>
<item>EgretLoader</item>
<item>OverScrollerOptimization</item>
<item>HiTouch_PressGestureDetector</item>
<item>HiTouch_HiTouchSensor</item>
<item>FLTAG_SFM</item>
<item>FLTAG_FM</item>
<item>libEGL</item>
<item>AwareLog</item>
<item>AwareBitmapCacher</item>
<item>AwareAppScheduleManager</item>
<item>FeatureFactory</item>
<item>WebViewFactory</item>
<item>ConfigStore</item>
<item>mali_winsys</item>
<item>ZrHung.AppEyeUiProbe</item>
<item>chatty</item>
<item>stylus</item>
<item>libc</item>
<item>chromium</item>
<item>Perf</item>
<item>FeatureParser</item>
<item>Binder:intercep</item>
<item>cr_LibraryLoader</item>
<item>cr_BrowserStartup</item>
<item>DecorView</item>
<item>DecorView[]</item>
<item>ForceDarkHelper</item>
<item>skia</item>
<item>AdrenoGLES-0</item>
<item>ViewContentFactory</item>
<item>MiuiFrameworkFactory</item>
<item>MIUIInput</item>
<item>cr_media</item>
<item>cr_CachingUmaRecorder</item>
<item>TetheringManager</item>
<item>MiuiFreeDragHelper</item>
<item>MiuiFreeDragImpl</item>
<item>ContentProviderMonitor</item>
<item>ContentCatcher</item>
<item>ApplicationLoaders</item>
<item>RenderInspector</item>
</string-array>
-
首先有一点,App 本身是无法获取其他 App 日志的
-
如果你有这个需要,也不是不能实现,在电脑端输入以下 adb 命令
// 给指定的应用授予读取 Log 的权限,com.hjq.logcat.demo 需要改成你的包名
adb shell pm grant com.hjq.logcat.demo android.permission.READ_LOGS
-
重启应用即可生效(有的手机会自动杀死进程),授权过后除非应用被卸载,否则不会消失
-
如果执行上面的命令失败了,并且提示以下信息
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
dependencies {
debugImplementation 'com.github.getActivity:Logcat:x.x'
}
dependencies {
implementation 'com.github.getActivity:Logcat:x.x'
}
- 第二步:隐藏 Logcat 入口展示
<manifest>
<application>
<!-- 悬浮窗入口 -->
<meta-data
android:name="LogcatWindowEntrance"
android:value="false" />
<!-- 通知栏入口 -->
<meta-data
android:name="LogcatNotifyEntrance"
android:value="false" />
</application>
</manifest>
- 第三步:在合适的时机调起 Logcat
try {
Class<?> clazz = Class.forName("com.hjq.logcat.LogcatActivity");
startActivity(new Intent(this, clazz));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
-
这个问题其实之前就有人提出过 Logcat/issues/35,但是经过核实是无法修复的,这是因为在开启子进程的情况下,会二次创建 Application 对象,然后重新走一遍 onCreate 方法,但是 ContentProvider 组件就不一样了,并不会重复创建,这就导致一个问题,Logcat 这个框架本身就依赖 ContentProvider 作为框架的初始化入口,但是它在子进程并不会被系统二次创建,更别说调用了,这个属于硬伤。
-
当然不代表这就没有解决手段,你可以手动初始化 Logcat 框架来解决这一问题,具体方式如下:
-
第一步:先在清单文件中去除 Logcat 框架初始化入口
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.xxx.xxx">
<application>
<provider
android:name="com.hjq.logcat.LogcatProvider"
tools:node="remove" />
</application>
</manifest>
- 第二步:在 Application.onCreate 方法中手动初始化 Logcat 框架
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();
}
}
}