相信在座的各位同学都遇到过程序崩溃的问题,在众多代码中,排查bug是让众多开发者比较头疼的一件事。特别是一些同学刚接手别人的项目时,如果出现bug,简直是一团乱麻,无从下手,加上市面上的机型众多,Android版本不同,出现的问题也不同,所以在下推荐腾讯旗下的bugly,一款可以轻松跟踪bug的在线平台。

首先你需要申请一个bugly账号,如果项目需要上架,建议使用公司的账号注册。

我们先来配置文件到项目中去吧!由于大部分项目都需要运用其它的sdk,所以推荐自定义配置(官方也是这样的哟)

打开app下面的build.gradel

在defaultConfig代码块中配置ndk

ndk {// 设置支持的SO库架构abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'}

在dependencies代码块中引入bugly版本


//其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
implementation 'com.tencent.bugly:crashreport:2.1.9'//其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0
implementation 'com.tencent.bugly:nativecrashreport:3.0'

点击sync now完成配置,当然也可以进行手动配置,详情请查看官方文档https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20200622202242

现在我们开始写代码

首先定义一个全局配置的抓包工具类

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.text.TextUtils;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;public class CrashHandler implements Thread.UncaughtExceptionHandler {private static CrashHandler sInstance = null;private Thread.UncaughtExceptionHandler mDefaultHandler;private Context mContext;// 保存手机信息和异常信息private Map<String, String> mMessage = new HashMap<>();public static CrashHandler getInstance() {if (sInstance == null) {synchronized (CrashHandler.class) {if (sInstance == null) {synchronized (CrashHandler.class) {sInstance = new CrashHandler();}}}}return sInstance;}private CrashHandler() {}/*** 初始化默认异常捕获** @param context context*/public void init(Context context) {mContext = context;// 获取默认异常处理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 将此类设为默认异常处理器Thread.setDefaultUncaughtExceptionHandler(this);}@Overridepublic void uncaughtException(Thread t, Throwable e) {if (!handleException(e)) {// 未经过人为处理,则调用系统默认处理异常,弹出系统强制关闭的对话框if (mDefaultHandler != null) {mDefaultHandler.uncaughtException(t, e);}} else {// 已经人为处理,系统自己退出try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}System.exit(1);}}/*** 是否人为捕获异常** @param e Throwable* @return true:已处理 false:未处理*/private boolean handleException(Throwable e) {if (e == null) {// 异常是否为空return false;}new Thread() {// 在主线程中弹出提示@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "捕获到异常", Toast.LENGTH_SHORT).show();Looper.loop();}}.start();collectErrorMessages();saveErrorMessages(e);return false;}/*** 1.收集错误信息*/private void collectErrorMessages() {PackageManager pm = mContext.getPackageManager();try {PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);if (pi != null) {String versionName = TextUtils.isEmpty(pi.versionName) ? "null" : pi.versionName;String versionCode = "" + pi.versionCode;mMessage.put("versionName", versionName);mMessage.put("versionCode", versionCode);}// 通过反射拿到错误信息Field[] fields = Build.class.getFields();if (fields != null && fields.length > 0) {for (Field field : fields) {field.setAccessible(true);try {mMessage.put(field.getName(), field.get(null).toString());} catch (IllegalAccessException e) {e.printStackTrace();}}}} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}}/*** 2.保存错误信息** @param e Throwable*/private void saveErrorMessages(Throwable e) {StringBuilder sb = new StringBuilder();for (Map.Entry<String, String> entry : mMessage.entrySet()) {String key = entry.getKey();String value = entry.getValue();sb.append(key).append("=").append(value).append("\n");}Writer writer = new StringWriter();PrintWriter pw = new PrintWriter(writer);e.printStackTrace(pw);pw.close();String result = writer.toString();sb.append(result);// String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA).format(new Date());String fileName = "crash-"+System.currentTimeMillis()+"-"+".log";// 有无SD卡if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String path = Environment.getExternalStorageDirectory().getPath()+"/crash/";File dir = new File(path);if (!dir.exists()) dir.mkdirs();FileOutputStream fos = null;try {fos = new FileOutputStream(path + fileName);fos.write(sb.toString().getBytes());} catch (Exception e1) {e1.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e1) {e1.printStackTrace();}}}}}
}

自定义一个Application类,这个类可以用于各种SDK的初始化,可以大大减少代码的冗余。

import android.app.Application;import com.tencent.bugly.crashreport.CrashReport;public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();CrashHandler.getInstance().init(this);CrashReport.initCrashReport(getApplicationContext(), "自己申请的appID", false);}
}

然后我们需要在AndroidManfest.xml中申请相关权限

<!-- App需要上传到google play store,需要将READ_PHONE_STATE权限屏蔽掉或者移除,否则可能会被下架 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_LOGS" />

在application标签中我们需要添加name属性值,主要是把刚才自己写的application给加载到全局

