Xcrash V2.5.7框架解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcrash V2.5.7框架解析相关的知识,希望对你有一定的参考价值。

参考技术A

xcrash 是爱奇艺在2019年4月开源在GitHub上的稳定性日志收集框架,它能为android收集java crash、native crash、anr日志。不需要root权限和系统权限。支持 Android 4.0 - 10(API level 14 - 29),支持 armeabi,armeabi-v7a,arm64-v8a,x86 和 x86_64。

xcrash作为门面模式的入口,client调用通过配置InitParameter来进行初始化。Xcrash分别关联三种类型Handler来处理对应的奔溃监听和日志收集,通过FileManager和TombstoneManager对奔溃日志进行tombstone文件管理。client调用TombstoneParser来解析本地生成的对应tombstone文件,获取数据。

Java层的崩溃可以直接交给JVM的崩溃捕获机制去处理。这个非常简单,不赘述。

如果有java crash发生,会回调uncaughtException,执行handleException收集相关log信息

Crash.java

NativeHandler.java

NativeHandler在Xcrash init时会执行initialize方法进行初始化,初始化过程首先通过System.loadLibrary("xcrash”)注册native函数,其次就是调用nativeInit。

执行System.loadLibrary("xcrash”),JNI_OnLoad会被回调,这里是动态注册玩法。

xc_jni.c

数组0元素对应:

java层调用nativeInit,native xc_jni_init会被调用。
接着看nativeInit逻辑
xc_jni.c

先看xc_crash_init

1)设置callback:

xc_crash_init_callback最终回调的是NativeHandler的crashCallback

2)信号注册:

注册的是指针函数:xc_crash_signal_handler,追过去看看:

进入xc_crash_exec_dumper指针函数,看看进程dump操作:

这个部分是做各种数据的dump。简单找下main方法:

xcd_core.c

不细看了,整个过程先是挂起crash进程的所以线程,然后收集相关log,最后resume所有线程。

xc_trace_init部分不分析了,与xc_jni_init分析方法一致。这里也就简单分析了个大脉络。

Native崩溃处理步骤总结:

同样在Xcrash init时初始化

Crash.java

这里有个限制,是sdk <21的版本才抓取。

AnrHandler.java

高版本系统已经没有读取/data/anr/的权限了,因此FileObserver监听/data/anr/的方案只能支持<21的版本,而目前xcrash对>21的版本无法获取anr日志。

然后看看handleAnr收集了哪些数据:

这里重点关注checkProcessAnrState,它是AMS对外暴露的api,从AMS的mLruProcesses中过滤出crash和anr异常的进程,返回对应的错误信息。补充cause reason部分,也就是ANR in。

那么>21版本的anr如何抓取?
//init native crash handler / ANR handler (API level >= 21)
int r = Errno.OK;
if (params.enableNativeCrashHandler || (params.enableAnrHandler && Build.VERSION.SDK_INT >= 21))
r = NativeHandler.getInstance().initialize(...);

是通过nativeHandler来抓的。也就是前面提到的

它是native 注册 SIGNAL_QUIT 信号,ANR发生时接收回调去收集ANR信息。

这里xc_trace_notifier是一个eventfd ,在handler接收信号回调时被写

然后xc_trace_dumper线程会解除阻塞状态开始执行dump任务。

本篇文章简单分析了下xcrash2.5.7源码,结合之前 java crash处理分析 和 native crash 处理分析,对app收集奔溃日志的整个过程有了个全面了解。

web框架之Vue渐进式框架-安装入门简介(python3入门)

1 vue: js渐进式框架
2 优点: 单页面、轻量级、数据驱动、数据双向绑定、虚拟DOM、组件化开发(页面代码的服用)
3 vue实例成员: el(挂载点)、data(数据)、methods(方法)
4 vue指令:v-text(纯文本指令)、v-html(可以解析标签)、v-once(插值表达式渲染文本)、(插值表达式)、v-on(事件指令)、v-bind(属性指令)、v-model(表单指令)、v-if、v-else-if、v-show
    @ 等价 v-on:
    : 等价 v-bind:

 

Django
前后台不分离项目 1 后台渲染页面 2 csrf-token => form post请求 3 render、HTTPResponse、redirect => JSONResponse 4 ajax => 页面局部刷新 前后台分离项目 1 前台页面自己渲染 - 自己搭建运行的服务器 2 ajax完成数据请求 3 drf(django框架) - django rest framework - restful(接口规范协议) 4 vue(js框架)- 数据驱动 学习曲线 1 vue 2 drf 3 路飞

 

