ASM - 字节码操作库 ASM 是一款广为使用的字节码操作库,很多 Gradle Transform 会用它对编译后的代码进行插桩和修改操作,源码仓库在 GitLab 访问者模式(Visitor pattern) Visitor pattern represent an operation to be performed on the elements of an object structure. Visitor le 2022-04-07 #asm #字节码 #插桩
排查 Launcher AppStore 静默安装 App 失败的问题 Launcher 里的 AppStore 模块会根据服务端的配置安装/卸载 APP,当然用户也可以手动安装 AppStore 里的 APP 某天收到反馈,一个要上线的 APP【食材管理】静默安装总是失败,以往都是正常的 静默安装是指 AppStore 自动在后台安装,无须用户手动点击安装 静默安装是通过广播 android.intent.action.SILENCE_INSTALL 实现的,由 2022-03-14 #case #案例 #源码
【转】今日头条 ANR 优化实践系列(5)- 告别 SharedPreference 等待 简述前面系列文章(详见文末)中介绍了安卓系统 ANR 设计原理以及我们在实际工作中对 ANR 进行监控得到的方案,基于常规的监控治理方案,ANR 问题得到了有效的抑制,但是有些系统组件的设计初衷与开发人员在实际使用过程中实际使用的背离,导致的冲突问题亟待解决,当前文章针对实际开发过程中滥用 sp 导致的 ANR 问题,如何从系统层面跳过 Google 设计缺陷,规避 ANR 问题。 Google 2022-02-16 #ANR #bytedance #toutiao #字节 #头条
【转】今日头条 ANR 优化实践系列(4)- Barrier 导致主线程假死 简述:前文,我们通过线上案例对影响 ANR 问题的六大场景进行剖析,这几类场景基本覆盖了线上大部分问题,详见 ANR 案例分析集锦。同时我们选取了较多 NativePollOnce 场景的案例,便于大家更好理解,ANR 时看到的 NativePollOnce 场景的问题,并不是导致 ANR 的根本问题。 下面要介绍的这类问题,Trace 现场依然是 NativePollOnce 信息,但与前几类问 2022-02-16 #ANR #bytedance #toutiao #字节 #头条
【转】今日头条 ANR 优化实践系列(3)- 实例剖析集锦 简述:在前文,我们用了较多的篇幅介绍了 ANR 设计原理及影响因素,并根据不同场景进行了分类,如:当前消息严重耗时,历史消息耗时严重,业务异常密集执行,进程内资源抢占,进程间资源抢占等场景。为了应对系统监控能力不足以及应用侧获取信息受限的情况,我们在应用侧实现了一套 消息调度监控工具,重点监控主线程的“过去,现在和将来”,同时结合相关日志对 ANR 问题的分析思路进行了总结。 为了便于大家更好的理 2022-02-16 #ANR #bytedance #toutiao #字节 #头条
【转】今日头条 ANR 优化实践系列(2)- 监控工具与分析思路 前言:在前文,我们对 ANR 设计原理及影响因素 进行了介绍,并对影响 ANR 的不同场景进行归类。但是依靠现有的系统日志,不足以完成复杂场景的问题归因,而且有些信息从应用侧无法获取,这就导致很多线上问题更加棘手;因此我们在应用侧探索了新的监控能力,以弥补信息获取不足的短板。同时对日常分析过程中用到日志信息和分析思路进行总结,以帮忙大家更好的掌握分析技巧,下面我们就来看看相关实现。 Raster 2022-02-16 #ANR #bytedance #toutiao #字节 #头条
【转】今日头条 ANR 优化实践系列(1)- 设计原理及影响因素 写在前面ANR 问题,对于从事 Android 开发的同学来说并不陌生,日常开发中,经常会遇到应用乃至系统层面引起的各种问题,很多时候因为不了解其运行原理,在面对该类问题时可能会一头雾水。与此同时,因为现有监控能力不足或获取信息有限,使得这类问题如同镜中花水中月,让我们在追求真理的道路上举步维艰。如下图: 工作中在帮助大家分析问题时,发现有不少同学问到,在哪里可以更加系统的学习?于是本人抱着“授 2022-02-16 #ANR #bytedance #toutiao #字节 #头条
ANR 设计思路:埋雷和除雷 埋雷 和 除雷 是 Android 设计 ANR 时的一个重要思路,ANR 的实质是超时,那么只需要在执行前埋下延迟爆炸的雷,如果在规定时间内执行完毕则把雷移除,否则到点雷爆炸抛出 ANR 下面以 startService 为例: startService 时记录下当前时间,并埋下延时任务 sendMessageDelayed bindService 表示启动完毕,移除上面埋下的雷 SERVIC 2022-02-14 #ANR
初识 Fresco 第一行代码Fresco 最简单和入门级的 API 是 SimpleDraweeView.setImageURI(uri),那就先从这个方法走下去看看会遇到哪些概念 SimpleDraweeView.setImageURI(uri) SimpleDraweeView.setImageURI(uri, null) DraweeView.setController DraweeHolder.setCon 2021-12-22 #glide #fresco #imageloader #图片加载
HTTP Range - 分段下载 request headerRange: <unit>=<range-start>- Range: <unit>=<range-start>-<range-end> Range: <unit>=<range-start>-<range-end>, <range-start>-<rang 2021-12-16 #http #range #content-range