线上APM
本文链接:https://blog.csdn.net/feather_wch/article/details/131692498
基本概念
1、APM是什么?
- Application Performance Monitor
2、内存监控方案
- 手动GC:Matrix
- 阈值处理:KOOM
3、FPS监控方案
- Handler机制(Looper Printer接口)- 看消息处理速度
- IdleHandler(延迟操作)- 无事可做时,可以做FPS监控
- ANR监控 -
- 掉帧监控
4、IdleHandler有什么用?
- 适合延迟操作
Looper.myQueue().addIdleHandler(new Message,IdleHandler){
queueIdle()
return true: 可以不断执行
return false: 只执行一次
}
5、 Glide展示Gif时,IdleHandler就是失效
FPS监控
6、FPS代码写在哪儿?
- onResume
7、FPS两种方案,区别是什么?
- Handler:消息监听,效果很好。没有性能问题。
- 编舞者:不断执行会掉帧,doFrame,线上影响性能
8、要看到每个方法的耗时
- hack手段:每个方法经过dalivk或者art的某个函数,不需要修改字节码。存在兼容性和安全性问题。
- 字节码插装,编译期间修改所有class文件中函数字节码,对所有函数前后打点插装
9、rabit-client;fps的不适合用了
- 安卓11前 编舞者 mlock对象可以获取到fps指标。安卓十一反射被禁止,没办法使用。
10、FPS高 60帧/s 能代表不卡吗?
- FPS看平均,如果某一段时间集中掉帧,就会卡
11、如何计算开机到Activity首帧的时间?
- CP打发
- contentprovider中算时间,acrivity onWindowFovusChanged中算时间。
- 之间就是加载的时间。
内存泄漏
1、内存泄漏方案分两种
- Leakcanary主动gc:影响性能
- KOOM一套
以后学习内容
1、Tinker的so加载原理/流程 => dex加到数组前面
2、【时序数据库】
3、http dns
面试
1、讲到so,就要讲兼容性问题,写了一套自己的动态加载库(ReLink),讲原理和思路
2、错误日志,动态上传
- WorkManager
- 压缩,加密。
ReLinker集成和使用
1、so动态加载库 KeepSafe/ReLinker
- 解决什么问题?
- 解决so加载异常问题。UnsatisfiedLinkError(so没找到对应的库)
- 帮助重新link
- 优点:找so时,日志会回调出来。
2、UnsatisfiedLinkError
- so没找到对应的库
- 原因:兼容问题
- 向上是兼容的,向下是不兼容的。
3、厂商魔改ROM改的是什么?
- so加载的路径
4、so加载的路径有哪些?(三种)
5、ApplicationInfo
- nativeLibraryDir
- secondaryNativeLibraryDir - 备用目录,国内环境被改掉了
6、Relink原理
- 模拟su:需要root权限
- 删除so路径,杀死进程
- 出现UnsatisfiedLinkError异常
7、elf是什么?
- 动态链接库,so做成二进制
8、Relink核心技术点
- 解析so二进制文件,获取so依赖属性
- 解决了依赖问题:
- 6.0以下存在so依赖,1个so依赖其他3个so。加载顺序固定;
- 7.0以上自动做