Android Source code parsing (vi)--> Log logs

Source: Internet
Author: User
Tags stack trace
<span id="Label3"></p> <blockquote> <blockquote> <p>Reprint please indicate the source: a column of Maple Leaf</p> </blockquote> </blockquote><p><p>First of all, humorous, for students who want to learn the Android framework source code, in fact, can fork a copy in github, detailed address: platform_frameworks_base<br>This is basically the source code of the Android framework Layer. And recently found a good GitHub plugin: octotree, It is a browser plugin, it allows you to see the code on github, the left column will appear a tree structure. Just like we're in the Ide. When we look at the structure of a project, or want to see a detailed file, it is very convenient.</p></p><p><p>How about this view of the source code is not a very important aspect?</p></p><p><p>well, Let's talk about the log object we need to present today, which is located under the Android Framework Layer Utils package and is a final class class: view its detailed definition:</p></p><pre class="prettyprint"><code class=" hljs java"><span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-class"><span class="hljs-class"> <span class="hljs-keyword">class</span> <span class="hljs-title">Log</span> {</span></span> <span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method, use LOG.V. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>VERBOSE =<span class="hljs-number"><span class="hljs-number">2</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method, use LOG.D. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>DEBUG =<span class="hljs-number"><span class="hljs-number">3</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method, use LOG.I. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>INFO =<span class="hljs-number"><span class="hljs-number">4</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method, use LOG.W. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>WARN =<span class="hljs-number"><span class="hljs-number">5</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method, use LOG.E. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>ERROR =<span class="hljs-number"><span class="hljs-number">6</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Priority constant for the println method. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>ASSERT =<span class="hljs-number"><span class="hljs-number">7</span></span>;<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-title"><span class="hljs-title">Log</span></span>() { }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #VERBOSE} log message. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">v</span></span>(string tag, String Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, VERBOSE, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #VERBOSE} log message and log the Exception. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @param</span> tr an exception to log *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">v</span></span>(string tag, string msg, throwable tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, VERBOSE, tag, msg +<span class="hljs-string"><span class="hljs-string">' \ n '</span></span>+ getstacktracestring (tr)); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #DEBUG} log message. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">D</span></span>(string tag, String Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, DEBUG, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #DEBUG} log message and log the Exception. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @param</span> tr an exception to log *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">D</span></span>(string tag, string msg, throwable tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, DEBUG, tag, msg +<span class="hljs-string"><span class="hljs-string">' \ n '</span></span>+ getstacktracestring (tr)); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send an {@link #INFO} log message. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">I</span></span>(string tag, String Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, INFO, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #INFO} log message and log the Exception. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @param</span> tr an exception to log *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">I</span></span>(string tag, string msg, throwable tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, INFO, tag, msg +<span class="hljs-string"><span class="hljs-string">' \ n '</span></span>+ getstacktracestring (tr)); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #WARN} log message. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">W</span></span>(string tag, String Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, WARN, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #WARN} log message and log the Exception. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @param</span> tr an exception to log *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">W</span></span>(string tag, string msg, throwable tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, WARN, tag, msg +<span class="hljs-string"><span class="hljs-string">' \ n '</span></span>+ getstacktracestring (tr)); }<span class="hljs-comment">/ <span class="hljs-comment">* * 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 *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">W</span></span>(String tag, Throwable Tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, WARN, tag, getstacktracestring (tr)); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send an {@link #ERROR} log message. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">e</span></span>(string tag, String Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, ERROR, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Send a {@link #ERROR} log message and log the Exception. *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of a log message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @param</span> tr an exception to log *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">e</span></span>(string tag, string msg, throwable tr) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, ERROR, tag, msg +<span class="hljs-string"><span class="hljs-string">' \ n '</span></span>+ getstacktracestring (tr)); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Handy function to get a loggable stack trace from a throwable *<span class="hljs-javadoctag"> @param</span> tr an exception to log */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>String<span class="hljs-title"><span class="hljs-title">getstacktracestring</span></span>(throwable Tr) {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(TR = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-string"><span class="hljs-string">""</span></span>; }<span class="hljs-comment"><span class="hljs-comment">//</span> this was to reduce the amount of logs spew that apps does in the Non-error</span> <span class="hljs-comment"><span class="hljs-comment">//condition of the network being Unavailable.</span></span>Throwable t = tr;<span class="hljs-keyword"><span class="hljs-keyword"></span> while</span>(t! =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>) {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(t<span class="hljs-keyword"><span class="hljs-keyword">instanceof</span></span>Unknownhostexception) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-string"><span class="hljs-string">""</span></span>; } t = T.getcause (); } StringWriter SW =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>StringWriter (); PrintWriter PW =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>PrintWriter (sw); Tr.printstacktrace (pw); Pw.flush ();<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>Sw.tostring (); }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Low-level logging Call. *<span class="hljs-javadoctag"> @param</span> The priority/type of this log message *<span class="hljs-javadoctag"> @param</span> tag used to identify the source of A log Message. It usually identifies * the class or activity where the log call Occurs. *<span class="hljs-javadoctag"> @param</span> msg The message would like Logged. *<span class="hljs-javadoctag"> @return</span> The number of bytes Written. */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">println</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>priority, string tag, string Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>println (log_id_main, priority, tag, msg); }<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Log_id_main =<span class="hljs-number"><span class="hljs-number">0</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Log_id_radio =<span class="hljs-number"><span class="hljs-number">1</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Log_id_events =<span class="hljs-number"><span class="hljs-number">2</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Log_id_system =<span class="hljs-number"><span class="hljs-number">3</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Log_id_crash =<span class="hljs-number"><span class="hljs-number">4</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> *</span> /</span> <span class="hljs-annotation"><span class="hljs-annotation">@SuppressWarnings</span></span>(<span class="hljs-string"><span class="hljs-string">"unused"</span></span>)<span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> <span class="hljs-title"><span class="hljs-title">println</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>bufid,<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>priority, string tag, string Msg) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-number"><span class="hljs-number">0</span></span>; }}</code></pre><p><p>Be able to see the de facto final class. So we can't implement our own logging tool class by inheriting the log class, we can usually define the log member variable by the WAY. Package Log Tool method;</p></p><p><p>In the log class we define six kinds of log levels, respectively: VERBOSE, DEBUG, INFO, WARN, ERROR, assert and other six levels, but we usually use only the first five kinds, that is Verbose,debug,info,warn,error.</p></p><p><p>By looking at the source code we find all the static log methods in the Log class LOG.V (), log.d (). Methods such as LOG.I (), LOG.W (), log.e () are all called println methods at the bottom, and then viewed in Github's source code, which in fact calls the Println_native method internally. That is, through JNI calls the underlying C + + output log;</p></p><p><p>We are only temporarily analyzing here. The detailed implementation of the underlying C + + log output is not Analyzed. To Summarize:</p></p> <ul> <ul> <li><p>Log.java is a final class. So we are not able to inherit the log class to implement our own logging Framework. however, you can implement your own log tool class by associating (saving the log member variable);</p></li> <li><p>Six log levels are defined in Log.java. however, we usually only use five of the log Levels. respectively corresponding to verbose, DEBUG, INFO, WARN, ERROR, in the detailed use of the scene under detailed analysis;</p></li> <li><p>Some students are not comfortable with the log frame that comes with android. The main point is that the log location cannot be located, where I can view an article that I wrote to implement my own definition log framework: GitHub project parsing (v) –>android log Framework</p></li> </ul> </ul><p><p>The log can be personalized to show relevant information:<br></p></p><p><p>In addition to the Android source code parsing method is interested in my:<br>Android source code parsing (i) –>android project build process<br>Android source code parsing (ii) –> Asynchronous message mechanism<br>Android source code parsing (iii) –> Asynchronous task Asynctask<br>Android source code parsing (iv) –>handlerthread<br>Android source code parsing (v) –>intentservice</p></p><p><p><strong>This article synchronizes to github: https://github.com/yipianfengye/androidSource, Welcome to star and follow</strong></p></p> <p><p>Android Source code parsing (vi)--&gt; Log logs</p></p></span>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.