摸鱼精选第 34 期

1. Linux 内核内存规整详解

内存规整是一个较重内存碎片优化措施,在使用时内核较为谨慎,当前有直接内存规整、kcompactd 内存规整、预应性内存规整及主动内存规整四种场景,这些场景涵盖在内存分配、内存回收等上下文,由于规整的诉求和紧迫程度不同,其通过 compact_control 结构体参数控制 compact_zone 内存规整行为包括但不限于内存扫描范围、页迁移的能力、迁移页是否适合规整及是否可以阻塞等等。

另一方面,内存规整的核心逻辑在于迁移页扫描器(migrate scanner)和空闲页扫描器(free scanner)运作原理,包括哪些页可以作为迁移页或空闲页,何时内存规整结束等等这些直接影响对内存规整理解。

2. iOS Crash 治理:淘宝 VisionKitCore 问题修复

本文通过逆向系统,阅读汇编指令,逐步找到源码,定位到了 iOS 16.0 < iOS 16.2 WKWebView 的系统 bug 。同时苹果已经在新版本修复了 Bug,对于巨大的存量用户,仍旧会造成日均 Crash pv 1200+ uv 1000+, 最终通过 Hook 系统行为,规避此 Bug。在手机淘宝双 11 版本中已经彻底修复,Crash 跌 0。

3. 如何使用 PHPicker 在 iOS 系统无授权下获取资源

本文要点包含以下:

  • PHPicker 是 iOS14 开始引入的新组件,它允许在不需要用户授权的情况下访问照片库的所有资源;
  • 使用 PHPicker 的正确方式是通过 PHPickerViewControllerDelegate 回调返回的 NSItemProvider 来获取所选资源,而不是通过 PHAsset 来获取,后者需要提前获取用户的相册访问授权;
  • 通过 NSItemProvider 可以判断资源类型,加载资源数据或文件 URL,获取图片、视频等多媒体资源;
  • 对于图片,可以通过 loadDataRepresentation 获取 Data,并利用该 Data 获取图片元数据信息。对于视频,可以通过 loadFileRepresentation 获取 URL,并利用 URL 获取 AVAsset;
  • 通过 UTType 可以进一步判断特殊格式资源如 webp、gif 等进行不同处理;
  • 可以通过 NSProgress 监听资源加载进度;
  • 正确使用 PHPicker 可以避免引起用户疑惑,提高用户体验,是 iOS14 访问多媒体资源的推荐方式。

总之,本文详细介绍了在 iOS14 中如何正确使用 PHPicker 访问用户选择的部分照片资源,其要点是不需要提前获取授权,通过 NSItemProvider 处理多媒体资源,这是一种更符合系统设计初衷和提高用户体验的方式。

4. 云音乐 Android Cronet 接入实践

Cronet 是 google chromium 的网络组件,可单独编译成库提供给 Android/Ios 应用使用。Cronet 在 chrome 中经过多年的打磨,稳定性得到了验证,同时 Cronet 支持 QUIC 协议,可以支持后期对弱网场景进行专项优化。安卓端作为 Cronet 的首先落地一端,已经全量在线上运行了一年多的时间,本文主要介绍接入方案和过程中解决的问题。

5. 深入理解 Netty FastThreadLocal

本文以线上诡异问题为切入点,通过对比 JDK ThreadLocal 和 Netty FastThreadLocal 实现逻辑以及优缺点,并深入解读源码,由浅入深理解 Netty FastThreadLocal。

6. 安卓 camera2 获取到的 YUV420_888 格式详解

安卓音视频开发中的一个环节是摄像头采集数据,而 Android 平台上摄像头采集的 API 有两套,camera1 和 camera2。本文主要讲的是 camera2 这套 API 在采集数据并指明 YUV420_888 格式时,获取到的摄像头 YUV 数据格式具体是怎么样的。

7. 视频号直播:如何进一步降低功耗占用?

本文在不影响现有用户体验和业务逻辑的情况下,通过扩展系统接口的能力与实验调试分析,「最终实现了一套 UI 动画的帧率调节方案。」 该方案得到的效果是:

快速改造既有业务的所有动画,动态的控制各自的帧率; 最终达到不影响效果的前提下,尽可能的降低了功耗; 同时极大的减轻了业务开发同学适配多系统和改造动画的工作量。 该方案最终在「视频号直播上得到广泛应用,取得了较大的性能提升。」

