JpAssist:
背景:解决方法替换问题:日志输出替换和SP方案替换
举措: JpAssist 是一个轻量级的 Android 平台字节码编辑插件,基于 Javassist 对字节码操作,
根据 xml 配置处理 class 文件,以达到对 class 文件进行动态修改的效果。和其他 AOP 方案不同,JpAssist 提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,不需要有 Java 字节码的相关知识,只需要在 Xml 插件配置中添加简单的 Java 代码即可实现类似 AOP 的功能,同时不需要引入其他额外的依赖。
1.定义Gradle transform插件,收集配置xml替换信息,根据配置文件扫描所有类,匹配查找到的类进行代码替换。
2.JpAssist 实现了日志输出替换,系统 SharedPreferences 替换,SharedPreferences commit 替换 apply等功能。
3.由于安卓系统 SharedPreferences 自身机制的问题,当使用 SharedPreferences.apply() 方法过于频繁时,出现大量由 QueuedWork.waitToFinish() 造成的卡顿和 ANR,主要原因是系统在 Activity 的 onPause、onStop,以及 Service 的 start 和 stop 生命周期时会执行等待,google本意是在用户离开组件之前确保操作完成写入,保证持久化成功率。
4.对系统 SharedPreferences 进行改造,实现自己的 SharedPreferences。大概的思路:
重写 apply()方法
不往 QueuedWork 里添加 finisher(Runnable),而是开启单线程池去执行,这样QueuedWork 的 finisher 队列为空,就不会在 QueuedWork.waitToFinish() 时产生阻塞,根据这个思路,我们实现了自己的 SharedPreferences 继承系统SharedPreferences达到兼容的目的
通过Chroger编舞者通过FrameDisplayEventReceiver#ScheduleVsync方法注册下一个垂直信号脉冲,当收到垂直信号脉冲时系统会回调onVsync(long timestampNaous, int displayId,int frame),onVsync方法内部会通过handler发送消息,Looper.loop()循环取出消息执行,执行逻辑中判断当前时间戳与onVsync方法参数的timeStamp计算时间差,就可以算出从接收到时间脉冲信号到消息执行的过程中的时间差除以(1帧时间是60ms/60*1000000)就是当前刷新的跳帧数SkipFrames
针对sd卡本地图片(BitmapFacyory.decodeFile),网络图片(decodeStream),资源文件图片(decodeResource)分别实现大图监控
1.针对网络图片使用csdn网络请求图片根据请求参数裁剪图片返回适合view大小的图片
2.在debug测试包中针对decodeFile,decodeStream,decodeResource使用aspctj arround模式拦截上述方法来获取方法返回值bitmap图片,计算bitmap图片大小超过1M抛出异常提示开发者
网友评论