您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android logcat日志封装

时间:2021-12-22 09:32:03  来源:  作者:YuCoding

Android logcat日志封装

logcat痛点

在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多人混合开发的场景下,不过滤很难找到自己打的log,调试别人代码时看不懂他人输出的log。这些问题会影响到整个开发效率,并且无法对整个项目的log进行统一管理。

目的

为了方便管理和规范log输出,增加logcat使用的便捷性封装logcat需要满足以下几点:

1、动态管理日志输出

2、使用便捷,只需关注需要输出的massage即可

3、日志信息显示齐全,方便定位与统一

日志输出开关

通过广播及系统属性控制日志的开关,通过注册LOG_SWITCH = "android.App.all.log" 广播,用来控制所有app日志开关,方便多app统一管理,另外通过注册包名后缀+".log"广播(如包名为:com.yxd.logtest,则action为:logtest.log),来控制当前app的日志开关,同时还将开关值存入到系统属性中,以免退出后需重新打开。

通过adb模拟发送广播,实现开关控制,adb命令:adb shell am broadcast -a android.app.all.log --ei status 1

    public static void init(Context context) {
        if (sContext != null){
            return;
        }
        IntentFilter intentFilter = new IntentFilter();
        //系统属性名称不可超过32字符,所以使用包名最后一段+.log 来做属性名
        String[] strings = context.getPackageName().split("\.");
        intentFilter.addAction(strings[strings.length - 1] + ".log");
        intentFilter.addAction(LOG_SWITCH);
        context.registerReceiver(new LogSwitchReceiver(), intentFilter);
        String allLog = SystemProperties.get(LOG_SWITCH);
        String thisLog = SystemProperties.get(strings[strings.length - 1] + ".log");
        if ((!thisLog.isEmpty() && "1".equals(thisLog)) || (!allLog.isEmpty() && "1".equals(allLog))) {
            HQLog.SWITCH = true;
        }
        sContext = context;
    }
    static class LogSwitchReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra(LOG_STATUS, 0);
            Log.d("LogUtils", "LogSwitchReceiver action: " + intent.getAction() + "  status: " + status);
            SystemProperties.set(intent.getAction(), String.valueOf(status));
            HQLog.SWITCH = status == 1;
        }
    }

如果为debug版本,则默认打开日志输出

public static boolean SWITCH = BuildConfig.DEBUG;

输出格式

为了方便使用及定位,输出时需要将类名及行数显示,且在logcat上点击该行可以直接定位到对应输出代码,类似crash报错日志,点击蓝色字体即可跳转至输出行

Android logcat日志封装

 

具体实现如下:

    public static void e(String message) {
        if (SWITCH) {
            Log.e(getTag(), message);
        }
    }

    private static String getTag() {
        StackTraceElement[] traceElements = Thread.currentThread().getStackTrace();
        String tag = null;
        if (traceElements != null && traceElements.length > 4) {
            StackTraceElement traceElement = traceElements[4];
            tag = "(" + traceElement.getFileName() + ":" + traceElement.getLineNumber() + ")" + traceElement.getMethodName();
        } else {
            tag = "ULog";
        }
        return tag;

完整代码

使用时需在application里面init一下

public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
        LogUtils.init(this);
        AppInfo.initContext(this);
    }

    public static Context getApplication(){
        return mContext;
    }
}

 

public class LogUtils {
    public static String LOG_SWITCH = "android.app.all.log";
    //log开关状态 0关 1开
    public static String LOG_STATUS = "status";
    @SuppressLint("StaticFieldLeak")
    private static Context sContext;
    private static LogSwitchReceiver sLogSwitchReceiver = new LogSwitchReceiver();

    public static void init(Context context) {
        if (sContext != null){
            return;
        }
        IntentFilter intentFilter = new IntentFilter();
        //系统属性名称不可超过32字符,所以使用包名最后一段+.log 来做属性名
        String[] strings = context.getPackageName().split("\.");
        intentFilter.addAction(strings[strings.length - 1] + ".log");
        intentFilter.addAction(LOG_SWITCH);
        context.registerReceiver(new LogSwitchReceiver(), intentFilter);
        String allLog = SystemProperties.get(LOG_SWITCH);
        String thisLog = SystemProperties.get(strings[strings.length - 1] + ".log");
        if ((!thisLog.isEmpty() && "1".equals(thisLog)) || (!allLog.isEmpty() && "1".equals(allLog))) {
            ULog.SWITCH = true;
        }
        sContext = context;
    }

    public static void release() {
        if (sContext != null && sLogSwitchReceiver != null) {
            sContext.unregisterReceiver(sLogSwitchReceiver);
        }
    }

