当前位置:首页 » 安卓系统 » android封装log

android封装log

发布时间: 2023-03-11 09:24:23

A. Android 各种log 的介绍

包含设备日志,堆栈跟踪和其他诊断信息,可帮助您查找和修复应用中的错误。

安卓bugreport主要用于分析手机的状态。其包含: main log , kernel log ,cpuinfo等信息。bugreport是一个可执行文件,编译后的路径为system/bin/bugreport,源码位于framework/native/cmds/bugreport。其核心在于启动mpsys服务。bugreport同mpstate服务建立socket通信(建立连接20次,超时3min无数据等容错)。连接之后,将接收到的数据定向到文件中。

  因此我们看到的bugreport数据均来自mpstate。

bugreport通过socket与mpstate服务建立通信,在mpstate.cpp中的mpstate()方法完成核心功能。分别输出: current log、 last log、 vm trace、 mpsys、 system info

 其详细内容主要有: 系统build及运行时长等信息、 内存和CPU进程的信息、 kernel log、 system log、 radio log、 event log 等等。实际来说,bugreport中显示的大部分为信息,都有对应的命令方式可以获取。bugreport只是作为一个在不打扰用户的前提下执行的一套命令集合。

    1). main_log    记录手机android上层app以及framework相关活动的log,比如你写的app打印的log,就在这里面

    2). events_log    主要是ActivityManager、powerManager等相关的log

    3). kernel Log    驱动相关的log

Logcat是内置在Android系统中的一个可执行工具,用于转储系统消息日志,其中包括设备引发错误时的堆栈追踪以及从您的应用当使用 Log 类编写的消息。可以在主机上通过adb logcat命令来查看模拟机上日志信息。

Android tcpmp是命令行数据包捕获实用程序。它可以捕获来自您的Wi-Fi连接,蜂窝连接以及您在android设备上可能具有的任何其他网络连接的数据包

modem 是手机里负责搜网和sim卡数据操作底层模块,每个手机都有,md log 用于分析掉网、掉话、无信号等问题

系统崩溃时留下的遗言,怎么死的,死哪了,死的多惨。

当一个动态库(native 程序)开始执行时,系统会注册一些连接到 debuggerd 的 signal handlers,当系统 crash(崩溃) 的时候,会保存一个 tombstone 文件到/data/tombstones目录下(Logcat中也会有相应的信息),文件的确就像墓碑一样记录了死亡了的进程的基本信息(例如进程的进程号,线程号),死亡的地址(在哪个地址上发生了 Crash),死亡时的现场是什么样的(记录了一系列的堆栈调用信息)等等。

6. netlog    网络相关

看网络链接情况,抓取网络包等等

7. QXDM(the Qualcomm eXtensible Diagnostic Monitor)高通可扩展诊断监视器

该工具适用于拥有使用Qualcomm ASIC和试用硬件的设备的人,并允许他们测试,评估和潜在诊断其移动设备的RF性能问题。通常使用它来促进这些设备的产品开发。

使用该软件,用户可以查看他们的移动设备发出的所有信令消息,因为该软件会生成它们的日志。这些日志也可以通过软件进行注释。可以将网络和电话参数的任何混合添加到屏幕,并且允许用户在使用其参数时使用复杂的公式。该程序还实时生成大量统计数据,以便用户可以更好地识别潜在的性能问题。用户可以访问Markov统计信息,Mux统计信息,RLP统计信息,块错误率,移动性管理数据,寻呼和访问统计信息,前向和反向链路统计信息等等。该程序还为用户提供了便携式设备信号的图形显示。该程序与Windows操作系统兼容。

8. init Log(init进程log)

9. Crashlog(崩溃日志)

B. Android中如何通过logcat追踪生命周期事件

Log类是Android.util的成员类,当我们键入Log类时,会弹出一个智能代码提示列表。我们在该列表中选择日志输出类型d的方法时,系统会自动import导入Android.util.Log包。但是要注意Log类值在实际开发中只用于测试代码,如果你准备进行应用分发时,你应该在代码中注释掉或者删除所有Log类的引用。Log类中封装了一套方法可以将消息发送到logcat控制台、命令行或者Andorid studio中,这些方法都是由单个字符组成,常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR,分别表示不同的调式级别。在logcat控制台中你可以设置只显示某个级别及其以上的日志信息。

