腾讯bugly的使用,以及全局抓包配置
相信在座的各位同学都遇到过程序崩溃的问题,在众多代码中,排查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的使用,以及全局抓包配置相关推荐
- 使用Fiddler5和雷电模拟器4.0.83的抓包配置
使用Fiddler5和雷电模拟器4.0.83的抓包配置 工具 Fiddler配置 步骤 1.先将FD的证书导出到桌面 2.使用Git Bash工具,对证书进行修改 2.1在桌面右键,打开Git Bas ...
- charles 安装 ssl_charles抓包配置
charles介绍 charles是一款PC端的web代理工具,PC上的浏览器或者其他应用程序通过charles访问网络,charles会记录所有发送和接收的数据.在网络相关的开发过程中,前端/客户端 ...
- 端口隔离配置命令、端口镜像(抓包配置)详解(附图,建议PC观看)
目录 一.端口隔离: 二.端口镜像:(抓包配置) (1)思科: (2)华为: 一.端口隔离: 实列:客户需求:pc1和pc2可以访问pc3,但pc1和pc2之间不能相互访问 (1)私有vlan--Pv ...
- Mac Charles抓包配置
Mac Charles抓包配置 1.基本安装 直接在官网下载,需要破解的同学可以使用这个,我也是借花献佛,这样你可以时刻来抓包了, Registered Name: https://zhile.io ...
- Fiddler抓包软件下载以及抓包配置
一.fiddler下载 官网下载地址: https://www.telerik.com/download/fiddler 填入对应的信息,点击下载即可 二.fiddler安装 双击启动安装程序,傻瓜式 ...
- php抓包腾讯大王卡token,【搬砖教程】腾讯大王卡动态免流抓包教程 有链接
另一个帖子有如何用tiny开热点哦! 帖子有不足之处,会不停改进,希望实时查看 教程有没有root都可以的 首先感谢流星,这些都是流星教的,现在传播回来,为流星做贡献.再者,希望看懂的都能够回复下,毕 ...
- fiddler手机端抓包配置
首先,你得安装fiddler,这是前提条件,手机抓包有必须条件: 需要保持电脑和手机在同一个局域网中 (这一点,我一般会在电脑上启动一个wifi,然后手机连接即可) 下面说一下如何配置: 手机连接电脑 ...
- 常用品牌交换机镜像抓包配置
华为交换机镜像配置观察口配置: <huawei-switch>system-view [huawei-switch]observe-port 1 interface GigabitEthe ...
- fiddler手机抓包配置方法
一.下载工具包 百度搜索"fiddler 下载" ,安装最新版本 下载的软件安装包为"fiddler_4.6.20171.26113_setup.exe"格式, ...
- fiddler证书生成ca证书命令及抓包配置
fiddler证书生成ca证书命令 下载OpenSSL fiddler配置https fiddler导出证书 将文件直接放到openssl的bin目录下 执行cmd命令生成ca证书 将证书放到andr ...
最新文章
- ie和firefox操作table对象的异同
- SAP RETAIL 初阶之WA52 Allocation Rule List
- 闭关修炼——two——struts2
- php限定时间内同一ip只能访问一次
- 【转】PhpStorm 提交代码到远程GitHub仓库
- 什么样的GPS定位系统最适合做二次开发
- 机器学习模型效果评估
- windows下手动配置ipv6地址
- 【剑指offer】面试题65:不用加减乘除做加法(Java)
- Linux的Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewall(d)]【转载转载转载】
- 怎样重建一个损坏的调用堆栈(callstack)
- tt桌球瞄准器手机版_传闻老任将进军手机市场?任天堂独立直面会将于周四凌晨举行...
- 服务器 ××× 上的MSDTC不可用解决办法
- 自己做量化交易软件(26)小白量化事件回测之MetaTrader5自动回测
- 2567 HDU 寻梦
- 上课笔记、HTML简介
- 如何在Word中优雅地插入代码块,论文、竞赛专用
- 含含乐-口含烟真的能戒烟替烟?
- 开箱即用的百度开放域信息抽取的统一框架UIE
- Mac系统显示已连接(可以打开qq)但是无法打开浏览器解决方案
热门文章
- Qt中undefined reference to报错的三种可能性和解决方法(以libgdal为例)
- 从360、QQ之争看腾讯的无耻
- 社科院与杜兰大学金融管理硕士——在自己的领域努力拼搏,终将遇到专属的光芒
- 美国60所真正著名的大学
- VML实例-拖动效果
- No bootable device
- 循环小数是分数集合吗_无限循环小数都可以化成分数吗
- 有用的函数-系统采集
- IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
- [OpenAirInterface实战-16] :OAI 软件无线电USRP X300/X310硬件详解