过去一周 Android 相关的技术文章精选,以及过去一周发现的经典文章
ASM 字节码插桩:进行线程整治[1]:京东零售技术 发表的一篇文章:AOP 技术在 APP 开发中的多场景实践 ,文章中介绍了 AOP 技术的一种使用场景:线程使用数优化。看完之后感觉挺有实践意义的,但文章中并没有给出具体的实现代码,所以我就做了一次实操,基本实现了文章中介绍的效果,本文就来详细介绍下我的实现始末,并给出具体的实现代码。
从 Hprof 源码初探虚拟机内存管理[2]:内存快照 hprof 格式是什么样子的呢?GcRoot 是什么以及怎么找到这些对象?我们 Java 创建的对象是如何管理的呢?
一文读懂 Android FFmpeg 视频解码过程与实战分析:本文首先以 FFmpeg 视频解码为主题,主要介绍了 FFmpeg 进行解码视频时的主要流程、基本原理;其次,文章还讲述了与 FFmpeg 视频解码有关的简单应用,包括如何在原有的 FFmpeg 视频解码的基础上按照一定时间轴顺序播放视频、如何在播放视频时加入 seek 的逻辑;除此之外,文章重点介绍了解码视频时可能容易遗漏的细节,最后是简单地阐述了下如何封装一个具有基本的视频解码功能的 VideoDecoder
我写了款依赖检查的工具:写这款工具主要是看了优酷的几篇 向工程腐化开炮 的系列文章,觉得其中的几个点可以通过依赖检查的方式提前找到问题,所以着手找了几个点写了下,并输出 report html 方便查看。目前该检查工具提供了 5 项内容的检查:
so 文件检查
64 位 so 未适配检查
更安全的导出组件检查
未匹配的权限检查
uses-sdk 检查
JankStats 推出 alpha 版本: 在实际情况中,我们很难发现应用中可能存在的问题,尤其是用户设备上可能出现的问题。这可不是您坐在座椅中用着熟悉的开发机器能碰到的问题。虽说性能信息中心可提供一定帮助,但在用户遇到问题时,它却未必能让您充分了解所发生情况的详细信息。JankStats 应运而生: 这是首个专为在用户设备上检测及报告应用的性能问题而构建的 AndroidX 库。JankStats 是占用空间相对较小的 API,主要有三大目标: 捕获每帧的性能信息、在用户设备 (不仅是开发设备) 上运行、以及在应用出现性能问题时启用检测,并报告所发生的情况。
向工程腐化开炮|动态链接库 so 治理:在 Android 技术领域,动态链接库 so 一般使用 c/c++开发,近年随着 rust 的“闪耀“,无论在 aosp 系统功能层面,还是 app 应用功能层面,都能看到其身影。但无论使用的开发语言是什么,最终在 apk 和运行时的存在形式,都是符合 ELF 格式的 so 文件。本文聚焦于动态链接库 so 本身,对 abi 不兼容、重复、冲突、无用导出符号,这几种腐化情况,进行工具研发以及治理实践。
sysctl 参数防篡改 - 基于传统方法的实现:在以 docker 为代表的容器环境中,通常需要在 host 上将 "net.ipv4.ip_forward" 内核参数设置为 1,以便实现流量转发。某些情况下,这个 sysctl 参数可能被其他业务进程有意或无意地修改为 0(当然也有可能是用户的误操作),导致容器的网络连接断开。
通过 ASM 实现大图监控[3]:最近看滴滴开源的 Dokit 框架中有一个大图监控的功能,可以对图片的文件大小和所占用的内存大小设置一个阈值,当图片超过该值的时候进行提示。这个功能对于我们在做 APK 体积压缩,内存管理的时候还是很有用的,比如当我们要从后台返回的连接中加载一张图片,这张图片的大小我们是不知道的,虽然现在大家都使用 Glide 等三方 图片加载框架,框架会自动对图片进行压缩,但是依然会出现压缩后所占内存超过预期的情况。这时候我们可以在开发、测试和预生产阶段使用大图监控来识别出那些超标的图片。
引用还是传值——被打脸后才发现多年的理解是错的[4]:这是一个很基础的问题,如果你已经理解透彻了,其实可以不需要往下看(如果理解没错的话),因为相信你已经知道了答案,本篇主要是解释给和我一样一直以来有这样误解的人,事实上这是一个简单的问题,「之所以会陷入这个误区,主要还是因为习惯了高级语言后,特别是屏蔽了指针感知后,多年来“口口相传”导致的误解」。
通过基准配置文件改善应用性能:本文我们将讨论基准配置文件和其改善应用和开发库性能的方式,包括它们如何将启动时间缩短了最高 40%。虽然本文侧重于应用启动,但是基准配置文件也可以极大改善卡顿情况。
Compose 的 State 状态到底是个啥?:总结:
Compose 为了实现解耦将界面和数据分离开来,分别称之为 组合 与 State 状态。为了达到状态改变自动重组界面的目的,引入了 MutableState 来存储 State 状态的容器
MutableState 的 value 一旦改变,所有引用它的 Composable 组件都会重组,从而保证了数据与显示的一致性。此外,为了保证每次重组时 State 状态不会被初始化为初值,Compose 引入 remember 关键字来将数据存储在相应的 Composable 组件中。
remember 关键字是根据传入的键是否改变来返回相应的值。键改变了则返回初值;键未变则返回上次存储的值。不设置键,则默认键始终不变,即始终取上次的值。
为了解决 remember 关键字不能在 Activity 重建等场景下保存数据而引入了 rememberSaveable、MapSaver、ListSaver 等状态保存及恢复的方法。
Compose 把 Composable 组件分为有状态与无状态两类,内部含有 State 状态的就为有状态可组合项;反之则为无状态组合项。无状态组合项复用性更高,而有状态组合项可以自己管理 State 状态。通过状态提升可以将有状态组合项转化为无状态组合项。
Compose 推荐使用 ViewModel 来管理状态,包括状态的更新以及存储等。
工厂模式家族 | Flutter 设计模式:在围绕设计模式的话题中,工厂这个词频繁出现,从 简单工厂 模式到 工厂方法 模式,再到 抽象工厂 模式。工厂名称含义是制造产品的工业场所,应用在面向对象中,顺理成章地成为了比较典型的创建型模式。从形式上讲,工厂可以是一个返回我们想要对象的一个方法 / 函数,即可以作为构造函数的一种抽象。本文将会带领大家使用 Dart 理解它们的各自的实现和它们之间的关系。
第三视角: 一个 ART GC 的优化故事[5]:搞过整机性能优化的同事,在实际项目上相信都遇到过 GC 引起的性能问题。有了上一篇文章
GC 超时导致的后台应用崩溃问题分析[6]:这个问题之所以会拿出来仔细分析,一方面是因为这个问题不是简单的应用崩溃而是框架层的报错,另一方面是因为希望通过这个问题梳理下后台 GC 的超时检测机制怎样的,这样我们后面在应用层如果重写 finalize 方法回收时会考虑的更加全面点。
我们为什么选择了 Flutter Desktop | 开发者说·DTalk:我们计划研发一款全功能跨平台的音乐制作平台 (DAW),从立项之初我们就已经明确了全平台的支持计划 (即 Windows / MacOS / Linux / iOS / Android),也因此我们也是以这个为目标来寻找技术解决方案,经过一段时间的研究与学习,大致确定了几个可选项,内部的调研结果如下 (本结果仅代表团队内部认知,如有差异还请包涵):
设计模式二三事:设计模式是众多软件开发人员经过长时间的试错和应用总结出来的,解决特定问题的一系列方案。现行的部分教材在介绍设计模式时,有些会因为案例脱离实际应用场景而令人费解,有些又会因为场景简单而显得有些小题大做。本文会根据在美团金融服务平台设计开发时的经验,结合实际的案例,并采用“师生对话”这种相对诙谐的形式去讲解几类常用设计模式的应用。希望能对想提升系统设计能力的同学有所帮助或启发。
mkdir android-kernel && cd android-kernel[7]:本页详细介绍了为 Android 设备构建自定义内核的流程。以下说明会逐步指导您如何选择正确的源代码,构建内核,以及将结果嵌入到根据 Android 开源项目 (AOSP) 构建的系统映像中。
Devfreq Bus Dcvs:计算机的世界里,CPU 任务分为 CPU bound 和 IO bound。而实际场景下往往是两者混合型任务。针对性能的优化,普遍关注点都在 CPU 上(不论是 CPU 的频点和 CPU 的选核), 往往忽略对 IO bound 的任务的优化。而 DDR 作为 SOC 芯片代码运行空间和数据缓存空间,在不同应用状态下,SOC 对 DDR 访问的带宽需求不一样。譬如听音乐时访问带宽需求较小,此时 DDR 工作在较低的频率,而通过网络信号观看高清视频时,则对带宽需求较大。DDR 则需要提高工作频率。由此可见,SOC 需要根据系统的运行情况动态调整 DDR 的总线工作频,以提高 CPU 工作效率,并降低系统在运行状态的功耗,达到性能功耗的平衡。
iOS 高刷屏监控 + 优化:从理论到实践全面解析
Apple 在今年推出了支持 ProMotion 屏幕的 iPhone 设备,让 App 在 iPhone 13 Pro 和 iPhone 13 Pro Max 上的最大刷新帧率可到达 120Hz,极大优化了应用滑动/动画的流畅度体验。
ProMotion 并不是一个新的概念,早在 2017 年,Apple 推出的第二代 iPad Pro 便搭载了这一刷新率最高可达 120Hz 的屏幕。在 iPad 上,高刷新率默认对所有 App 启用。而也许是出于能耗的考虑,在 iPhone 上,Apple 并未将这个能力自动对所有 App 启用,而是需要开发者手动添加配置项来进行适配。
本文介绍了在 iPhone 上对 ProMotion 动态帧率的适配时观察到的现象和遇到的问题,尝试推测了背后的原理,并探讨了解决问题的可能思路,最终基于调研结果在国际化短视频业务上线优化方案,取得了核心业务指标的收益。
别羡慕苹果的小部件了,Android 也有!| 开发者说·DTalk:Google 这次在 Android 12 中对小部件更新很大,可以具体看看有哪些改变
三思系列:View 体系认知(一),内容是如何正确被展现出来的--视觉呈现概览[8]:这是 View 体系认知子系列的第一篇,这一篇会探知 Android 中,是通过怎么的设计 让视图正确呈现在屏幕上的。
基于 eBPF 的 CPU 利用率精准计算小工具开发:玉哲分享的使用 eBPF 技术编写小工具,穿越内核态和用户态,涉及很多知识,把这些知识揉碎后重新进行了排列组合,估计你读三遍后有所领悟,希望你依次受启发,激活自己,从而做出自己的一些有意思的工具
C++ 相关
C++17 常用新特性
C++17 常用新特性(一)---带初始化的 if 和 switch 语句
C++17 常用新特性(二)---内联变量
C++17 常用新特性(三)---结构化绑定
过去一周个人阅读和收藏的非技术文章精选,扩展 Android 之外的知识和视野,不要给自己设限
如何在一个全新的领域展开学习[9]:我在之前的文章中提到过,学习计算机最重要的点在于关注能力的成长——其实这个观察对很多领域都是成立的。而所有能力中最重要的,莫过于学习的能力。从这个角度上说,学习能力是培养其他能力的元能力。这样的元能力还包括解决问题的能力、沟通的能力、领导的能力等等。我自认为在后面的几个方面还有很大提升的空间,但对于学习这件事情来说,应该是有一些粗浅的见解的,因此写一篇文章和大家分享,但求抛砖引玉。
导航的末日,汽车的未来?:本文是我对导航和汽车行业的深度思考,涉及到导航工作原理、地图大厂的发展困境、和智能汽车给出行带来的变革。 干货和行业内幕齐飞,建议收藏。
数字工具使用的四项基本原则[10]:过去两年的时间,疫情反复带来的恐慌、不确定性还在持续影响你我的生活与工作。这些年,我们通过制造、使用新的数字工具对抗这种影响,维持人类生存之外的种种发展可能,各式各样的数字工具也在继续塑造你我的心智与行为模式,它/他/她们既可能是我们工作生活的「亲密伙伴」,帮助我们高效处理工作与生活中的所有事情,同时也可能是精心伪装的「魔鬼梅菲斯特」,利用上瘾、信息误导,引诱你我交出自己的「灵魂」。接下来,我会跳出工具指南的范畴,从宏观视角勾勒出数字工具使用的一般性原则
Why do people argue?[11] : 网上有一则备忘录说:"与工程师争论很像在泥地里与猪搏斗;几个小时后,你会发现猪喜欢这样。" 在我们的领域,这是一种足够普遍的交流方式,我们大多数人都能想到我们最近的一次争论,Vim vs Emacs。测试驱动的开发与任何与测试驱动的开发相反的东西。Python 与 Ruby。JK,这完全不是一场辩论。Python 显然在各方面都更胜一筹。作为解决问题的工具,争论是伤害工程团队多样性的一个大问题。
6 万+字,162 页,《笨方法文化手册 3.0》发布[12]
面对贪快之人,便说笨方法是踏实的脚步
面对懒惰之人,便说笨方法是磨练的驱动
面对蒙昧之人,便说笨方法是科学的探索
面对畏惧之人,便说笨方法是行动的勇敢
Seeking the Productive Life: Some Details of My Personal Infrastructure[13]: 我可以谈谈我是如何领导我的生活的,以及我是如何在做领导、做创造性的工作、与人交流以及做让我学习的事情之间取得平衡的。我可以谈一谈我如何努力安排事情,使我已经建立的东西不会让我忙得无法开始新的事情。但是,我在这里要关注的是我更实用的个人基础设施:帮助我更好地生活和工作的技术和其他东西,让我感到不那么忙,并且每天都有更多的收获。
Android Weekly-509[14]
Kotlin Weekly #293[15]
onCreate Digest - Issue #99[16]
NEWSLETTER #96[17]
NEWSLETTER #97[18]
软件测试周刊(第 62 期):无论你处于什么状态,你都要明白,生活的目标是健康和快乐
周刊(第 8 期):技术配图的一些心得
本周推荐的书是:疯狂的程序员[19],一本本人看了好几遍的书,很励志,打鸡血专用
本书描写了绝影等程序员的成长之路,分为大学、工作、创业三部分。作者笔下以绝影、BOSS liu、Bug Yang 等为代表的程序员是大多程序员成长的真实写照,很多网友看过小说之后都说“这些事好像就是我身上发生的事情,但是我写不出来,绝影写出来了”。
作者:绝影,自认为是一个普通得再普通不过的程序员,技术上算不上大牛,也不是小菜,和大部分程序员一样,每天最多的时间还是对着电脑捣鼓着程序,或因为一个问题不能解决而绞尽脑汁苦苦思索,或因为有了点小小的成果而沾沾自喜兴奋异常。工作的时候,不因为赚多少钱快乐,而因为写程序员快乐。总之自我感觉良好,但朋友评价:不懂生活。唯一与大家有一点点区别也许是:绝影有时候也把自己的生活写下来,时间长了,写得多了,就成了《疯狂的程序员》。
京东链接:https://item.jd.com/10138946.html
本次推荐的工具是 Mac 上的一个软件:Moment,记录一些有意义的事情,每次发群里都有人问,索性分享给大家,有 Mac 的可以考虑考虑
也可以看到,公众号(Android Performance)和 个人博客[20] 维护的时间还是蛮久的,到现在还没有断更,这里就要多谢各位读者的支持,非常感谢
付费知识星球简介 https://www.androidperformance.com/2022/03/13/the-performance/[21]
付费知识星球本周内容更新
图形显示 - Android 图形显示系统之概述[22]
卡顿专题 - 界面卡顿类性能问题的套路与流程[23]
工具专题 - 介绍 Windows 下配置 Systrace 的方法[24]
由于微信外链限制,很多文章链接都无法直接访问,推荐大家订阅 NewsLetter 来获得更好的阅读体验,或者访问网页端或者知乎专栏,或者点击原文直接网页版
NewsLetter 订阅地址:https://androidweekly.zhubai.love/
本文 NewsLetter 地址:https://androidweekly.zhubai.love/posts/2115524425435910144
本文知乎地址:https://zhuanlan.zhihu.com/p/481592795
[1]
ASM 字节码插桩:进行线程整治: https://juejin.cn/post/7044339202997092383
[2]从 Hprof 源码初探虚拟机内存管理: https://juejin.cn/post/7072044070603849758
[3]通过 ASM 实现大图监控: https://juejin.cn/post/6844904136266219534
[4]引用还是传值——被打脸后才发现多年的理解是错的: https://zhuanlan.zhihu.com/p/476718988?utm_source=wechat_session&utm_medium=social&utm_oi=27871238160384
[5]第三视角: 一个 ART GC 的优化故事: http://lihaizhou.top/2021/11/01/%E7%AC%AC%E4%B8%89%E8%A7%86%E8%A7%92-%E4%B8%80%E4%B8%AAART-GC%E7%9A%84%E4%BC%98%E5%8C%96%E6%95%85%E4%BA%8B/
[6]GC 超时导致的后台应用崩溃问题分析: http://lihaizhou.top/2021/09/08/GC%E8%B6%85%E6%97%B6%E5%AF%BC%E8%87%B4%E7%9A%84%E5%90%8E%E5%8F%B0%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E9%97%AE%E9%A2%98%E5%88%86%E6%9E%90/
[7]mkdir android-kernel && cd android-kernel: https://source.android.google.cn/setup/build/building-kernels?hl=zh_cn
[8]三思系列:View 体系认知(一),内容是如何正确被展现出来的--视觉呈现概览: https://juejin.cn/post/6931630027553374221
[9]如何在一个全新的领域展开学习: https://ichn.xyz/blog/how-to-start-learning-in-a-new-area
[10]数字工具使用的四项基本原则: https://iois.me/archives/13352.html
[11]Why do people argue?: https://www.kateheddleston.com/blog/argument-cultures-and-unregulated-aggression
[12]6 万+字,162 页,《笨方法文化手册 3.0》发布: http://newsletter.hardwaylab.com/issues/6-162-3-0-1073726?via=twitter-card&client=DesktopWeb&element=issue-card
[13]Seeking the Productive Life: Some Details of My Personal Infrastructure: https://writings.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/
[14]Android Weekly-509: https://androidweekly.net/issues/issue-509
[15]Kotlin Weekly #293: https://mailchi.mp/kotlinweekly/kotlin-weekly-293
[16]onCreate Digest - Issue #99: https://www.oncreatedigest.com/issues/oncreate-digest-issue-99-1067849
[17]NEWSLETTER #96: https://dormoshe.io/newsletters/ag/android/96
[18]NEWSLETTER #97: https://dormoshe.io/newsletters/ag/android/97
[19]疯狂的程序员: https://book.douban.com/subject/3267945/
[20]个人博客: https://androidperformance.com/
[21]付费知识星球简介 https://www.androidperformance.com/2022/03/13/the-performance/: https://www.androidperformance.com/2022/03/13/the-performance/
[22]图形显示 - Android 图形显示系统之概述: https://t.zsxq.com/qjQJybQ
[23]卡顿专题 - 界面卡顿类性能问题的套路与流程: https://t.zsxq.com/rRNnYVn
[24]工具专题 - 介绍 Windows 下配置 Systrace 的方法: https://t.zsxq.com/n2bE6Ie