SmartPDF之所以是专家级产品最核心的 10 个重难点。
这些问题涵盖了 系统底层、架构设计、性能调优 三个维度,是资深 Android 工程师(Senior/Staff level)必须掌控的领域。
1. 存储权限的平滑降级与持久化授权 (Scoped Storage)
-
挑战:
v0.5依赖MANAGE_EXTERNAL_STORAGE。如果为了上架 Google Play 或保护隐私需移除该权限,如何通过SAF(Storage Access Framework) 获取单文件或单文件夹的永久访问权? -
核心:
Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION与contentResolver.takePersistableUriPermission的配合。
2. 跨进程 URI 安全与 FileProvider 陷阱
-
挑战: 在
MainActivity处理外部Intent或在ShortcutUtils创建快捷方式时,如何确保content://URI 的临时授权(Temporary Permission)在 Activity 重启或进程被杀后依然有效? -
核心: 理解
Intent.FLAG_GRANT_READ_URI_PERMISSION的传播链条。
3. 百毫秒级全盘扫描:MediaStore 增量同步
-
挑战: 现在的递归扫描在文件多时会 ANR。如何利用
MediaStore索引实现“秒级”全盘 PDF 检索? -
核心: 编写高效的
SQL查询语句,并通过ContentObserver监听系统媒体库的实时变动(如用户在微信里下载了新 PDF,App 列表自动出现)。
4. 混合架构中的 Native 内存泄露防范
-
挑战:
android-pdf-viewer基于 C++ 的 Pdfium。在 Compose 的AndroidView重组或 Navigation 切换时,如何保证recycle()被 100% 执行? -
核心: 在
DisposableEffect中建立严格的资源回收闭环,防止 Native Heap 缓慢增长导致的无预警崩溃。
5. Compose 高频状态下的“渲染降噪” (DerivedState)
-
挑战: PDF 滑动时产生的
offset是像素级的。如果直接同步给 Compose State,会导致整个 UI 树每秒重组 60 次以上。 -
核心: 使用
derivedStateOf和Snapshot机制,将高频的像素位移转化为低频的“页码变更”或“进度条百分比”。
6. 旋转屏与分屏模式下的“零感”恢复
-
挑战: 旋转屏幕会导致
PDFView重新初始化并重绘。如何避免“白屏闪烁”? -
核心: 在 ViewModel 中缓存当前页的位图缩略图,在
AndroidView重新update时先显示缩略图占位,实现视觉上的无缝衔接。
7. 大文件渲染性能:三级缓存与预加载逻辑
- 挑战: 快速翻页时,实时渲染 PDF 页面会导致明显的滞后。
- 核心: 设计一套 LruCache:内存存储当前页及前后页的 Bitmap,磁盘存储所有页面的低清缩略图。
8. 文本层分析:从坐标到语义 (Text Extraction)
- 挑战: PDF 只是绘图指令。如何实现“长按选中文本”或“全文搜索”?
-
核心: 调用 Pdfium 的 Native 接口获取字符的
CharacterBounds(矩形坐标),并建立逻辑行(Logical Line)算法。
9. 架构解耦:Single Source of Truth (SSOT)
- 挑战: 物理文件变动(删除/重命名)与数据库状态(收藏/进度)的一致性。
- 核心: 设计 Repository 层,确保任何 UI 操作(ViewModel)都通过唯一的 DataStore/Room 源,并处理并发冲突(如扫描器正在插入,而用户正在删除)。
10. 全局沉浸式交互与状态机管理 (MVI)
- 挑战: 阅读器有“全屏/非全屏”、“正常/夜间”、“亮度面板/跳转面板”等多个互斥状态。
-
核心: 使用 MVI (Model-View-Intent) 或单一
ViewState模式,避免Boolean标志位过多(如isPanelOpen&isBrightnessOpen)导致的逻辑爆炸。