Xcrash V2.5.7框架解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcrash V2.5.7框架解析相关的知识,希望对你有一定的参考价值。
参考技术Axcrash 是爱奇艺在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项目创建
- 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
- 如果迁移到一个没有vue环境的项目中,需要将除了node_modules 这个文件夹以外的所有均copy到新文件夹中,
然后执行 cnpm install 重建依赖关系
- 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
- 完成!
三、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:使用说明
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‘
以上是关于Xcrash V2.5.7框架解析的主要内容,如果未能解决你的问题,请参考以下文章