8. 深入理解 iOS Jetsam 机制,助力提升 Flotsam 召回率

本文首先介绍了 OOM、Jetsam、Flotsam 的相关概念,详细介绍了 Jetsam 的实现原理,针对 Jetsam 中的 per-process-limit、vm-pageshortage、disk-space-shortage、vnode-limit 这四种系统强杀类型展开介绍了对应的实现原理、触发阈值以及我们的召回策略。通过对上述强杀类型召回过程的描述,我们可以总结出一套通用的召回方法,适用于其他未知的异常退出类型。即调研实现原理 -> 确定触发阈值 -> 制定召回策略。原理调研清楚并确定阈值后,制定召回策略就变得简单了。

9. 网易云信 Android 硬件适配实践

本文主要介绍了云信 RTC SDK 中视频硬件适配遇到的几个问题以及对应的解决方案

10. ReactNative 文本截断问题解决与 Android 文本测绘原理分析

本文主要针对 ReactNative 中由来已久的文本截断问题,进行了深入分析与解决。同时,对 Android 系统文本测绘的整体架构和流程进行了较为全面而简要的介绍。

11. C++知识体系总结:语言核心与代码工程

如题,文章很长。

12. 度加剪辑 App 的 MMKV 应用优化实践

移动端开发中,IO 密集问题在很多时候没有得到充足的重视和解决,贸然的把 IO 导致的卡顿放到异步线程,可能会导致真正的问题被掩盖,前人挖坑后人踩。其实首先要想的是,数据存储方式是否合理,数据的使用方式是否合理。本文介绍度加剪辑对 MMKV 的使用和优化。

13. 腾讯 QQ 桌面版架构升级:内存优化探索与总结

腾讯 QQ 桌面版采用 Electron 技术进行重构,遇到的最大的挑战就是内存优化。

14. 精读 React hooks

精读 React hooks(一):useState 的几个基础用法和进阶技巧

精读 React hooks(二):React 状态管理的强大工具——useReducer

精读 React hooks(三):useContext 从基础应用到性能优化

精读 React hooks(四):useRef 的多维用途

精读 React hooks(五):useEffect 使用细节知多少?

精读 React hooks(六):useLayoutEffect 解决了什么问题?

精读 React hooks(七):用 useMemo 来减少性能开销

精读 React hooks(八):我们为什么需要 useCallback

精读 React hooks(九):使用 useTransition 进行非阻塞渲染

精读 React hooks(十):使用 useDeferredValue 延迟状态更新

精读 React hooks(十一):useInsertionEffect——CSS-in-JS 样式注入新方式

精读 React hooks(十二):使用 useImperativeHandle 能获得什么能力

精读 React hooks(十三):使用 useSyncExternalStore 获取实时数据

精读 React hooks(十四):总有一天你会需要 useId 为你生成唯一 id

精读 React hooks(十五):把 useDebugValue 加入你的 React 调试工具库

精读 React hooks(十六):一个为代码优雅而生的 hook——use

15. 深入架构原理与实践

这是一本关于架构设计的开源书籍,整个系列的内容主要集中在 网络、集群以及服务治理、FinOps 这三个主题,这也代表着基础架构的几个核心:稳定、效率、成本。

深入讲解内核网络、Kubernetes、ServiceMesh、容器等云原生相关技术。经历实践检验的 DevOps、SRE 指南。

16. inside-rust-std-library

本书主要对 RUST 的标准库代码进行分析。 本书尽可能给读者找出一条标准库代码的阅读脉络。同时,分析不仅仅针对代码的功能,也针对代码背后的需求及若干代码设计的思路。 C 语言精通的标志是对指针的精通。RUST 的裸指针也是 RUST 的最基础及最核心的难点之一。 所以,将裸指针及相关的内存模块作为代码分析的起始点,熟悉了裸指针及内存,自然也就对所有权,借用,生命周期的本质有了深刻的理解,RUST 语言的最难关便过了。

17. AwesomeSwift -- SwiftUI 综合示例、样板工程

该项目是在阅读了多个开源项目源码之后沉淀而成,用来演示 SwiftUI 的控件和各种功能组件的使用,同时包含了实际开发过程中可能使用到的各种必备的组件,比如 Lottie、RSwift、崩溃统计等等,适合想要学习 Swift 开发的的新手同学。