摸鱼精选第 2 期

1. Flutter 图片内存优化实践

贝壳 App 团队在优化图片内存时的实践过程中,从 Flutter Engine 渲染图片的源码分析开始,先通过 AOP 的方式对 ImagecacheWidthcacheHeight进行设置,这种方式能够减少内存占用,但存在图片释放的及时性、超大图没法解决内存峰值的问题。

最终解决方案是通过原生端做优化,外接纹理的方式。Android 端使用 Glide,iOS 端使用 SDWebImage。

Github 链接:https://github.com/LianjiaTech/bk_flutter_image

2. 贝壳 Flutter 调试工具 -FDB

FDB 的功能包含:

  • 组件信息检查
  • 内存详细数据的展示
  • 内存泄漏自动检测
  • FPS 检测
  • 源码文件和源码具体行数的展示

3. C++20 四大特性之一:Module 特性详解

本文分为三部分

  • 探究 C++ 编译链接模型的由来以及利弊
  • 介绍 C++20 Module 机制的使用姿势
  • 总结 Module 背后的机制、利弊、以及各大编译器的支持情况

4. C++20 四大特性之二:coroutines 特性详解

全文共三部分:

  • 第一部分从概念上讨论协程与普通函数的区别;
  • 第二部分通过两个完整的协程代码示例,并深入到编译器层面,深入解析 promise_type 及其工作流程;
  • 第三部分介绍 co_await 的作用以及工作原理,该部分是本文最难理解的部分。

4.1 C++20 四大特性之三:concept 特性详解

模板的演进是 C++ 发展史中一条十分重要的线,笔者认为 concept 是这条线中最大的一个特性,本文将详细解读 C++ 的 concept 特性,以期对 C++ 有更深入的了解

5. 【EBook】µGo 语言实现——从头开发一个迷你 Go 语言编译器

本书尝试以实现 µGo 编译器为线索,以边学习边完善的自举方式实现一个玩具语言。

6. C++ 中的 PImpl 技巧

PImpl(Pointer to Implementation)是通过使用指针的方式将实现的细节进行隐藏,它的主要作用是将两个文件见的编译依存关系降至最低。

PIMPL 的优点

  1. 降低模块间的耦合度;
  2. 降低编译依赖,提高编译速度;
  3. 接口和实现分离,提高接口的稳定性。

拓展 1:PImpl Idiom in C++ with Examples 拓展 2:Qt 中大量使用 Impl,具体可见https://wiki.qt.io/D-Pointer中关于 Q_D 和 Q_Q 宏的解释。

7. Refresh session token of Auth0 with RxSwift and Moya

现在 App 的 HTTP 基本上都是基于 Auth0 实现的,登录的时候获取 access_tokenrefresh_token。当access_token 过期时,需要刷新access_token,一般会有一个专门的刷新 API,参数是refresh_token。这个刷新操作在 UI 层面需要不让用户感知到,就是在access_token 过期时就显示登录界面,正确的做法是在 refresh_token过期时,才跳转到登录界面。

Swift 项目的 HTTP 基本上都是基于 Moya 和 RxSwifM 实现,作者先自定义了一个 MoyaProvider,然后 Override 了 func request(_ token: Target) 方法,这样可以在检测到状态码是 401 时,自动调用 refresh 接口,刷新成功之后,自动调用原来的接口。

8. Whistle 实现原理 —— 从 0 开始实现一个抓包工具

本文将从最基本的概念开始逐步讲解 Whistle 功能,包含以下内容:

  • 什么是 HTTP 代理
  • 实现简单 HTTP 代理
  • 完整 HTTP 代理架构(Whistle)
  • 具体实现原理