按照日志级别从高到低为ERROR, WARN, INFO, DEBUG, VERBOSE..
1、Log.v 字符串的输出颜色为黑色的,输出大于或等于VERBOSE日志级别的信息
2、Log.d字符串的输出颜色是蓝色的,输出大于或等于DEBUG日志级别的信息
3、Log.i字符串的输出为绿色,输出大于或等于INFO日志级别的信息
4、Log.w字符串的输出为橙色, 输出大于或等于WARN日志级别的信息
5、Log.e字符串的的输出为红色,仅输出ERROR日志级别的信息.

那我们如何通过Log类监听Activity的生命周期呢看
首先我们在Activity中重写所有生命周期相关的回调方法,然后在每个回调方法中通过Log类来调用相应的方法来打印信息。根据打印的信息我们就可以知道Activity的生命周期顺序时怎么样的了,以下示例代码我们监听了Activity所有生命周期相关的回调方法。在我们运行程序时就可以在控制台看到生命周期顺序的打印信息了。
package com.example.hsport.catalog;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private CoordinatorLayout coordinatorLayout;
private final String TAG ="--MainActivity--";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
Button button = (Button) findViewById(R.id.submitbutton);
Log.d(TAG,"--onCreate--");
}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"--onStop--");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"--onDestroy--");
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"-- onRestar--");
}
}
当我们在模拟器中启动Activity时打印信息如下,可以看出来它调用了onCreate、onStart、onResume三个方法

你可以通过操作应用程序来查看更多情况下的Activity生命周期的变化。
这些都是Android中的基础知识,推荐你可以在一个叫做秒秒学的教程网站上可以找到相关资料。

C. 安卓如何将log保存到文件中

相信大家在做应用调试的时候,不可能时时通过USB线连着电脑去查看log信息,所以,将应用的log信息保存到手机本地就很有必要了,有助我们从这些log信息中提取有用的部分,以解决一些bug,下面我把网上分享的代码中作了一些精简,作为开发者使用,个人觉得没必要通过用户上传给我们,用户上传的不需要这么庞大的log信息,仅仅那部分崩溃的log信息即可,可参考我的另外一篇blog:http://blog.csdn.net/weidi1989/article/details/7927273。
好了,废话不多说,直接分享封装好的log信息类:LogcatHelper
package com.way.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import android.content.Context;
import android.os.Environment;

/**
* log日志统计保存
*
* @author way
*
*/

public class LogcatHelper {

private static LogcatHelper INSTANCE = null;
private static String PATH_LOGCAT;
private LogDumper mLogDumper = null;
private int mPId;

/**
*
* 初始化目录
*
* */
public void init(Context context) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {// 优先保存到SD卡中
PATH_LOGCAT = Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator + "miniGPS";
} else {// 如果SD卡不存在,就保存到本应用的目录下
PATH_LOGCAT = context.getFilesDir().getAbsolutePath()
+ File.separator + "miniGPS";
}
File file = new File(PATH_LOGCAT);
if (!file.exists()) {
file.mkdirs();
}
}

public static LogcatHelper getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = new LogcatHelper(context);
}
return INSTANCE;
}

private LogcatHelper(Context context) {
init(context);
mPId = android.os.Process.myPid();
}

public void start() {
if (mLogDumper == null)
mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);
mLogDumper.start();
}

public void stop() {
if (mLogDumper != null) {
mLogDumper.stopLogs();
mLogDumper = null;
}
}

