• Android源代码解析之(六)-->Log日志


    转载请标明出处:一片枫叶的专栏

    首先说点题外话,对于想学android framework源代码的同学,事实上能够在github中fork一份,详细地址:platform_frameworks_base
    这里面基本都是android framework层的源代码了。并且近期发现了一个比較不错的github插件:OctoTree,它 是一个浏览器插件,它能够让你在Github 看代码时,左边栏会出现一个树状结构。就像我们在IDE 一样。当我们看一个项目的结构,或者想看详细的某个文件,这样就会非常方便。这里写图片描写叙述

    怎么样这样查看源代码的话是不是非常方面?

    好了说一下我们今天须要介绍的Log对象,它位于android framework层utils包下,是一个final class类:查看其详细定义:

    public final class Log {
    
        /**
         * Priority constant for the println method; use Log.v.
         */
        public static final int VERBOSE = 2;
    
        /**
         * Priority constant for the println method; use Log.d.
         */
        public static final int DEBUG = 3;
    
        /**
         * Priority constant for the println method; use Log.i.
         */
        public static final int INFO = 4;
    
        /**
         * Priority constant for the println method; use Log.w.
         */
        public static final int WARN = 5;
    
        /**
         * Priority constant for the println method; use Log.e.
         */
        public static final int ERROR = 6;
    
        /**
         * Priority constant for the println method.
         */
        public static final int ASSERT = 7;
    
        private Log() {
        }
    
        /**
         * Send a {@link #VERBOSE} log message.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         */
        public static int v(String tag, String msg) {
            return println(LOG_ID_MAIN, VERBOSE, tag, msg);
        }
    
        /**
         * Send a {@link #VERBOSE} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @param tr An exception to log
         */
        public static int v(String tag, String msg, Throwable tr) {
            return println(LOG_ID_MAIN, VERBOSE, tag, msg + '
    ' + getStackTraceString(tr));
        }
    
        /**
         * Send a {@link #DEBUG} log message.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         */
        public static int d(String tag, String msg) {
            return println(LOG_ID_MAIN, DEBUG, tag, msg);
        }
    
        /**
         * Send a {@link #DEBUG} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @param tr An exception to log
         */
        public static int d(String tag, String msg, Throwable tr) {
            return println(LOG_ID_MAIN, DEBUG, tag, msg + '
    ' + getStackTraceString(tr));
        }
    
        /**
         * Send an {@link #INFO} log message.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         */
        public static int i(String tag, String msg) {
            return println(LOG_ID_MAIN, INFO, tag, msg);
        }
    
        /**
         * Send a {@link #INFO} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @param tr An exception to log
         */
        public static int i(String tag, String msg, Throwable tr) {
            return println(LOG_ID_MAIN, INFO, tag, msg + '
    ' + getStackTraceString(tr));
        }
    
        /**
         * Send a {@link #WARN} log message.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         */
        public static int w(String tag, String msg) {
            return println(LOG_ID_MAIN, WARN, tag, msg);
        }
    
        /**
         * Send a {@link #WARN} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @param tr An exception to log
         */
        public static int w(String tag, String msg, Throwable tr) {
            return println(LOG_ID_MAIN, WARN, tag, msg + '
    ' + getStackTraceString(tr));
        }
    
        /*
         * Send a {@link #WARN} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param tr An exception to log
         */
        public static int w(String tag, Throwable tr) {
            return println(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr));
        }
    
        /**
         * Send an {@link #ERROR} log message.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         */
        public static int e(String tag, String msg) {
            return println(LOG_ID_MAIN, ERROR, tag, msg);
        }
    
        /**
         * Send a {@link #ERROR} log message and log the exception.
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @param tr An exception to log
         */
        public static int e(String tag, String msg, Throwable tr) {
            return println(LOG_ID_MAIN, ERROR, tag, msg + '
    ' + getStackTraceString(tr));
        }
    
        /**
         * Handy function to get a loggable stack trace from a Throwable
         * @param tr An exception to log
         */
        public static String getStackTraceString(Throwable tr) {
            if (tr == null) {
                return "";
            }
    
            // This is to reduce the amount of log spew that apps do in the non-error
            // condition of the network being unavailable.
            Throwable t = tr;
            while (t != null) {
                if (t instanceof UnknownHostException) {
                    return "";
                }
                t = t.getCause();
            }
    
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            tr.printStackTrace(pw);
            pw.flush();
            return sw.toString();
        }
    
        /**
         * Low-level logging call.
         * @param priority The priority/type of this log message
         * @param tag Used to identify the source of a log message.  It usually identifies
         *        the class or activity where the log call occurs.
         * @param msg The message you would like logged.
         * @return The number of bytes written.
         */
        public static int println(int priority, String tag, String msg) {
            return println(LOG_ID_MAIN, priority, tag, msg);
        }
    
        /** @hide */ public static final int LOG_ID_MAIN = 0;
        /** @hide */ public static final int LOG_ID_RADIO = 1;
        /** @hide */ public static final int LOG_ID_EVENTS = 2;
        /** @hide */ public static final int LOG_ID_SYSTEM = 3;
        /** @hide */ public static final int LOG_ID_CRASH = 4;
    
        /** @hide */ @SuppressWarnings("unused")
        public static int println(int bufID,
                int priority, String tag, String msg) {
            return 0;
        }
    }

    能够看到事实上final 类。所以我们不能通过继承Log类的方式实现自身的日志工具类,一般的我们能够通过定义Log成员变量的方式。封装Log工具方法;

    在Log类中我们定义了六种日志级别,各自是:VERBOSE、DEBUG、INFO、WARN、ERROR、ASSERT等六种级别,可是我们平时使用的仅仅有前五种,即VERBOSE,DEBUG,INFO,WARN,ERROR。

    通过查看源代码我们发现Log类中全部的静态日志方法Log.v(),Log.d()。Log.i(),Log.w(),Log.e()等方法都是底层都是调用了println方法,然后在github的源代码中查看,事实上其内部调用的是println_native方法。也就是通过JNI调用底层的c++输出日志;

    我们临时仅仅是分析到这里。至于底层的c++日志输出的详细实现不作分析。总结一下:

    • Log.java是一个final类。所以我们不能够继承Log类来实现自己的日志框架。可是能够通过关联(保存Log成员变量)的方式实现自己的Log工具类;

    • Log.java中定义了六种日志级别。可是我们通常仅仅是使用当中的五种日志级别。分别相应着VERBOSE、DEBUG、INFO、WARN、ERROR,在详细的使用场景下详细分析;

    • 有些同学对android自带的日志框架不太惬意。主要是无法定位日志位置,这里能够查看我写的一篇实现自己定义日志框架的文章:github项目解析(五)–>android日志框架

    日志能够个性化的展示相关信息:
    这里写图片描写叙述

    另外对android源代码解析方法感兴趣的可參考我的:
    android源代码解析之(一)–>android项目构建过程
    android源代码解析之(二)–>异步消息机制
    android源代码解析之(三)–>异步任务AsyncTask
    android源代码解析之(四)–>HandlerThread
    android源代码解析之(五)–>IntentService


    本文以同步至github中:https://github.com/yipianfengye/androidSource,欢迎star和follow


  • 相关阅读:
    Day1:了解APICloud平台、理解APICloud应用设计思想、掌握平台使用流程。学习如何对一款APP进行需求分析、功能分解和架构设计等编码之前重要的准备工作
    Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用
    DOM (文档对象模型(Document Object Model))
    api.setFrameGroupIndex
    Python单元测试——unittest
    XAMPP启动mysql遇到的问题
    sql优化
    sql学习资料
    AJAX笔记
    XML笔记
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7244149.html
Copyright © 2020-2023  润新知