Vue框架
什么是vue: 渐进式,javascript框架 前台三大主流框架: vue(轻量级) - 尤雨溪 Angular - facebook React - github 先进的前端设计模式: MVVM - 比MVC分成两部分,比MVC好 可以完全脱离服务器端,以组件化开发。(页面+样式+功能) vue的优点 1 单页面,硬件要求低 2 组件化开发 3 数据驱动 4 数据的双向绑定 5 虚拟DOM 6 轻量级

 

一、vue 环境部署

技术图片
1 安装node http://nodejs.cn/download/ 下一步下一步

2 安装cnpm (由于npm在国外,所以我们换成国内的cnmp源,避免下载安装error) sudo npm install -g cnpm --registry=https://registry.npm.taobao.org 只要不是error 就说明安装成功

3 安装vue脚手架 sudo cnpm install -g @vue/cli

4 清空缓存处理 如果第3步安装失败,则运行下 npm cache clean --force ,然后再重新运行第3步命令
vue环境部署

 

二、vue项目创建

技术图片
    - Manually select feature
    - Check the features needed for your project
        1 Babel 将es6语法转换成es5的语法,让浏览器更好的识别
        2 Router    前端路由
        3 Vuex  仓库,组件与组件之间数据交互
        4 Linter/Formatter  
        
    - Use history mode for router? 
        由于vue页面只有一个页面,为了能后退 前进,形成历史记录(window history),所以这里选Y
    - pick a linter/ formatter config
        Basic
    - pick additional lint feature
        Line on save
    - where do you prefer placing config for Babel, CSS etc?
        in decicated config files
    - save this as a preset for future projects?
        N
    
    - cnpm run serve
1. vue create [自定义vue项目名称]
技术图片
    - 如果迁移到一个没有vue环境的项目中,需要将除了node_modules 这个文件夹以外的所有均copy到新文件夹中,
        然后执行 cnpm install 重建依赖关系
2. 项目迁移重建
技术图片
    - edit configuration
    - 填写Name(自定义)
    - packageJson:(选择到需要打开的vue项目路径中的package.json)
    - command:(run)
    - script:(serve)
    - node interpreter:(选择到node环境)
    - package manager:(选择到npm环境)
    
    - 打开pycharm的setting- Plugins- 搜索vue- install vue.js
    - restart pycharm
    - 完成!
3. 将vue项目在pycharm中打开

 

三、vue目录介绍

技术图片
- node_modules: 项目依赖
- 
- public:公用文件
    favicon.ico:页面标签图标
    index: 项目的唯一页面

- src: 项目开发文件目录
    assets: 静态资源
       css|img
    components: 小组件(*.vue)
    views: 视图组件(*.vue)
    app.vue: 根组件
    main.js: 主脚本文件
    router.js: 路由脚本文件 - vue-router
    store.js: 仓库脚本文件 - vuex

- *.xml|json|js: 一系列配置文件
- README.md:使用说明
View Code
技术图片
    import Vue from ‘vue‘   //node_modules下的依赖直接写了名字
    import App from ‘./App.vue‘ // ./代表相对路径的当前目录,文件后缀名可以省略
    import router from ‘./router‘   //@代表src目录的绝对路径
    import store from ‘./store‘
    // 在main中配置的信息就是给整个项目配置
    // 已配置vue | 根组件App | 路由 | 仓库
    // 以后还可以配Cookie | ajax(axios) | element-ui
    
    
    
    // Tips小提示
    Vue.config.productionTip = false
    
    new Vue(
      router,
      store,
      render: h => h(App)
      // 下面两组结果也是正解
      // render: readTemplateFn => readTemplateFn(App)
      // 原生的如下:
      // render: function (fn)
      //     return fn(App)
      // 
    ).$mount(‘#app‘)   //$mount = el:‘#App‘
main.js简介

 

以上是关于Xcrash V2.5.7框架解析的主要内容,如果未能解决你的问题,请参考以下文章

VideoToolbox框架详细解析(一) —— 基本概览

如何解析JSON使用Play框架

Speech框架详细解析(一) —— 基本概览

ThinkPHP框架系统源码解析——URL路由解析

Core Audio框架详细解析(二) —— 基于CoreAudio的ios音频服务总结分析

iOS开发之网络数据解析--GDataXML解析框架的使用