Android 崩溃日志添加

线上获取android崩溃日志 线上获取android崩溃日志 一个新的app发布后难免会遇到很多意外的问题,往往在测试的时候不容易测试出来。这里介绍一个组件,腾讯的bugly。 傻瓜式集成,自动捕获崩溃异常并上传至平台上,并且提供基本的错误信息,和app基本信息,也支持自定义日志。 这里只说一下android集成,官网的文档也很详细,照着操作就可以了。 先去bugly官网注册一下账号,创建一个产品。 如果你只想要获取崩溃日志,那么集成SDK就足够了。 dependencies {compile 'com.tencent.bugly:cr 阅读详情

我们的app难免会因为程序上的疏漏而停止运行,有时候提交出去的apk出现停止运行,为了更快的定位问题,我们会加上应用级的异常记录。这里代码记录下。日志主要包括时间和异常的类名字以及错误提示。

以下是定义的异常处理类 继承自Java提供的Thread.UncaughtExceptionHandler(说明:摘自网上, 当某一线程因未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询该线程以获得其 UncaughtExceptionHandler 的线程,并调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。如果某一线程没有明确设置其 UncaughtExceptionHandler,则将它的 ThreadGroup 对象作为其 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有什么特殊要求,那么它可以将调用转发给默认的未捕获异常处理程序)

public class CrashCat implements Thread.UncaughtExceptionHandler {

    private static CrashCat crashCat;
    private Context mContext;
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    private static String DEVICE_INFO="";
    private File path;
    private File fileName;
    private FileOutputStream fileOutputStream;
    private BufferedOutputStream bufferedOutputStream;
    private static String FILE_NAME = "";
    private Intent intent;
    private PackageManager packageManager;
    private PackageInfo packageInfo;

    private CrashCat(Context context, String filePath, String fileName){
        init(context,filePath,fileName);
    }

    public static CrashCat getInstance(Context context, String filePath, String fileName){
        crashCat = new CrashCat(context,filePath,fileName);
        return  crashCat;
    }

    private void init(Context context, String filePath, String fileName){
        this.mContext = context;
        this.FILE_NAME = fileName;
        try {
            packageManager = mContext.getPackageManager();
            packageInfo = packageManager.getPackageInfo(mContext.getPackageName(),0);
            intent = packageManager.getLaunchIntentForPackage(mContext.getPackageName());
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        } catch (Exception e) {
            writeLog(e.toString());
            intent = null;
        }
        path = new File(filePath);
        if (!path.exists()){
            path.mkdirs();
        }
        StringBuffer sb = new StringBuffer();
        sb.append("DeviceID="+ Build.ID+"\n"); //手机型号
        sb.append("AndroidApi="+ Build.VERSION.SDK_INT+"\n");//手机android版本号 数字 如23
        sb.append("AndroidVersion="+ Build.VERSION.RELEASE+"\n");//android版本 如6.0
        sb.append("Brand="+ Build.BRAND+"\n"); //手机商标
        sb.append("ManuFacture="+ Build.MANUFACTURER+"\n");//生产商
        sb.append("Model="+ Build.MODEL+"\n");//型号
        sb.append("PackageName="+mContext.getPackageName()+"\n"); //应用包名
        sb.append("CurrentVersionName="+packageInfo.versionName+"\n");//app版本号
        DEVICE_INFO = sb.toString();
        writeLog("Application Start");
    }

    public void start(){
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    private void writeLog(String log){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        log = "----------"+simpleDateFormat.format(new Date(System.currentTimeMillis())).toString()+"----------"+"\n"+log+"\n";
        try {
            fileName = new File(path+FILE_NAME);
            if (fileName.exists() && fileName.length() > 10485760){
                fileName.delete();
            }
            fileOutputStream = new FileOutputStream(fileName,true);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            bufferedOutputStream.write(log.getBytes());
            bufferedOutputStream.flush();
            fileOutputStream.close();
            bufferedOutputStream.close();
        } catch (Exception e) {
            Log.e("IO Exception",e.toString());
        }
    }

    private void handlerException(String exception) {
        if (exception !=null){
            try{
                writeLog(DEVICE_INFO+exception.toString());
            }finally {
                try{
                    mContext.startActivity(intent);
                    Process.killProcess(Process.myPid());
                    System.exit(1);
                }catch (Exception e){
                    Log.e("App can not restart",e.toString());
                }
            }
        }
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        StackTraceElement[] stackTraceElements = e.getStackTrace();
        StringBuffer sb = new StringBuffer(e.toString()+"\n");
        for (int i=0,size = stackTraceElements.length;i<size;i++){
            sb.append(stackTraceElements[i].toString()+"\n");
        }
        Log.e("error",sb.toString());
        handlerException(sb.toString());
    }
}

接下来我们需要在application中使用这个CrashCat。

public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        CrashCat.getInstance(getApplicationContext(), Environment.getExternalStorageDirectory().getPath()+ ConstValue.DIRECTORY_ROOT,ConstValue.FILE_LOG).start();
    }
}

