这个附录解决两个问题
- "我想查某个主题" → 看 D.1(按主题索引)
- "这个文件在哪几章被讲过" → 看 D.2(按工程文件索引)
另外还有 D.3 阅读指南 (路线、节奏、每章前置知识自检)和
D.4 一张"从零到发布"的全景图。
D.1 按主题索引
用法:想到一个问题,查这张表找到章节。
D.1.1 Android 平台
| 主题 | 章节 |
|---|---|
| App 是怎么启动的 | ch04.1 |
AndroidManifest.xml 每个字段 |
ch04.2 |
applicationId vs namespace |
ch04.3 |
| Activity 生命周期 | ch04.4 |
| 旋转屏幕为什么不丢数据 | ch04.5 |
ViewModel 存活边界 |
ch04.5、ch09 |
资源系统(res/) |
ch05 |
| 自适应图标 | ch05.3 |
| 为什么只换 legacy 图标无效 | ch05.4 |
| 密度(dpi) | ch05.5 |
| 资源路径混淆 | ch05.6、ch02 坑 3 |
DataStore 持久化 |
ch11 |
FileProvider 分享 |
ch04.2.3、ch12.7 |
ActivityResultContracts |
ch12.8 |
| TTS 朗读 | ch12.1--12.5 |
| 剪贴板 | ch12.6 |
包可见性(<queries>) |
ch04.2.2 |
| 作用域存储(为什么只有 Uri) | ch12.8.3 |
D.1.2 Compose 与状态
| 主题 | 章节 |
|---|---|
| 声明式 vs 命令式 | ch06.1 |
@Composable 约定 |
ch06.2 |
| 状态提升 | ch06.3 |
重组与 remember |
ch06.4 |
LaunchedEffect 与 key |
ch06.5 |
Modifier 与顺序 |
ch06.6 |
页面骨架(Scaffold) |
ch07.1 |
抽屉(ModalNavigationDrawer) |
ch07.1.3 |
列表与 key |
ch07.2.3 |
状态列表(SnapshotStateList) |
ch09.4 |
| 不可变更新与刷新 | ch03.4.5、ch09.4.3 |
| 对话框状态设计 | ch07.7 |
| 空状态设计 | ch07.4.3 |
| 手写 Markdown | ch07.6 |
D.1.3 异步与并发
| 主题 | 章节 |
|---|---|
为什么不能用 Thread |
ch08.1 |
suspend / launch / withContext |
ch08.2 |
| 三个调度器的边界 | ch08.2.4 |
| 单线程调度器 | ch08.2.5 |
| Flow 是冷流 | ch08.3.3 |
flowOn 切上游 |
ch08.4 |
| 协作式取消 | ch08.5、ch10.2 |
CancellationException 必须重抛 |
ch10.4 |
catch 不重抛的陷阱 |
ch08.6 |
| 节流刷新 UI | ch08.7 |
| 结构化并发与 Job 树 | ch10.1 |
| ANR 与主线程阻塞 | ch10.5 |
| 资源收尾清单 | ch10.6 |
| 状态容器为什么抽出来 | ch09.1 |
| 工作副本 vs 快照 | ch09.5 |
.first() vs collect |
ch09.6 |
D.1.4 JNI 与 C++
| 主题 | 章节 |
|---|---|
| 为什么需要 JNI | ch13.1 |
external fun 声明 |
ch13.2.1 |
| JNI 函数名规则 | ch13.3 |
extern "C" 为什么必须 |
ch13.4 |
JNIEnv 与字符串转换 |
ch13.5 |
| 全局状态与互斥锁 | ch13.6 |
| 为什么每个方法都加锁 | ch13.6.2、ch13 练习 2 |
CMake 把 C++ 编进 .so |
ch13.7 |
-fsyntax-only 快速校验 |
ch13.9、ch02.7 |
| GGUF 文件结构 | ch14.2 |
| 小端序 | ch14.2.2、附录 A.3.3 |
| 元数据类型系统 | ch14.3 |
| 短读陷阱 | ch14.7 |
DEFAULT_SKIP_KEYS |
ch14.8 |
D.1.5 模型与推理
| 主题 | 章节 |
|---|---|
| 量化是什么 | ch01.2.2 |
| GGUF 与元数据 | ch01.2.3、ch14 |
| 端侧推理 | ch01.2.4 |
| token 与上下文长度 | ch01.2.5 |
| 加载模型四个对象 | ch15.1 |
n_ctx / n_batch / 线程数 |
ch15.4 |
| KV cache 占多少内存(会算) | ch15.5 |
prepare 失败路径清理 |
ch15.7.2 |
unload 释放后清零 |
ch15.8.2 |
| prefill vs decode | ch16.1 |
| batch 与 position | ch16.3 |
want_logit 优化 |
ch16.3.3 |
generateNextToken 逐行 |
ch16.4 |
| 三个停止条件 | ch16.4.6 |
| UTF-8 缓存(防乱码) | ch16.5 |
| chat template | ch17.1--17.3 |
| 第二轮输出数字(24 字节事故) | ch17.5 |
| 前缀比较 vs 长度切片 | ch17.4.2、ch17.6 |
| 移窗(context shift) | ch18.3 |
| 位置错乱事故 | ch18.4 |
| 位置不变量检查 | ch18 练习 5 |
| temperature / top-k / top-p | ch19.2--19.5 |
| 采样参数六环链路 | ch19.6 |
| "改了不生效"排查 | ch19.7 |
D.1.6 构建与发版
| 主题 | 章节 |
|---|---|
| 五个组件(JDK/SDK/NDK/CMake/Gradle) | ch02.1 |
| 版本对齐 | ch02.4 |
local.properties / gradle.properties |
ch02.3 |
| 产物路径会变 | ch02.5.4、ch20.6.2 |
| Gradle vs AGP | ch20.2 |
variant 与 buildTypes |
ch20.3 |
| 为什么关 R8 | ch20.3.2 |
externalNativeBuild |
ch20.4 |
| CMake 开关 | ch20.5 |
| ABI 过滤发生在哪一步 | ch20.7 |
| 半残 ABI 切片事故 | ch20.8 |
| 签名方案 v1/v2/v3/v4 | ch21.2 |
| keystore 为什么最重要 | ch21.4 |
| 发版五步 | ch21.6 |
| 校验五条清单 | ch21.7 |
| 确认修复进包(MD5) | ch21.7.5 |
| 覆盖安装的坑 | ch21.8 |
D.1.7 方法论
| 主题 | 章节 |
|---|---|
| 五步排查框架 | ch22.1 |
| 最小对照实验 | ch22.1.3 |
| 静默失败四类 | ch22.2 |
| 不变量 + 断言 | ch22.8.3 |
| 纯逻辑模拟 | ch22.8.4 |
| 二分法 | ch22.8.5 |
| 根因分析报告模板 | ch22.9 |
| 需求裁剪(MVP) | ch23.2 |
| 最小架构 | ch23.3 |
| 加回功能的顺序 | ch23.10 |
| 分层思维 / 可验证 / 裁剪 | ch23 结语 |
D.1.8 基础常识(补课)
| 主题 | 章节 |
|---|---|
| 编程最基本概念 | 附录 A.1 |
| 命令行与路径 | 附录 A.2 |
| 位/字节/十六进制/小端序 | 附录 A.3 |
| UTF-8 与乱码原理 | 附录 A.4 |
| JSON 与序列化 | 附录 A.5 |
| CPU/内存/进程/线程/Binder | 附录 A.6 |
| 编译与 APK | 附录 A.7 |
| Git 最小必需 | 附录 A.8 |
D.2 按工程文件索引
用法:你看到一个文件,想知道"它在哪几章被讲过"。
D.2.1 应用模块(app/)
| 文件 | 被讲的章节 |
|---|---|
app/build.gradle.kts |
ch01.1、ch02、ch04.3、ch20.3/20.7/20.9 |
app/src/main/AndroidManifest.xml |
ch04.2 |
MainActivity.kt |
ch04.1/4.2/4.4/4.6 |
ui/MainScreen.kt |
ch01.1、ch19.6 |
ui/MainScreenState.kt(1132 行) |
ch09 全章、ch08.6、ch10.7、ch12.6、ch19.6 |
ui/ChatScreen.kt(419 行) |
ch06.3、ch07 全章 |
ui/MessageList.kt |
ch06.5、ch07.2 |
ui/MessageItem.kt |
ch07.5 |
ui/MarkdownText.kt(383 行) |
ch07.6 |
ui/InputArea.kt |
ch06.2/6.3 |
ui/SettingsScreen.kt |
ch19.6 |
model/ModelInfo.kt |
ch03.2/3.4/3.6 |
model/Message.kt |
ch03.4.2 |
model/ChatSession.kt |
ch03.4.3、ch11.6 |
util/AppSettings.kt |
ch03.5、ch11、ch19.6 |
util/ThinkStripper.kt |
ch03.7、ch16 |
util/TTSManager.kt(412 行) |
ch10.6、ch12 |
util/ModelImporter.kt |
ch10.3(半成品事故)、ch14.4 |
util/ModelManager.kt |
ch11.3(读改写事故)、ch11.4 |
util/ChatSessionStore.kt |
ch11.2/11.7 |
util/ChatExporter.kt |
ch11.8 |
res/mipmap-anydpi-v26/ic_launcher.xml |
ch05.3 |
res/drawable/ic_launcher_background.xml |
ch05.3.5 |
res/values/{strings,colors,themes}.xml |
ch05.7 |
res/xml/file_paths.xml |
ch04.2.3、ch12.7 |
D.2.2 推理库模块(lib/)
| 文件 | 被讲的章节 |
|---|---|
lib/build.gradle.kts |
ch20.4、ch20.7.1 |
InferenceEngine.kt(接口 + 状态机) |
ch01.5.6 |
internal/InferenceEngineImpl.kt(338 行) |
ch01.5.6、ch08 全章、ch10.4/10.5、ch13.2、ch19.6 |
internal/gguf/GgufMetadataReaderImpl.kt(596 行) |
ch14 全章 |
gguf/GgufMetadataReader.kt |
ch14.8 |
gguf/FileType.kt |
ch14.5 |
gguf/GgufMetadata.kt |
ch14.3 |
src/main/cpp/ai_chat.cpp(882 行) |
ch13 全章、ch15 全章、ch16 全章、ch17.4、ch18.3、ch19.6 |
src/main/cpp/logging.h |
ch02.7 |
src/main/cpp/CMakeLists.txt |
ch13.7、ch20.6 |
D.2.3 构建与配置
| 文件 | 被讲的章节 |
|---|---|
settings.gradle.kts |
ch01.5.5 |
gradle.properties |
ch02.3.2 |
local.properties |
ch02.3.1 |
gradle/libs.versions.toml |
ch02.4 |
keystore.properties(不进版本库) |
ch21.5 |
运行命令.txt(发版 runbook) |
ch21 全章 |
BUG_AUDIT_2026-09-10.md(审查报告) |
ch22.5/22.8.6 |
D.2.4 本书自带
| 文件 | 说明 | 出处 |
|---|---|---|
book/code/ch01/count-lines.ps1 |
统计工程代码行数 | ch01.4 |
book/code/ch03/Playground.kt |
Kotlin 语法示例 | ch03 |
book/code/ch04/LifecycleDemo.kt |
生命周期模拟 | ch04.7 |
book/code/ch05/icon_build.py |
生成全套图标 | ch05.12 |
book/code/ch08/FlowCancelSim.kt |
取消行为模拟 | ch08.9 |
book/code/ch14/gguf_header_reader.py |
解析 GGUF 头 | ch14.9 |
book/code/ch23/mini-* |
最小工程骨架 | ch23 全章 |
book/code/verify_citations.py |
行号引用复核器 | README「行号引用会漂移」 |
D.3 阅读指南
D.3.1 三条路线
路线 A:完全零基础(推荐这条)
附录 A(知识点补课,只读你缺的)
↓
ch01(建立全局观,慢读)
↓
ch02(只求"跑通构建",别纠结每个报错)
↓
ch03(Kotlin 速成,**这章要慢读**)
↓
ch04 → ch05 → ch06 → ch07(界面部分)
↓
ch08 → ch09 → ch10 → ch11 → ch12(异步与状态部分)
↓
ch13 → ch14 → ch15 → ch16(原生与推理)
↓
ch17 → ch18 → ch19(推理进阶)
↓
ch20 → ch21(构建与发版)
↓
ch22(方法论)
↓
ch23(动手做最小版)
路线 B:会别的语言,没写过 Android
ch01 → ch02 → ch03(快过语法差异)→ ch04 → ch06 → ch09
→ ch13 → ch14 → ch16(先打通"能出字"这条主线)
→ 再回头补 ch07 / ch08 / ch11
路线 C:会 Android,想搞懂端侧推理
ch01(只看 1.5 架构 + 1.3 规模)
→ ch13 → ch14 → ch15 → ch16 → ch17 → ch18 → ch19 → ch22
(前两部分按需查)
D.3.2 每章的"前置知识自检"
读每一章前,自查这两三项。不满足就先补。
| 章 | 前置自检 |
|---|---|
| ch01 | 无(最重要的一章,谁都能读) |
| ch02 | 附录 A.2(命令行/路径) |
| ch03 | 附录 A.1(编程基本概念) |
| ch04 | ch03(Kotlin 基本语法) |
| ch05 | ch04(知道 Manifest 在哪) |
| ch06 | ch04 + ch05(知道 App 怎么起来、资源怎么引用) |
| ch07 | ch06(状态驱动 UI 的心智模型) |
| ch08 | ch06(知道重组是什么) |
| ch09 | ch08(Flow 与 cancel) |
| ch10 | ch08 + ch09 |
| ch11 | ch09(状态容器) |
| ch12 | ch09 + ch10 |
| ch13 | ch03(能看懂 Kotlin 函数);附录 A.6(进程/线程) |
| ch14 | ch13;附录 A.3(字节/小端序) |
| ch15 | ch14 |
| ch16 | ch15;附录 A.4(UTF-8) |
| ch17 | ch16 |
| ch18 | ch16(位置管理) |
| ch19 | ch16(采样在 decode 里) |
| ch20 | ch02 + ch13 |
| ch21 | ch20 |
| ch22 | ch17 + ch18 + ch08(会用到这三章的事故) |
| ch23 | 全书 |
D.3.3 卡住了怎么办(四层兜底)
第 1 层:该章末尾的「常见错误与排查」表
↓ 没有?
第 2 层:附录 C(FAQ,35 个常见问题)
↓ 没有?
第 3 层:附录 B(术语表,确认你没理解错某个词)
↓ 还没有?
第 4 层:ch22 的五步框架,自己排查
复现 → 隔离变量 → 最小对照 → 修正 → 回归
D.3.4 三条"高效读法"
| 读法 | 怎么做 |
|---|---|
| 每章至少跑一次"动手验证" | 那是"看懂"和"学会"的分界 |
| 先画结构图,再读细节 | 比如读 ch09 先画"状态清单",读 ch16 先画"循环图" |
| 把结论讲给别人听 | 讲不顺的地方 = 没真懂的地方 |
D.3.5 三条"无效读法"(请避免)
| 无效 | 为什么 |
|---|---|
| 只读不动手 | 读代码能懂"是什么",写代码才知道"为什么" |
| 追求读完而不是读透 | 每章都有勾选清单------按那个自测,不要按页数 |
| 遇到不懂就停下来查 | 会打断理解主线。标记后继续,读完一节再回来查 |
D.4 一张全景图:从零到发布
把全书串成一条线(这也是本书的目录结构):
【第一部分:起步】ch01--ch03
ch01 项目全景 ← 知道要做什么、有哪些层、代码量多少
ch02 环境与构建 ← 能把它编出来
ch03 Kotlin 速成 ← 能读懂它的语言
【第二部分:应用开发】ch04--ch12
ch04 应用骨架 ← App 怎么被系统拉起来
ch05 资源系统 ← 图标/文字/颜色从哪来
ch06 Compose 入门 ← 状态驱动 UI 的心智模型
ch07 Compose 实战 ← 组装一个聊天页
ch08 协程与 Flow ← 数据怎么流
ch09 状态容器 ← 状态放哪、怎么管
ch10 取消与释放 ← 资源怎么收回去
ch11 持久化 ← 数据怎么存
ch12 系统能力接入 ← 怎么用系统(TTS/剪贴板/分享/选择器)
【第三部分:原生与推理】ch13--ch19
ch13 JNI ← Kotlin 怎么调 C++
ch14 GGUF ← 模型文件里有什么
ch15 加载与上下文 ← 怎么把它装进内存
ch16 推理主循环 ← 怎么让它说话
ch17 Chat Template ← 怎么组织多轮对话
ch18 KV cache 移窗 ← 上下文满了怎么办
ch19 采样参数 ← 怎么挑下一个字
【第四部分:工程化与交付】ch20--ch23
ch20 构建体系 ← 代码怎么变成 APK
ch21 签名与发版 ← 怎么交付出去
ch22 诊断方法论 ← 出问题怎么查
ch23 综合复刻 ← 自己从零做一遍
【附录】
附录 A 零基础补课 ← 读之前缺什么补什么
附录 B 术语表 ← 遇到生词查这里
附录 C 常见问题 FAQ ← 卡住了先来这里
附录 D 速查索引 ← 本文件:按主题/按文件定位
这张图的价值:
迷路的时候回来看一眼------
知道自己在哪、下一步去哪。
D.5 一句话总结全书
从"点一下图标"到"屏幕上一个字一个字蹦出来",
中间隔着一整套工程:
界面、状态、异步、持久化、JNI、推理、构建、签名。
这本书把这套东西拆开,一块一块讲给你听,并让你亲手拼回去。
相关文档
- 《00-教学设计与大纲》 ------ 全书的设计说明(每章目标、前置、对应源码)
- 《README》 ------ 阅读须知、代码验证约定、术语约定、行号复核方法
- 《附录 A/B/C》 ------ 补课 / 术语 / FAQ