跳到正文Lab学后总结 · Jimmy Huang's BlogLab学后总结
本页目录· 59 条
1. 一句话总结这个 Lab
这个 Lab 教你从零开始搭建 Android 开发环境,用 Android Studio 创建第一个 HelloWorld / Jetpack Compose 项目,在 AVD 模拟器上运行,并学会用 Gradle、Preview、Build Output、Logcat 和 Debug 排查基础错误。
2. 这个 Lab 实际做了什么
按实验流程来看,这个 Lab 不是在做一个复杂 App,而是在带你完成“第一次 Android 开发全流程”:
2.1 安装并启动 Android Studio
你首先需要安装 Android Studio。材料中提到使用的是 2025 年 7 月标准使用的 Narwhal 版本。
可以把 Android Studio 理解成 Android 开发的“总工作台”:写代码、配置项目、构建项目、运行 App、查看错误信息,基本都在这里完成。
2.2 创建一个新的 Android 项目
你使用 Empty Activity 模板创建一个名为 HelloWorld 的项目。
这个步骤的意义是:Android Studio 会帮你生成一个最小可运行的 Android App 骨架,而不是让你从空文件夹手写所有配置。
创建后,项目里会出现很多文件。初学者最需要先关注两个:
2.3 理解 MainActivity.kt 的作用
材料中可见的核心代码大致如下:
这段代码的核心逻辑是:
MainActivity 是 App 打开后的入口。
onCreate() 是 Activity 创建时自动运行的方法。
setContent { ... } 告诉 Android:这个 App 的界面由 Jetpack Compose 来画。
Greeting() 是一个可组合 UI 函数,负责显示文字。
@Preview 让你不用每次启动模拟器,也能在 Android Studio 里预览界面。
2.4 修改 Gradle 配置并同步
材料提到需要理解和修改 build.gradle.kts,尤其是:
每次修改 Gradle 文件后,你要点击 Sync Now。
原因是:Gradle 文件不是普通代码,它更像“项目说明书”。改了说明书之后,Android Studio 必须重新读取说明书,才能知道应该怎么编译项目。
2.5 构建项目
材料提到可以通过 Make Module 或 Make Project 来构建项目。
构建的意思不是“打开 App”,而是先检查代码、依赖和配置能不能被正确编译成 Android 可以运行的程序。
2.6 创建并运行 Android 虚拟设备 AVD
你通过 Device Manager 创建一个 Android Virtual Device,也就是 AVD 模拟器。
硬件设备:例如 Pixel 6
系统镜像:例如 API 36
创建好 AVD 之后,你可以把 App 运行到这个模拟器里,看到类似 Hello Android 或修改后的 Welcome to FIT5046 的文字。
2.7 修改 UI 并用 Preview 查看效果
你会把默认文字改成类似 Welcome to FIT5046。
这一步的意义是让你明白:Jetpack Compose 的 UI 是由 Kotlin 函数写出来的,不是传统拖拽界面。
2.8 故意制造错误并学习排错
材料提到会故意注释掉必填参数来触发错误,然后通过以下工具定位问题:
这一步非常重要,因为真实开发中不是只会“照着写代码”,更重要的是能看懂哪里错了、为什么错了、怎么修。
2.9 讨论核心构建概念
Gradle 文件
dependencies
repositories
minSdk
compileSdk
targetSdk
这些概念是后面做更复杂 Android App 时一定会反复遇到的基础。
3. 每个核心组件有什么用
3.1 Android Studio
Android 官方开发工具,相当于写 Android App 的集成工作台。
负责创建项目、编辑代码、配置 Gradle、创建模拟器、运行 App、查看错误。
你仍然可以理论上用命令行开发 Android,但对初学者来说会非常困难,因为很多配置和调试工具都需要自己处理。
Android Studio 把 Gradle、AVD、Logcat、Debug、Compose Preview 等工具整合到一个界面里。
3.2 Empty Activity
Android Studio 提供的一个项目模板。
帮你生成一个最小可运行的 Android App 项目结构。
你需要手动创建 Activity、Gradle 配置、主题、包结构等文件,容易出错。
Empty Activity 生成 MainActivity.kt,并为 Jetpack Compose UI 提供基础项目骨架。
3.3 MainActivity.kt
通过 onCreate() 和 setContent { ... } 启动 Compose UI,让屏幕上显示内容。
MainActivity 调用 Compose 函数,例如 Greeting(),最终显示 Text() 组件。
3.4 Jetpack Compose
Android 现代 UI 开发框架,用 Kotlin 函数声明界面。
负责画出屏幕上的文字,例如 Welcome to FIT5046。
你可能需要使用旧式 XML 布局或其他 UI 方式来写界面。
MainActivity 使用 setContent 进入 Compose 世界,Compose 里面再用 Text、Scaffold 等组件构建界面。
3.5 @Composable
一个标记,表示这个函数是 Compose UI 函数。
让 Greeting() 能够被 Compose 识别并渲染成界面。
普通 Kotlin 函数不能直接作为 Compose UI 被渲染。
@Composable 函数通常会调用 Text()、Button()、Column() 等 Compose UI 组件。
3.6 Text
显示 Welcome to FIT5046! 这样的文本。
Text() 被放在 Greeting() 里,Greeting() 又被 MainActivity 调用。
3.7 Scaffold
Compose Material Design 里的页面基础结构组件。
给页面提供一个基本框架,并处理内部 padding 等布局细节。
简单文字仍然可以显示,但页面结构和边距处理会更原始,后续加入 Top Bar、Bottom Bar 等会更麻烦。
Scaffold 包住 Greeting(),并把 innerPadding 传给内部内容,避免内容和系统栏/布局区域冲突。
3.8 Modifier
Compose 中用于修改 UI 外观、大小、边距、点击行为等的工具链。
例如 Modifier.fillMaxSize() 让组件填满可用空间,Modifier.padding(innerPadding) 设置内边距。
UI 仍然可能显示,但你很难精细控制它的位置、大小和交互。
几乎每个 Compose UI 组件都可以接收 Modifier 来调整表现。
3.9 @Preview
让你在 Android Studio 里直接预览 Greeting() 的 UI 效果。
你每次改界面都可能需要运行模拟器才能看到效果,开发效率更低。
@Preview 通常放在一个单独的预览函数上,函数内部调用真实的 Compose UI。
3.10 Gradle
负责编译代码、下载依赖、读取 SDK 配置、把项目打包成可运行 App。
Android Studio 调用 Gradle 来构建项目;build.gradle.kts 是 Gradle 读取的配置文件。
3.11 build.gradle.kts
Gradle 的 Kotlin DSL 配置文件。
Gradle 不知道项目该怎么编译,也不知道需要哪些库。
修改它之后需要 Sync Now,让 Android Studio 和 Gradle 重新同步配置。
3.12 dependencies
让项目能使用 Compose、Material3 等功能。
你在代码里使用某些类或函数时,项目可能会提示找不到。
dependencies 写在 Gradle 文件里,由 Gradle 从 repositories 下载。
3.13 repositories
依赖库下载来源,例如 Google 或 Maven Central 仓库。
即使你写了 dependencies,Gradle 也可能不知道从哪里下载这些依赖。
repositories 像“仓库地址”,dependencies 像“购物清单”,Gradle 像“采购员”。
3.14 minSdk / compileSdk / targetSdk
Android 项目中非常重要的 SDK 版本配置。
minSdk:App 最低支持哪个 Android 版本。
compileSdk:项目用哪个 Android SDK 来编译。
targetSdk:App 声明自己针对哪个 Android 版本做了适配。
项目无法明确兼容范围和编译目标,构建配置会不完整。
它们通常配置在 Gradle 文件里,修改后需要同步。
3.15 AVD / Emulator
Android Virtual Device,也就是 Android 模拟器。
模拟一台 Android 手机,比如 Pixel 6 + API 36,让你不用真机也能运行 App。
你可能只能连接真实 Android 手机测试;如果没有真机,就看不到 App 实际运行效果。
Android Studio 通过 Device Manager 创建 AVD,再把构建好的 App 安装并运行到模拟器上。
3.16 Build Output
当代码或 Gradle 配置出错时,帮你看到编译阶段的问题。
你只知道“失败了”,但不知道具体失败在哪一行或哪个配置。
Gradle 构建失败时,错误信息通常会出现在 Build Output。
3.17 Logcat
App 运行后如果崩溃或行为异常,你很难知道运行时发生了什么。
App 在 AVD 或真机上运行时,Logcat 可以显示运行日志。
3.18 Debug / Breakpoint
让程序在某一行暂停,方便你检查变量、执行顺序和代码逻辑。
你只能靠猜或打印日志来判断代码执行情况,效率较低。
Debug 通常和 Android Studio、运行中的 App、断点一起使用。
4. 用初学者类比解释
4.1 Android Studio = 你的装修公司 + 办公室 + 工具间
你需要一个地方来设计店面、检查图纸、联系施工队、测试开门营业效果。
Android Studio 就是这个综合工作台。
4.2 Empty Activity = 基础店铺模板
你不想从水泥地开始建房子,所以选择一个“基础店铺模板”。
这个模板已经帮你准备好了门、墙、基本电路和一个空房间。
Empty Activity 就是最简单的 Android App 模板。
4.3 MainActivity.kt = 店铺正门和前台
onCreate() 就像店开门那一刻要做的初始化工作。
setContent { ... } 就像告诉前台:“今天店里面要摆这些东西。”
4.4 Jetpack Compose = 摆放店内物品的方式
Compose 更像用积木摆界面:我要一个文字,就写 Text();我要一列内容,就写 Column();我要按钮,就写 Button()。
这个 Lab 里主要是摆了一个文字牌:Welcome to FIT5046!
4.5 Gradle = 项目管家 / 施工总管
要用哪个 SDK?
要下载哪些库?
代码能不能编译?
最后能不能打包成 App?
4.6 build.gradle.kts = 施工说明书
build.gradle.kts 就像写给施工队的说明书。
你改了说明书之后,施工队不会自动知道,所以要点 Sync Now,相当于通知施工队:“请重新读取最新说明书。”
4.7 AVD 模拟器 = 样板房 / 试营业手机
你可以在这台“样板手机”里试运行 App,看它是不是真的能打开、文字是不是显示正常。
4.8 Build Output / Logcat / Debug = 三种排错工具
Build Output 像施工验收报告:没建起来时,看哪里违反规则。
Logcat 像店里的监控录像:店已经开了,但运行中出问题,就看日志。
Debug 像让时间暂停:你让程序停在某一步,慢慢检查每个变量和执行过程。
5. 重点区分容易混淆的概念
5.1 Android Studio 和 Android SDK 的区别
Android SDK 是开发 Android App 需要的工具包和平台 API。
Android Studio = 厨房
Android SDK = 锅、刀、炉子、调料
5.2 Gradle 和 build.gradle.kts 的区别
build.gradle.kts 是写给 Gradle 看的配置文件。
Gradle = 施工队
build.gradle.kts = 施工图纸
5.3 dependencies 和 repositories 的区别
dependencies = 购物清单
repositories = 超市地址
Gradle = 帮你去买东西的人
只写购物清单但不告诉去哪买,可能买不到。只写超市地址但不写买什么,也没有意义。
5.4 minSdk / compileSdk / targetSdk 的区别
compileSdk 高不等于你的 App 只能运行在高版本系统上。真正影响最低运行版本的是 minSdk。
5.5 Sync、Build、Run 的区别
不要把 Build 当成已经在手机上打开 App。
5.6 AVD 和真实手机的区别
AVD 的好处是方便、可重复、可以创建不同系统版本。
5.7 @Composable 和 @Preview 的区别
@Composable 表示这个函数是一个 Compose UI 组件。
@Preview 表示这个函数可以在 Android Studio 里预览。
一个函数能被预览,通常需要它本身或它调用的内容是 Compose UI。
但 @Preview 不等于真实运行,它只是 IDE 里的预览效果。
5.8 Build Output 和 Logcat 的区别
例如:语法错误、依赖错误、Gradle 配置错误。
例如:App 已经启动后崩溃、运行时异常、你自己打印的日志。
5.9 哪个是入口、哪个是界面、哪个是配置?
5.10 权限控制、网络控制、数据库在哪里?
这个 Lab 的可见材料主要是 Android 开发环境、HelloWorld 项目、Gradle、AVD 和调试工具。
页面可见内容没有显示具体数据库、后端 API、网络权限、云网络或安全组配置。
所以如果问“哪个是数据库”“哪个是网络控制”,本 Lab 可见材料中没有明确对应内容,不能编造。
6. 这个 Lab 有什么实际用途
这个 Lab 的实际价值在于:它是后面所有 Android App 开发的地基。
6.1 对真实 Android 项目的用途
创建项目。
配置 Gradle。
写 MainActivity 或其他界面入口。
使用 Compose 写 UI。
在模拟器或真机上运行。
根据错误信息修 Bug。
调整 SDK、依赖和项目配置。
这个 Lab 让你先在最小项目里理解这些动作,避免后面项目变复杂时完全看不懂。
6.2 对后端开发的用途
虽然这个 Lab 本身不是后端 Lab,但它为后续移动端连接后端打基础。
以后 App 需要调用 REST API、Firebase、数据库或云服务时,你仍然需要先懂:
App 从哪里启动;
UI 怎么显示;
依赖怎么加;
构建失败怎么看;
运行时错误怎么看。
6.3 对 DevOps / CI 的用途
Gradle 构建不是只在本地 Android Studio 里发生。
真实团队可能会在 GitLab CI、GitHub Actions 或其他 CI/CD 系统里自动运行 Gradle 构建。
所以这个 Lab 里的 build.gradle.kts、dependencies、SDK 版本、Build Output,都是以后理解自动化构建的基础。
6.4 对调试能力的用途
很多初学者最大的问题不是“不会抄代码”,而是“一报错就不知道看哪里”。
这个 Lab 特意让你接触 Build Output、Logcat 和 Debug,就是为了培养最基础的排错能力。
真实项目里,能不能快速定位错误,会直接影响开发效率。
6.5 对安全和兼容性的用途
minSdk、compileSdk、targetSdk 不只是配置数字。
App 支持哪些 Android 设备;
能不能使用新版 Android API;
App 是否遵守新系统版本的行为要求;
后续发布和兼容性测试。
本 Lab 只是入门,但这些概念在真实发布 App 时非常关键。
7. 最后画一张生动形象的示意图
下面是一个适合初学者理解的流程图。它不是图片文件,而是写在 Markdown 里的 Mermaid 图。
图的读法
你在 Android Studio 里创建 HelloWorld 项目。
项目里的 MainActivity.kt 是 App 入口。
MainActivity 通过 setContent 显示 Compose UI。
Greeting() 和 Text() 负责显示文字。
build.gradle.kts 负责告诉 Gradle 怎么构建。
修改 Gradle 后要 Sync Now。
构建成功后,App 才能运行到 AVD 模拟器。
出错时,根据错误阶段选择:构建失败看 Build Output
运行异常看 Logcat
逻辑不清楚用 Debug
最后复习一句话
这个 Lab 的核心不是“做了一个很厉害的 App”,而是让你掌握 Android 开发的第一条完整链路:
Android Studio 创建项目 → Gradle 同步和构建 → MainActivity 启动 Compose UI → AVD 运行 → Preview / Logcat / Debug 辅助开发和排错。
package com.example.helloworld
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.helloworld.ui.theme.HelloWorldTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
HelloWorldTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "FIT5046",
modifier = Modifier.padding(innerPadding)
)
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Welcome to$name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
HelloWorldTheme {
Greeting("FIT5046")
}
}
flowchart TB
Title["Lab Week 1:从 Android Studio 到第一个 HelloWorld App"]
U["学生 / 开发者"] --> AS["Android Studio<br/>开发工作台"]
AS --> P["创建 Empty Activity<br/>HelloWorld 项目"]
P --> MA["MainActivity.kt<br/>App 入口"]
MA --> OC["onCreate()<br/>App 打开时执行"]
OC --> SC["setContent { }<br/>进入 Compose UI"]
SC --> UI["Jetpack Compose UI<br/>Greeting() + Text()"]
UI --> TXT["屏幕文字<br/>Welcome to FIT5046!"]
AS --> G["build.gradle.kts<br/>项目构建说明书"]
G --> SYNC["Sync Now<br/>同步 Gradle 配置"]
SYNC --> BUILD["Build / Make Project<br/>检查能否编译"]
BUILD --> RUN["Run<br/>安装并启动 App"]
AS --> AVD["Device Manager<br/>创建 AVD 模拟器"]
AVD --> EMU["Pixel 6 / API 36<br/>虚拟 Android 手机"]
RUN --> EMU
EMU --> RESULT["看到 App 运行效果<br/>Hello Android / Welcome to FIT5046"]
UI --> PRE["@Preview<br/>IDE 内预览 UI"]
PRE --> VIEW["Split / Design View<br/>不用每次都启动模拟器"]
BUILD --> ERR{"出错了吗?"}
ERR -- "构建失败" --> BO["Build Output<br/>看编译/Gradle 错误"]
ERR -- "运行后异常" --> LC["Logcat<br/>看运行时日志"]
ERR -- "逻辑看不懂" --> DB["Debug + Breakpoint<br/>暂停逐行检查"]
G -. "❌ 改了 Gradle 不点 Sync<br/>配置可能不会生效" .-> X1["被阻止:配置未同步"]
P -. "❌ 没有 AVD 或真机<br/>无法看到实际运行效果" .-> X2["被阻止:无法运行 App"]
PRE -. "❌ Preview 只是预览<br/>不能完全替代真机/模拟器测试" .-> X3["注意:预览 ≠ 最终测试"]
subgraph KEY["你要记住的核心区别"]
K1["MainActivity = App 入口"]
K2["Compose = 写界面"]
K3["Gradle = 构建和依赖管理"]
K4["AVD = 模拟手机运行 App"]
K5["Build Output / Logcat / Debug = 三类排错工具"]
end
classDef red fill:#ffe6e6,stroke:#d33,stroke-width:2px,color:#900;
classDef blue fill:#eef7ff,stroke:#357abd,stroke-width:1px,color:#123;
classDef green fill:#ecfff1,stroke:#2c8a4a,stroke-width:1px,color:#123;
classDef yellow fill:#fff8dc,stroke:#b58900,stroke-width:1px,color:#123;
class X1,X2,X3 red;
class AS,G,MA,UI,AVD blue;
class RESULT,TXT green;
class BO,LC,DB yellow;