然后在Manifest中注册这个application
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.wendy.demo.test">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".application.MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.HomeActivity"
                  android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

[原创]使用logcat快速抓取android崩溃日志 在android APP测试过程中会发生不少的crash,目前抓取日志的主流方法是通过eclipse或者eclipse的ddms组件进行捕抓,这两种方法有个缺点是启动时非常耗时。本文通过adb程序与bat命令组合,只要3~5秒即可获取崩溃日志,非常快捷。 一、安装jdkJDK网上教程非常多,此处不再赘述。(好像不装也没关系,未实测) 二、工具列表a)         adb包(v.1.0.31版本... 阅读详情

相关推荐

Unity游戏崩溃日志查询笔记 安卓平台 关于tombstone_00

关于安卓的崩溃日志如何查询的笔记

weixin_43381316的博客 2615

安卓开发,将App异常时的错误信息写入封装的本地日志。

将App异常时的错误信息写入封装的本地日志,你可以通过以下几个步骤来实现1. 创建日志管理类。2. 捕获异常并记录日志。

用作学习记录 752

Android之监控APP崩溃获取日志的方法,Bugly和其他方法

完整的集成步骤请参考光那个文档,

qq_46269365的博客 1044

Android 添加崩溃日志

Android 添加崩溃日志

weixin_50386489的博客 449

Android 动态库崩溃调试方法与编程实例

在Android开发过程中,我们经常会使用动态库(也称为共享库)来扩展应用程序的功能。然而,有时候我们可能会遇到动态库崩溃的情况,这给调试带来了挑战。本文将介绍一些在Android中调试动态库崩溃的方法,并提供相关的编程示例。如果你的动态库是使用C++编写的,你还可以使用异常处理机制来调试崩溃。本文介续了在Android中调试动态库崩溃的方法,包括使用安卓日志、断言和异常处理。Android提供了强大的日志系统,我们可以利用它来调试动态库崩溃。在这个示例中,我们使用了Android的日志宏来输出调试信息。

TechInk的博客 233

Android应用崩溃日志抓取与保存全流程解析

崩溃日志是Android应用在运行过程中出现异常而导致进程终止时,系统自动记录的详细信息。这些信息对于开发者理解应用崩溃的原因至关重要,是进行问题定位和解决的首要依据。自定义异常处理器在Android应用中扮演着重要的角色,它允许开发者以更灵活的方式来处理应用中的异常情况。了解其作用与重要性,并掌握如何在Android中实现它,是每个Android开发者必须掌握的技能。实现自定义异常处理器的基本步骤如下:创建一个实现接口的类。在该类的方法中定义异常发生时的处理逻辑。

weixin_33750664的博客 1342

3. crash分析2 cat |

cat id:000001,sig:11,src:000136,op:arith8,pos:25,val:+15 | /giflib-bugs-74/util/gifsponge docker start shwang docker exec -it --privileged shwang /bin/bash cd giflib-bugs-74/temp/out/crashes/ ls //tab键 查看是不是有core dump /giflib-bugs-74/util/gifsponge id\:00

wwjlovecyndi的博客 329

材料力学小白必看:纯弯曲正应力计算全解析(附实例演示)

本文详细解析了材料力学中纯弯曲正应力的计算原理与工程应用,通过实例演示帮助初学者掌握关键公式和计算流程。内容涵盖纯弯曲的基本假设、正应力分布规律、截面特性计算,以及现代工具如Excel、ANSYS和Python在应力分析中的应用,特别适合材料力学小白系统学习。

sea99的博客 1232

Android Studio生成错误日志方法

Android Studio生成错误日志方法

Douzaikongcheng的博客 3979

AMCL实战:如何用2D激光雷达在ROS中实现稳定重定位(附参数调优指南)

本文深入解析了在ROS中使用2D激光雷达实现稳定AMCL重定位的实战技巧与参数调优指南。针对粒子发散、位姿跳变等常见问题,文章从算法核心原理出发,系统讲解了初始化、粒子滤波、运动与观测模型等关键参数的分类与调优策略,并提供了一套经过验证的调优框架,帮助开发者提升移动机器人在已知地图环境下的定位鲁棒性和稳定性。

sql99的博客 134

python数据处理(一)——如何用python实现excel功能

python如何实现excel的数据提取、指标构建,进行透视分析。

一名数据分析师 2703

android xlog 收录崩溃日志

我整理的一些关于【ide】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnN安卓 XLog 收录崩溃日志的实现 在安卓应用的开发过程中,崩溃日志的收录对于快速定位和修复问题非常重要。本文将指导你如何使用 Android XLog 收录崩溃日志,包括必要的步骤、代码实...

weixin_41309196的博客 375

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

由于Milvus官方文档只提及如何使用docker安装部署Milvus,关于源码安装方式篇幅较少,因此,我整理撰写了如何通过源码编译方式成功安装Milvus,详见此篇。之所以选择这种复杂的安装方式,可以调试源码进而熟悉Milvus如何搭建整个框架支持AI上层应用功能。根据上篇步骤部署虽然可以成功,然而,我却不能成功启动Milvus服务,这个问题困扰了一两天,现在终于得以解决并能成功调试Milvus源码。接下来,分为三个部分介绍如何启动和成功调试。

qq_43893755的博客 3367

安卓崩溃异常捕获类

ycrash,安卓崩溃异常捕获类 源码采用java8.0,安卓10.0,API29,androidx。 当然低版本copy代码过去也能用。 ##当前最新版:————> Gradle 引用 在根build.gradle中添加 allprojects { repositories { ... maven { url 'https://jitpack....

雨季余静的博客 489

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 566

android crash没有日志_Android开发必备神器CrashCanary

阅读本文大概需要8分钟作者:wangsj1992出处:https://www.jianshu.com/p/8676f7a05920前言安卓开发中,你是否遇到过如下困扰:场景一开发好一个功能后提交给测试小姑娘,测试中说“app停止运行”,然后你拿着他的测试机连到自己电脑上,重复操作一下,看看log找崩溃的原因。如果是必现的bug还好,遇到偶现的bug的蛋疼了。场景二可能你的项目中接入了Un...

weixin_39611382的博客 197

结构优化软件:OptiStruct_(11).拓扑优化

在OptiStruct中,设计空间可以通过定义设计区域来实现。设计区域是结构中可以进行材料变化的部分。几何区域:通过几何选择工具选择特定的区域。网格区域:通过网格选择工具选择特定的单元。假设我们有一个简单的梁结构模型,网格文件为beam.fem。我们希望在梁的中部进行拓扑优化,以减轻重量并保持刚度。

kkchenjj的博客 1367

安卓如何获取APP的崩溃日志

安卓APP一旦发生任何报错,就会停止运行,这是令许多开发者头疼的问题, 很多情况下,一些隐性BUG在测试部门通过,而在上架之后发生小面积崩溃,这时候的报错因为没有日志,导致BUG无从查起。 那么,只能通过用户反馈消耗大量的人力和时间去复现它吗? 其实只要在Application中插入一小段代码,就可以把完整的错误日志全部捕捉出来: //记录崩溃信息 f...

不会前端的安卓不是好JAVA工程师 8031

区块链技术概述:从比特币到Web3.0

区块链技术正重塑数字世界的信任机制。本文系统梳理了区块链的发展路径:从比特币的PoW共识和UTXO模型,到以太坊的智能合约和账户体系,直至Web3.0的去中心化互联网愿景。文章详细解析了区块链的核心特性(去中心化、不可篡改等)和数据结构,通过流程图展示了比特币交易生命周期和智能合约执行流程,并对比了Web2.0与Web3.0的关键差异。最后,用Python代码实现了包含区块类、交易处理和挖矿机制的简易区块链系统,为理解区块链底层原理提供了实践参考。

闲人编程的博客 455

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android使用Google Breakpad进行崩溃日志管理

开发过程中,最担心的问题就是程序崩溃,而且还不知道崩溃的原因,现在使用Google Breakpad来跟踪崩溃的位置,非常方便;由于目前使用Mac系统开发,Google Breadpad处理Android崩溃日志时需要Linux环境,借助 vagrant 可以非常方便地在Mac使用Ubuntu环境。 有了vagrant以后就方便了~$ varant ssh $ cd /vagrant $ sudo

Michael丶 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android从零开始:Firebase崩溃报告

如今,有超过十亿人在使用Android设备,并且每天都有成千上万的人加入其中。 确保所有这些人都可以享用您的应用程序并非易事。 Android设备的特性千差万别 。 API级别,屏幕尺寸,像素密度和硬件传感器可用性方面存在差异。 更糟糕的是,硬件供应商广泛地定制了Android,通常会引入一些设备特有的怪癖。 由于有这么多变量在起作用,您的应用可能会在多种设备和几种情况下崩溃。 通过收...

代码教主 2788

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

kivy安卓上报错_Kivy在安卓发布时崩溃

当我在Android手机(三星GSIII)上启动Kivy应用程序时,splash屏幕出现,然后它崩溃并返回到上一个屏幕。在trail和error之后,我确定了一个事实,即我导入的ws4py导致了这个错误。在我在我的buildozer.spec文件在要求requirements = kivy,ws4py下,并且它似乎在运行$>buildozer android debug时正确下载。查看ws4...

weixin_39702400的博客 380

Android崩溃日志获取与解析

今天来写点Android崩溃的东西,在我们写代码的过程中,代码写的再好再严谨,也总是会有一些程序的崩溃,对于release出去的APP,我们肯定是希望我们能够拿到崩溃的日志,便于bug的发现以及修复,在下一个版本中再修复。所以,今天我们来说说Android崩溃日志的抓取。在程序界面有一句话很流行,那就是不要重复造轮子。现在市面上有很多的崩溃日志抓取工具,比如腾讯的bugly,...

weixin_34198583的博客 440

android 放大地图,Android上放大本地磁盘上的地图应用崩溃

1、下载使用supermap-imobile-9.1.1-168-android-zip-chs\SampleCode\SampleCode_ADT\BoundsQuery作为demo。然后加磁盘上的离线地图。手势放大地图(不断放大),特别是在道路密集区域方法。地图崩溃。附上崩溃log:Fatal signal 6 (SIGABRT), code -6 in tid 3465 (Thread-51...

weixin_35651916的博客 215
上一篇: 移动平台青睐的数据库-SQLite
下一篇: Android6.0+ apk下载及安装出现的权限问题
pylduck
博客等级 码龄14年 351粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值