    static class LogSwitchReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra(LOG_STATUS, 0);
            Log.d("LogUtils", "LogSwitchReceiver action: " + intent.getAction() + "  status: " + status);
            SystemProperties.set(intent.getAction(), String.valueOf(status));
            ULog.SWITCH = status == 1;
        }
    }
}
public class ULog {

    public static boolean SWITCH = BuildConfig.DEBUG;

    public static void v(String message) {
        if (SWITCH) {
            Log.v(getTag(), message);
        }
    }

    public static void d(String message) {
        if (SWITCH) {
            Log.d(getTag(), message);
        }
    }

    public static void i(String message) {
        if (SWITCH) {
            Log.i(getTag(), message);
        }
    }

    public static void w(String message) {
        if (SWITCH) {
            Log.w(getTag(), message);
        }
    }

    public static void e(String message) {
        if (SWITCH) {
            Log.e(getTag(), message);
        }
    }

    public static void getStackTraceString(Throwable tr) {
        if (SWITCH) {
            Log.getStackTraceString(tr);
        }
    }

    private static String getTag() {
        StackTraceElement[] traceElements = Thread.currentThread().getStackTrace();
        String tag = null;
        if (traceElements != null && traceElements.length > 4) {
            StackTraceElement traceElement = traceElements[4];
            tag = "(" + traceElement.getFileName() + ":" + traceElement.getLineNumber() + ")" + traceElement.getMethodName();
        } else {
            tag = "ULog";
        }
        return tag;
    }

    private static String generateLogcatText(String msg, int place, String message) {
        return generateLogcatText(Thread.currentThread().getStackTrace(), msg, place, message);
    }

    private static String generateLogcatText(StackTraceElement[] traceElements, String msg, int place, String message) {
        try {
            StringBuilder taskName = new StringBuilder();
            if (traceElements != null && traceElements.length > place) {
                StackTraceElement traceElement = traceElements[place];
                taskName.append(traceElement.getMethodName()).append("() : ").append(message);
            }
            return taskName.toString();
        } catch (Throwable throwable) {
            return msg;
        }
    }
}


Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  Tags: Android  点击:(7)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  Tags: Android  点击:(26)  评论:(0)  加入收藏
如果你是一名忠实的Android玩家,那么可能会知道,今年的Android 12系统在版本规划上与“往届”相比可以说是很有些特殊。具体来说,除了前段时间刚刚推出正式版的Android 12外,谷...【详细内容】
2021-11-10  Tags: Android  点击:(23)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  Tags: Android  点击:(36)  评论:(0)  加入收藏
今年5月,谷歌推出了Android 12,这是原生安卓系统史上最大的设计变化,10月4日,谷歌推出全新的Android12正式版本,并且宣布会在今年晚些时候应用于安卓设备,对比Android11的挤牙膏式...【详细内容】
2021-10-29  Tags: Android  点击:(125)  评论:(0)  加入收藏
今天凌晨,谷歌正式发布了全新一代安卓Android 12系统,拥有全新的UI,同时带来了六大新功能,除此以外还有10月的安全补丁,下面就给大家介绍这六大新功能以及安卓Android 12系统配置...【详细内容】
2021-10-22  Tags: Android  点击:(53)  评论:(0)  加入收藏
用户通过系统返回按钮导航回去的一组页面,在开发中被称为返回栈 (back stack)。多返回栈即一堆 "返回栈",对多返回栈的支持是在 Navigation 2.4.0-alpha01 和 Fragment 1.4.0...【详细内容】
2021-08-17  Tags: Android  点击:(75)  评论:(0)  加入收藏
前言耗电量指标 待机时间成关注目标 提升用户体验 通过不同的测试场景,找出app高耗电的场景并解决01需要的环境准备1、python2.7(必须是2.7,3.X版本是不支持的) 2、golang语言...【详细内容】
2021-08-04  Tags: Android  点击:(93)  评论:(0)  加入收藏
6 月 29 日,微软向 Windows 预览体验计划的 Dev 通道推送了 Windows 11 的第一个预览版本,我们也在第一时间升级到了最新系统,可以点击这里查看 APPSO 的抢先体验。 关于 Windo...【详细内容】
2021-07-14  Tags: Android  点击:(90)  评论:(0)  加入收藏
玩过王者荣耀的朋友,几乎无人不晓「鲁班七号」这个英雄。作为 Android 的应用程序包,「APK」对于资深 Android 用户来说,知名度并不亚于前者。 也正因如此,日前 Google 的一份声...【详细内容】
2021-07-08  Tags: Android  点击:(44)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(6)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(7)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(26)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(36)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(57)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(51)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条