第1章 开始启程,你的第一行Android代码
依据郭霖《第一行代码 Android》第3版完整目录独立重构:建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环
第1章 开始启程,你的第一行Android代码
本页对应第3版正式结构中的 第1章 开始启程,你的第一行Android代码。课程不复制原文,而是按出版社电子书目录逐节点独立重构平台机制与工程实践,目标是建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环。每个示例都必须说明目标API、设备、生命周期、线程、状态来源和失败条件。
可验收学习目标
学习目标
- 能解释本页全部6个正式节点的用户任务、平台合同、生命周期和版本边界。
- 能实现“从空目录创建HelloWorld,固定JDK、SDK、Gradle和设备镜像后构建、安装、启动,并用日志证明生命周期入口”,并保存干净构建、设备操作、原始日志和断言。
- 能比较正常创建、配置变更、后台、进程重建、权限拒绝与外部故障下的状态差异。
- 能设计至少一个推翻当前实现的反例,并用可重建工程、SDK与Gradle环境指纹、资源解析图、分级日志与安装运行记录完成独立交接。
首要陷阱是“把IDE绿色运行按钮当成构建理解,未记录SDK版本、Gradle依赖、清单合并、资源生成和设备状态”。先预测再运行;任何“能跑”结论都要经过生命周期、失败输入、安全、资源释放和目标SDK迁移检查。
官方目录逐节点复刻
第1章 开始启程,你的第一行Android代码
正式节点 1/6。 先说明“第1章 开始启程,你的第一行Android代码”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
1.1 了解全貌,Android王国简介
正式节点 2/6。 先说明“1.1 了解全貌,Android王国简介”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
1.2 手把手带你搭建开发环境
正式节点 3/6。 先说明“1.2 手把手带你搭建开发环境”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
1.3 创建你的第一个Android项目
正式节点 4/6。 先说明“1.3 创建你的第一个Android项目”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
1.4 前行必备:掌握日志工具的使用
正式节点 5/6。 先说明“1.4 前行必备:掌握日志工具的使用”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
1.5 小结与点评
正式节点 6/6。 先说明“1.5 小结与点评”解决的用户任务、平台合同与版本边界,再标出组件所有者、生命周期、线程、持久状态和失败路径。该节点必须服务于“建立Android 10系统层次、Android Studio与SDK工具链、Gradle项目结构、资源系统和日志证据的最小开发闭环”,并留下可在模拟器与真机重放的输入、操作、日志和断言。
先预测旋转、后台、进程重建、权限拒绝、断网或目标SDK变化时会怎样,再只改变一个条件。若只能在正常点击路径运行,尚未掌握该节点。
从生命周期与状态开始
Android应用运行在Linux内核、HAL、原生库与ART、Framework服务和应用层组成的栈上。日常API位于上层,但安装失败、权限、进程终止和渲染问题都可能跨层。Gradle把源码、资源、清单与依赖转成APK,aapt2生成资源表,清单合并决定最终组件和权限。第一个工程的验收不只是显示文字,而是能从源码定位到生成物、安装包、进程、Activity启动和Logcat事件。
Android应用不是从main函数开始并一直驻留的桌面程序。系统可创建、暂停、停止和销毁组件,也可在后台终止整个进程;用户返回时,应用必须从保存状态和持久数据恢复。↡由系统回调驱动、描述组件从创建到销毁及可见交互阶段的状态机决定资源何时取得与释放,↡跨配置变更或进程重建仍能恢复的最小业务事实不能只存在View字段或单例中。
所有异步工作都要绑定所有者。↡负责创建、取消并最终释放组件、任务或资源的明确作用域可能是Activity、Fragment的View、ViewModel、Service或应用进程;作用域不同,取消时刻也不同。↡Android版本、targetSdk、设备形态、权限、网络与厂商实现共同形成的行为适用范围防止把Android 10示例当成永久平台规则。↡可由测试重放并以日志、状态快照、截图或产物校验支持的结论链则把代码与用户可观察行为连接起来。
主线程负责输入、生命周期分发与大部分UI工作;磁盘、网络、解析和长计算不能阻塞帧与组件回调。异步返回也不能盲目写入已销毁界面。数据流应以一个持久或可恢复的事实源为中心,UI状态从事实派生,用户动作转成明确意图。这样旋转、重建和多入口导航才不会产生多个互相冲突的真相。
跨应用Intent、Provider、网络响应、文件和深链都属于不可信输入。校验action、URI、大小、类型、授权与来源;按最小权限配置导出组件;日志和错误界面不得泄露令牌与个人数据。功能测试之外,还要验证拒绝权限、空数据、重复点击、超时、取消、磁盘满和进程恢复。
最小可执行切片
先把状态与副作用分离,示例只表达可恢复合同:
sealed interface UiState {
data object Loading : UiState
data class Ready(val itemId: String) : UiState
data class Failed(val retryable: Boolean) : UiState
}
fun reduce(state: UiState, event: UserEvent): UiState = nextState(state, event)固定环境并从命令行保留可复现证据:
./gradlew clean test assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am force-stop example.package
adb shell monkey -p example.package 1
adb logcat -d -v threadtime > run.log验收在操作前写出故障条件:
Given a pinned JDK, SDK, Gradle build, device API, locale, and seed
When the component is recreated after state saving or process death
Then user-visible state is restored from durable facts
And cancelled work cannot update a destroyed owner
And denied permission, offline input, and malformed data remain recoverable三段代码分别承担状态模型、环境重放和行为断言。真实工程还需静态检查、单元测试、仪器测试、截图或无障碍检查,以及发布构建验证;不要用日志输出代替断言,也不要让测试依赖本机IDE缓存。
线程、状态与资源边界
每个实现列出五张表:入口来自哪里,执行在哪个线程,状态保存在哪里,资源由谁关闭,失败怎样呈现与重试。网络重试必须有上限、退避和幂等;数据库升级必须覆盖所有受支持旧版本;文件和媒体句柄在取消与异常路径释放;组件回调不持有超过生命周期的View或Context。
性能以用户任务衡量。启动不仅看首帧,还要检查可交互时刻;列表不仅看平均帧率,还要检查滚动卡顿和绑定分配;后台工作不仅看是否完成,还要检查电量、约束与系统调度;网络不仅看成功耗时,还要检查超时、取消和错误恢复。每次比较固定设备温度、构建类型、数据规模与网络条件。
版本迁移分两步:先在Android 10/Kotlin语境下还原书中机制,再对目标compileSdk、targetSdk和设备API查询当前官方合同。一次只迁移一个变化,例如存储、权限、通知、后台启动、发布仓库或已弃用库;保存编译警告、运行差异和回滚。新API更现代不代表自动正确,旧API能编译也不代表仍符合平台政策。
本章回顾
本页从“第1章 开始启程,你的第一行Android代码”覆盖到“1.5 小结与点评”,共6个正式节点。闭环是先明确生命周期、所有者与状态源,再执行“从空目录创建HelloWorld,固定JDK、SDK、Gradle和设备镜像后构建、安装、启动,并用日志证明生命周期入口”,最后以可重建工程、SDK与Gradle环境指纹、资源解析图、分级日志与安装运行记录证明功能在正常、重建、失败和版本迁移场景下可重放、可恢复、可发布。
练习
问题 1:第1章 开始启程,你的第一行Android代码覆盖哪些正式节点和主线?
问题 2:怎样为第1章 开始启程,你的第一行Android代码建立最小可执行实验?
问题 3:为什么“把IDE绿色运行按钮当成构建理解,未记录SDK版本、Gradle依赖、清单合并、资源生成和设备状态”会破坏结论?
问题 4:如何设计能推翻本章实现的反例?
问题 5:从Android 10迁移到目标SDK时怎样控制变量?
问题 6:第1章 开始启程,你的第一行Android代码达到独立交接标准需要什么?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 生命周期
- 由系统回调驱动、描述组件从创建到销毁及可见交互阶段的状态机。
- 持久状态
- 跨配置变更或进程重建仍能恢复的最小业务事实。
- 所有者
- 负责创建、取消并最终释放组件、任务或资源的明确作用域。
- 版本边界
- Android版本、targetSdk、设备形态、权限、网络与厂商实现共同形成的行为适用范围。
- 证据链
- 可由测试重放并以日志、状态快照、截图或产物校验支持的结论链。
← 上一页:《第一行代码 Android(第3版)》权威学习地图 · 下一页:第2章 探究新语言,快速入门Kotlin编程 →