private class LogDumper extends Thread {

private Process logcatProc;
private BufferedReader mReader = null;
private boolean mRunning = true;
String cmds = null;
private String mPID;
private FileOutputStream out = null;

public LogDumper(String pid, String dir) {
mPID = pid;
try {
out = new FileOutputStream(new File(dir, "GPS-"
+ MyDate.getFileName() + ".log"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/**
*
* 日志等级:*:v , *:d , *:w , *:e , *:f , *:s
*
* 显示当前mPID程序的 E和W等级的日志.
*
* */

// cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";
// cmds = "logcat | grep \"(" + mPID + ")\"";//打印所有日志信息
// cmds = "logcat -s way";//打印标签过滤信息
cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";

}

public void stopLogs() {
mRunning = false;
}

@Override
public void run() {
try {
logcatProc = Runtime.getRuntime().exec(cmds);
mReader = new BufferedReader(new InputStreamReader(
logcatProc.getInputStream()), 1024);
String line = null;
while (mRunning && (line = mReader.readLine()) != null) {
if (!mRunning) {
break;
}
if (line.length() == 0) {
continue;
}
if (out != null && line.contains(mPID)) {
out.write((MyDate.getDateEN() + " " + line + "\n")
.getBytes());
}
}

} catch (IOException e) {
e.printStackTrace();
} finally {
if (logcatProc != null) {
logcatProc.destroy();
logcatProc = null;
}
if (mReader != null) {
try {
mReader.close();
mReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
out = null;
}

}

}

}

}

记得加上权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_LOGS" />

另外把那个时间的工具类也分享一下:
package com.way.util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDate {
public static String getFileName() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String date = format.format(new Date(System.currentTimeMillis()));
return date;// 2012年10月03日 23:41:31
}

public static String getDateEN() {
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = format1.format(new Date(System.currentTimeMillis()));
return date1;// 2012-10-03 23:41:31
}

}

OK,所有事情做完之后,在我们的应用中start一下就OK了,使用完之后,记得调用一下stop:
public class GPSApplication extends Application {

@Override
public void onCreate() {
// TODO Auto-generated method stub
LogcatHelper.getInstance(this).start();
}
}

D. Android Log等级的介绍

android.util.Log常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。按照日志级别从高到低为ERROR, WARN, INFO, DEBUG, VERBOSE.至于日志级别本身的含义.

1.下面是对各种日志级别的输出介绍:

1、Log.v 的输出颜色为黑色的,输出大于或等于VERBOSE日志级别的信息

2、Log.d的输出颜色是蓝色的,输出大于或等于DEBUG日志级别的信息

3、Log.i的输出为绿色,输出大于或等于INFO日志级别的信息

4、Log.w的输出为橙色, 输出大于或等于WARN日志级别的信息

5、Log.e的输出为红色,仅输出ERROR日志级别的信息.

Android的Log等级通常有五类,按照日志级别由低到高分别是Verbose、Debug、Info、Warning、Error,其对应的log定义在system层。

1.V

Verbose就是冗长啰嗦的。通常表达开发调试过程中的一些详细信息,用Log.v()输出,不过滤地输出所有调试信息。是最低级的Log可以不用管。

2.D

Debug来表达调试信息。用Log.d()输出,能输出Debug、Info、Warning、Error级别的Log信息。

3.I

Info来表达一些信息。用Log.i()输出,能输出Info、Warning、Error级别的Log信息。

4.W

Warning表示警告,但不一定会马上出现错误,开发时有时用来表示特别注意的地方。用Log.w()输出,能输出Warning、Error级别的Log信息。

5.E

Error表示出现错误,是最需要关注解决的。用Log.e()输出,能输出Error级别的Log信息。

注:Info、Warnning、Error等级的Log在普通调试中不随意滥用,存在发布版本中。在开发调试版本中,才会显示全部等级。

E. 为什么要对android log进行封装

简单说,在版本发布的时候,要取消所有log,你封装一下,改一下开关就能关闭所有的log了。而不关闭log的风险包括,你打印的东西太多 和 打印的东西有可能空指针异常之类的。

热点内容
安卓桌面应用如何变大 发布:2025-05-13 20:59:39 浏览:360
解压通知单有什么用 发布:2025-05-13 20:58:37 浏览:567
俄罗斯方块的编程 发布:2025-05-13 20:51:08 浏览:611
python开发项目 发布:2025-05-13 20:44:17 浏览:736
安卓手机怎么样刷国行系统 发布:2025-05-13 20:44:14 浏览:320
云服务器端口如何设置断网间隔 发布:2025-05-13 20:43:15 浏览:131
linux系统休眠 发布:2025-05-13 20:30:05 浏览:906
安卓手表进水了怎么搞 发布:2025-05-13 20:11:31 浏览:515
linuxc语言随机数 发布:2025-05-13 20:09:16 浏览:240
c语言通用链表 发布:2025-05-13 19:53:04 浏览:806