Tips : 由于微信外链限制,很多文章链接都无法直接访问,推荐大家订阅 NewsLetter 来获得更好的阅读体验,或者访问网页端或者知乎专栏 (点击原文即可)
过去一周 Android 相关的技术文章精选,以及过去一周发现的经典文章
分享不停,踏浪前行 | 开发者说·DTalk 年中鉴赏 - Android 篇 : 时光荏苒,悄然过半。在 2022 上半年,开发者与我们共同见证了 Android 13 抵达平台稳定性里程碑;Android 隐私沙盒为改善用户隐私提供了一条清晰的路径;Android Studio Chipmunk 和 Jetpack Compose 稳定版的发布;零基础入门 Jetpack Compose 中文课程的到来。还在 Google I/O 大会中一起感受了技术的更新与迭代,隐私与数据安全的不断提升。本期我们将带您回顾 2022 上半年最受欢迎的 DTalk 分享文章与视频内容
分享不同,精彩纷呈 | 开发者说·DTalk 年中鉴赏 - Flutter 篇 : 时光荏苒,悄然过半。在 2022 上半年,我们迎接了 Flutter 3,成功通往了 Dart 2.17,抵达了 Android 13 平台稳定性里程碑,同时也见证了 Chrome OS 的第 100 个稳定版本,Android 隐私沙盒为改善用户隐私提供了一条清晰的路径,Android Studio Chipmunk 和 Jetpack Compose 稳定版的到来。还在 Google I/O 大会中一起感受了技术的更新与迭代,隐私与数据安全的不断提升。本期我们将带您回顾 2022 上半年 Flutter 最受欢迎的文章与视频作品
手机平台上的用户空间锁概述 : 作为一个长期工作在内核的工程师,本无意去窥探上层锁机制的秘密。然而实际工作中你就会发现,无论是内核锁还是用户空间锁,其基本原理都是一样的。这样,所有在内核锁上的优化其实都可以平移到用户空间,实现“一鱼两吃”,也是美事一桩。不过,手机平台上,上层代码是 Java 或者 C++语言写的,作为 c 程序员,对 Java 和 C++都几乎是一无所知,在探索上层锁的过程中也是“滴滴血泪”,不足为外人道也。鉴于此,本文难免会有错误,希望读者见谅并指出,不胜感激。
如何将一个算法模型转换成端智能模型? : 在开始端智能技术工程实践的介绍前,有一个无法绕过的问题:端上的计算能力到底如何?虽然我们对神经网络运算加速有所耳闻,也知道不同的移动设备有着不同的加速方案,但没有一个定量的分析很难让我们有一个清晰客观的认识。于是,我针对机器学习的 Helloword 项目 Mnist 手写数字识别,做了一个小实验,分别在我的 MacBook Pro 和 iPhone 手机上运行了同样的算法模型,把两侧的训练样本、模型结构、模型参数、训练参数等对齐,最终得出图 1 的结果:面对 60000 个训练样本 10 个 Epoch 在 i7 CPU 的 2015 款 15 寸 MacBook Pro 上需要 128 秒,而在我的 iPhone 13 Pro Max 上只需要 86 秒,这足以证明端上计算能力能够满足我们使用模型进行预测乃至训练模型的计算能力要求。
Hummer 引擎优化系列 - 内存稳定性研究与优化 : 涉猎 Flutter 引擎优化一段时间后,我们对 Flutter 引擎的内存占用有了一个粗略认识,在保持谨慎审视的基础上怀有对未来的乐观期冀。再时隔一年,Hummer 经历了一些内存治理和优化的实施,我们也得到了一些阶段性的成果,因此需要重新对之前的一些认识和实践盘点一下。
Making Sense of Intent Filters in Android 13 : 在 Android 13 之前,当一个应用程序在其清单中注册了一个 export 的组件并添加了一个 intent-filter ,该组件可以被任何明确的意图启动--即使是那些不符合意图过滤器的意图。在某些情况下,这可能会允许其他应用程序触发仅有的内部功能。
这种行为在安卓 13 中得到了更新。现在,指定行动并来自外部应用程序的意图将被传递给导出的组件,如果且仅当该意图符合其声明的 intent-filter 元素。
检测车机中 ADB 远程调试控制 Android 系统攻击 : 我们常说的 adb,也称为 Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。
货拉拉 Android 动态资源管理系统原理与实践(上) :
随着公司业务的扩展,货拉拉用户端 apk 包的体积也不断变大,过去一年,用户端 android 组进行了大量的瘦身工作,取得了较为显著的成果。再使用常规方法,已经很难优化包体积了。
我们可以把一些使用频率相对较低的资源不打包进 apk,并在需要时下载到本地(例如动画文件,字体,zip 压缩包,so 库等)
我们注意到,货拉拉用户端 apk 中,使用了 35 个以上的 so 库,并且都支持 arm64-v8a 和 armeabi-v7a 这 2 种 abi,结果就是 so 体积成倍上涨。用户端生产环境下的 apk,解压缩后,存放 so 包的 lib 目录,占据了整个应用 41%的大小。
因此动态资源管理系统是下一个优化的重点,动画,字体和 zip 包只是普通文件,完全可以支持动态下载并使用。而 so 文件本质上就是一种可动态加载并执行的文件,将 so 文件动态下发是切实可行的,但是要将它从 apk 中剔除并保证稳定性并不是一件易事。
百度 APP iOS 端内存优化实践-大块内存监控方案 : 内存不足引发的 APP 崩溃通常称为 OOM(Out Of Memory),iOS 端无法捕获 OOM 异常,也得不到任何堆栈信息,给我们排查和解决问题带来很多困扰。引起 OOM 的原因归根结底就是因为内存分配不合理引起的,尤其是内存处于危险水位时单次内存分配过大引起 Jetsam 机制开始生效而杀掉进程,通过我们线上数据监控,百度 APP 客户端单次内存分配超过 30M 的 case 很多。
针对这种潜在的引起 OOM 的隐患,我们开发了一种大内存分配监控方案,充分利用线上监控优势(丰富真实的用户场景和用户路径)和线下流水线优势(可获取更多的堆栈信息),其中线上环境除了功能实现外,还要重点考虑稳定性,不能引入额外的性能问题,经过技术探索我们解决了此类难题,线上监控和线下流水线监控相结合实现对百度 APP 大块内存的监控。
bizz84/flutter-tips-and-tricks : A collection of all the Flutter tips & tricks
万字剖析 Armv8 架构虚拟化 : 本文描述了 Armv8-A AArch64 的虚拟化支持。包括 stage 2 页表转换,虚拟异常,以及陷阱。本文介绍了一些基础的硬件辅助虚拟化理论以及一些 Hypervisor 如何利用这些虚拟化特性的例子。文本不会讲述某一具体的 Hypervisor 软件是如何工作的以及如何开发一款 Hypervisor 软件。通过阅读本文,你可以学到两种类型的 Hypervisor 以及它们是如何映射到 Arm 的异常级别。你将能解释陷阱是如何工作的以及其是如何被用来进行各种模拟操作。你将能描述 Hypervisor 可以产生什么虚拟异常以及产生这些虚拟异常的机制。理解本文内容需要一定基础,本文假定你熟悉 ARMv8 体系结构的异常模型和内存管理。
使用内存回收技术对嵌入式系统进行性能优化 : 嵌入式系统不像互联网那种大型分布式服务器系统,他们往往内存和存储容量比较充裕,因而关注点在分布式方面,对单机性能不够重视。嵌入式系统,在有限的内存和存储空间因素制约下,会更加关注单机性能优化。
而内存回收这块是比较重要的,因为内存回收做的不好,内存压力得不到释放,最直接的是内存压力会转化为 IO 压力,对系统 io 性能造成影响。另外也会转换为 cpu 压力,影响程序的 cpu 资源使用。
所以结合我对内存回收方面的调研,想重点写下对 Linux 内核内存回收这块代码的理解,也想分享下我在这块的调研心得。
【WWDC22 110362】快速链接:优化构建和启动耗时 : 摘要:本 session 是由苹果链接器团队的首席工程师 Nick Kledzik 带来的关于如何实现快速链接的分享。主要介绍了苹果近期在静态链接和动态链接方面的一系列优化,同时帮助大家理解链接过程中的底层细节,让大家可以提升自己 App 的静态和动态链接性能。
Compose 与原生启动性能对比: 从本次测试结果来,Compose 的冷启动略逊于原生,两者相差 124ms,但在热启动与温启动状态下,Compose 性能又优于原生
LWN:删除调度器中功耗差异幅度的检查! : CPU scheduler 的工作总是挺困难的;它必须找到一种方法来把 CPU 时间分配给系统中的所有任务,必须要是公平的,能允许所有的任务都有进展,并使整个系统的吞吐量(throughput)最大化。最近,它又收到了一个新要求:最大限度地减少系统的能耗。目前有一个由 Vincent Donnefort 和 Dietmar Eggemann 合作发布的 patch set 正在讨论中,它对满足这个要求的实现方式进行了更改。实际的变动并不大,但它说明了我们在撰写正确的启发式规则上是有多么困难。
一文看懂 Android 签名 v1、v2、v3、v4,竟然都 v4 了 : Android 签名 v1、v2、v3、v4 的区别
探究 ANR 原理-是谁控制了 ANR 的触发时间 : ANR(Application Not responding)是指应用程序未响应,Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成 ANR。
Android 重学系列 Ashmem 匿名共享内存 : 本文让我们来聊聊匿名共享内存 Ashmem。Ashmem 为什么会诞生?共享内存本质上还是为了方便跨进程通信,减少拷贝次数,提高性能。
谈谈 Android 渲染机制:如何绘制并显示一帧图像? : 本文将介绍 Android 的渲染机制。了解 Android 的渲染机制不论是对日常的开发,还是渲染问题排查都会有帮助。本文希望能带你了解 Android 是如何绘制并显示一帧图像的,同时会涉及 Perfetto UI 的使用,以及带来一些延伸的思考问题,感兴趣的可以在阅读的同时同步使用 Perfetto UI 进行尝试。
对移动端 app 容灾的思考 : 其实在笔者角度上看,技术与业务的关系其实是比较单一的,虽然不至于对立,但是一个业务人员看待技术,最关心的可能就是稳定性了,在“老板”角度上看,他其实不太关心所用的技术是什么,但是一定关心这个服务能不能保证自己的业务能不能持续,这也是笔者访谈了几位非技术人员得出的结论,同时在“降本增效”的今天,追求稳定性可能是大部分公司的选择了。还有就是站在长远立场上看,移动端的容灾也慢慢会成为各大公司角逐的一个点。一个由于 crash 导致而离开的用户,就有可能带走 10 个相关联客户,在 app 场景如此,在游戏场景也是,如果打着游戏突然闪退了,肯定是一个非常不好的体验。
为什么说获取堆栈从来就不是一件简单的事情 : 本来 Signal 出发的目的就是想建造一个类似于安全气囊的装置,保证 crash 后第一时间重启恢复,达到一个应用稳定的目的,但是慢慢写着写着,发现很多 crash 监控平台的也是用了相同的核心原理(大部分还没开源噢),只是作用的目标不同,那么为什么不把 Signal 打造成一个通用的基础件呢!无论是安全气囊还是监控,其实都是上层的应用不同罢了!嗯!有了这个想法之后,给 Signal 补充一些日志监控逻辑,就更加完善了!所以就有了本篇文章!算是一个补充文
Android 项目的 Code Reviewer 清单 : 查看 Android 代码库时要记住的几点:代码审查有时是一个乏味的过程,但我相信我们需要花更多的时间在这上面。也许这是你学习或分享一些知识的机会。这里列出了一些在 Android 项目的 Code Review 过程中检查所必需的要点。
Android 启动优化,方案调研 : 用户体验(User Experience,简称 UE/UX)是用户在使用产品过程中建立起来的一种纯主观感受。但是对于一个界定明确的用户群体来讲,其用户体验的共性是能够经由良好设计实验来认识到。计算机技术和互联网的发展,使技术创新形态正在发生转变,以用户为中心、以人为本越来越得到重视,用户体验也因此被称做创新 2.0 模式的精髓。在中国面向知识社会的创新 2.0——应用创新园区模式探索中,更将用户体验作为“三验”创新机制之首。ISO 9241-210 标准将用户体验定义为 “人们对于针对使用或期望使用的产品、系统或者服务的认知印象和回应”。通俗来讲就是“这个东西好不好用,用起来方不方便”。因此,用户体验是主观的,且其注重实际应用时的产生的效果。ISO 定义的补充说明有着如下解释:用户体验,即用户在使用一个产品或系统之前、使用期间和使用之后的全部感受,包括情感、信仰、喜好、认知印象、生理和心理反应、行为和成就等各个方面。该说明还列出三个影响用户体验的因素:系统,用户和使用环境。
Android 强推的 Baseline Profiles 国内能用吗?我找 Google 工程师求证了! : 今年 Google I/O 大会上,Android 官方强推了一把 Baseline Profile,不仅在 Android、Jetpack 的主题演讲里有提到了它,就连 Jetpack Compose、Android Studio 相关的主题里也有它的身影。
2 小时入门 Jetpack Compose(上) : 最近工作有点忙的,趁着端午节 3 天小长假,我来写个 Compose 快速入门的教程吧!我们的目标是:「2 小时入门 Compose」!
2 小时入门 Jetpack Compose(下) : 最近工作有点忙的,趁着端午节 3 天小长假,我来写个 Compose 快速入门的教程吧!我们的目标是:「2 小时入门 Compose」!
Bitmap 解码优化 : 一般情况下,开发时直接选择 Google 提供的解码 API,但是 API 的使用不当会导致 I/O 型的性能问题,今天就探索一下怎样做才能做到最优的 Bitmap 解码,这可是现代化项目的重要组成部分。
过去一周个人阅读和收藏的非技术文章精选,扩展 Android 之外的知识和视野,不要给自己设限
How I became a Google Developer Expert (GDE) for Android with the help of the #RoadToGDE program : 上周我成为了安卓的谷歌开发者专家(GDE)。这是我第二次尝试申请,其中包括我成为 Google 的 Road to GDE 项目的一部分。这篇文章强调了我在指导计划中的经验,以及它是如何帮助我成为 GDE 的,以及你如何也能成为 GDE 的。
使用二八法则省力地学习 awk : 在本文中,我们将学习到如何使用二八法则来省力轻松学习 linux 文本处理命令 awk。读完本文你就会学习到一种快速学习的方法, 以及使用 awk 来处理文本和 stdout。
如何阅读一份源代码?(2020 年版) : 读代码与写代码是两个不太一样的技能,原因在于“写代码是在表达自己,读代码是在理解别人”。因为面对的项目多,项目的作者有各自的风格,理解起来需要花费不少的精力。我从业这些年泛读、精读过的项目源码不算少了,陆陆续续的也写了一些代码分析的文章,本文中就简单总结一下我的方法。
我怎样发布 Telegram 频道信息? : 赏心悦目的排版会令人舒适,但是小小的文本框需要的注意的地方还挺多的。运营 APPDO 数字生活指南一年之久,对频道的文本有了一套自己的处理模式,想借此机会分享出来,希望本文能对大家 Telegram 频道的文本编辑工作和提高字体与排版审美有所帮助。
当众学习 - 最快的学习方式
英文原文
中文译文
2022-28: 热乎的暗黑 3 PTR : 这里又是一份周报, 时间范围是 2022-07-04 到 2022-07-11, 会记录一些工作及生活上有意思和没那么有意思的事情.
“这不是一篇阅读理解”,这是《最伟大的作品》(上) : 周杰伦 最伟大的作品 MV 解析
“这不是一篇阅读理解”,这是《最伟大的艺术》(下) : 周杰伦 最伟大的作品 MV 解析
Android Weekly-527
Kotlin Weekly #311
onCreate Digest - Issue #116
Android NewLetter #113
Android NewLetter #114
Graphics Programming weekly - Issue 243
软件测试周刊(第 80 期):当你想倾诉的话语已经涌到了舌尖,但是把那些话憋回去的瞬间,从那个瞬间起,你就成为了大人
科技爱好者周刊(第 214 期):你的地图是错的
前端技术栈周刊 #33
Now in Android #64
Issue #05: 一周信息食谱 0716
最近读的比较多的非技术书是 :「置身事内:中国政府与经济发展」
了解了政府的运行逻辑,或许就可以对目前发生的许多乱象有一个更深入的理解和认识了。一个成熟的韭菜,就是明知道要被割,还义无反顾
豆瓣链接 : https://book.douban.com/subject/35546622/
京东链接 : https://item.jd.com/13353378.html
如果你在 Win 和 Mac 下没有趁手的截图工具,那么可以试试 snipaste ,最基本功能都有,很适合工程师们在 Teams 或者 TT 或者飞书上扯皮的时候贴代码用
官网 https://www.snipaste.com/
由于微信外链限制,很多文章链接都无法直接访问,推荐大家订阅 NewsLetter 来获得更好的阅读体验,或者访问网页端或者知乎专栏
订阅地址:https://androidweekly.zhubai.love/
本文 NewsLetter 地址:https://androidweekly.zhubai.love/posts/2160489310682906624
本文知乎地址:https://zhuanlan.zhihu.com/p/542795375