android:name=".MyApp"

好了,现在就可以运行自己的apk了,当你程序出现崩溃时,就可以在bugly平台看见崩溃日志了哟!!!

腾讯bugly的使用,以及全局抓包配置相关推荐

  1. 使用Fiddler5和雷电模拟器4.0.83的抓包配置

    使用Fiddler5和雷电模拟器4.0.83的抓包配置 工具 Fiddler配置 步骤 1.先将FD的证书导出到桌面 2.使用Git Bash工具,对证书进行修改 2.1在桌面右键,打开Git Bas ...

  2. charles 安装 ssl_charles抓包配置

    charles介绍 charles是一款PC端的web代理工具,PC上的浏览器或者其他应用程序通过charles访问网络,charles会记录所有发送和接收的数据.在网络相关的开发过程中,前端/客户端 ...

  3. 端口隔离配置命令、端口镜像(抓包配置)详解(附图,建议PC观看)

    目录 一.端口隔离: 二.端口镜像:(抓包配置) (1)思科: (2)华为: 一.端口隔离: 实列:客户需求:pc1和pc2可以访问pc3,但pc1和pc2之间不能相互访问 (1)私有vlan--Pv ...

  4. Mac Charles抓包配置

    Mac Charles抓包配置 1.基本安装 直接在官网下载,需要破解的同学可以使用这个,我也是借花献佛,这样你可以时刻来抓包了, Registered Name: https://zhile.io ...

  5. Fiddler抓包软件下载以及抓包配置

    一.fiddler下载 官网下载地址: https://www.telerik.com/download/fiddler 填入对应的信息,点击下载即可 二.fiddler安装 双击启动安装程序,傻瓜式 ...

  6. php抓包腾讯大王卡token,【搬砖教程】腾讯大王卡动态免流抓包教程 有链接

    另一个帖子有如何用tiny开热点哦! 帖子有不足之处,会不停改进,希望实时查看 教程有没有root都可以的 首先感谢流星,这些都是流星教的,现在传播回来,为流星做贡献.再者,希望看懂的都能够回复下,毕 ...

  7. fiddler手机端抓包配置

    首先,你得安装fiddler,这是前提条件,手机抓包有必须条件: 需要保持电脑和手机在同一个局域网中 (这一点,我一般会在电脑上启动一个wifi,然后手机连接即可) 下面说一下如何配置: 手机连接电脑 ...

  8. 常用品牌交换机镜像抓包配置

    华为交换机镜像配置观察口配置: <huawei-switch>system-view [huawei-switch]observe-port 1 interface GigabitEthe ...

  9. fiddler手机抓包配置方法

    一.下载工具包 百度搜索"fiddler 下载" ,安装最新版本 下载的软件安装包为"fiddler_4.6.20171.26113_setup.exe"格式, ...

  10. fiddler证书生成ca证书命令及抓包配置

    fiddler证书生成ca证书命令 下载OpenSSL fiddler配置https fiddler导出证书 将文件直接放到openssl的bin目录下 执行cmd命令生成ca证书 将证书放到andr ...

最新文章

  1. ie和firefox操作table对象的异同
  2. SAP RETAIL 初阶之WA52 Allocation Rule List
  3. 闭关修炼——two——struts2
  4. php限定时间内同一ip只能访问一次
  5. 【转】PhpStorm 提交代码到远程GitHub仓库
  6. 什么样的GPS定位系统最适合做二次开发
  7. 机器学习模型效果评估
  8. windows下手动配置ipv6地址
  9. 【剑指offer】面试题65:不用加减乘除做加法(Java)
  10. Linux的Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewall(d)]【转载转载转载】
  11. 怎样重建一个损坏的调用堆栈(callstack)
  12. tt桌球瞄准器手机版_传闻老任将进军手机市场?任天堂独立直面会将于周四凌晨举行...
  13. 服务器 ××× 上的MSDTC不可用解决办法
  14. 自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测
  15. 2567 HDU 寻梦
  16. 上课笔记、HTML简介
  17. 如何在Word中优雅地插入代码块,论文、竞赛专用
  18. 含含乐-口含烟真的能戒烟替烟?
  19. 开箱即用的百度开放域信息抽取的统一框架UIE
  20. Mac系统显示已连接(可以打开qq)但是无法打开浏览器解决方案

热门文章

  1. Qt中undefined reference to报错的三种可能性和解决方法(以libgdal为例)
  2. 从360、QQ之争看腾讯的无耻
  3. 社科院与杜兰大学金融管理硕士——在自己的领域努力拼搏,终将遇到专属的光芒
  4. 美国60所真正著名的大学
  5. VML实例-拖动效果
  6. No bootable device
  7. 循环小数是分数集合吗_无限循环小数都可以化成分数吗
  8. 有用的函数-系统采集
  9. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
  10. [OpenAirInterface实战-16] :OAI 软件无线电USRP X300/X310硬件详解