大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Android 开发概览
这一课你将能做到
- 说清楚 Android 平台架构的四层模型,以及每层与 Web 前端的对应关系
- 在 Android Studio 中创建并运行一个 Hello World 项目,理解 Gradle 构建流程
- 对比 Kotlin 与 Java 在 Android 开发中的差异,并说出为什么 Kotlin 是官方首选
为什么要学
Android 占据全球移动设备 70% 以上的份额,而 Kotlin 自 2019 年起就是 Google 官方推荐的 Android 开发语言。对于已经熟悉 Web 前端(React/Next.js)的开发者来说,Android 开发是「同一份编程思维,不同 runtime 和 UI 范式」的扩展。
人话:你会写 React 组件,就会写 Compose 函数;你会管理前端状态,就会管理 Android 的 UI State。区别只在于:Web 跑在浏览器里,Android 跑在 Linux 内核 + ART 虚拟机上;Web 用 HTML/CSS 描述界面,Android 用 Kotlin 代码直接声明。
面试中,「Android 平台架构」和「Kotlin vs Java」是必考题,答不好直接挂。
先建立图像
┌─────────────────────────────────────┐
│ 应用层 (System Apps + 你的 App) │ ← 你写的代码在这里
├─────────────────────────────────────┤
│ 应用框架层 (Java API Framework) │ ← Activity/Service/View 等
├─────────────────────────────────────┤
│ 运行时 + 原生库 (ART + C/C++ libs) │ ← ART 替代了 JVM
├─────────────────────────────────────┤
│ Linux 内核 (驱动/安全/内存管理) │ ← 和服务器 Linux 同源
└─────────────────────────────────────┘
Web 前端对比:
- 浏览器 ≈ Android Runtime (ART)
- DOM ≈ View 树 / Compose 树
- HTTP 请求 ≈ Retrofit/OkHttp 调用
- localStorage ≈ DataStore / Room
跟着做
步骤 1:安装 Android Studio 并创建项目
下载 Android Studio( Hedgehog 或更新版本),安装时勾选 Android SDK 和 Emulator。打开后选择 New Project → Empty Activity(Compose 版本),语言选 Kotlin,Minimum SDK 选 API 24(Android 7.0,覆盖 95%+ 设备)。
项目创建后,等待 Gradle 同步完成。Gradle 是 Android 的构建工具,相当于 Web 前端的 npm + webpack 合体。
步骤 2:理解项目结构
app/
├── src/
│ ├── main/
│ │ ├── java/com/example/myapp/ ← Kotlin 源码
│ │ ├── res/ ← 资源(图片、字符串、布局)
│ │ └── AndroidManifest.xml ← 应用清单,声明组件和权限
│ └── build.gradle.kts ← 模块级构建脚本
├── build.gradle.kts ← 项目级构建脚本
└── settings.gradle.kts ← 模块注册
AndroidManifest.xml 是 Android 独有的概念,相当于 Web 应用的 index.html + manifest.json 合体,声明了应用入口、所需权限、支持的屏幕方向等。
步骤 3:运行第一个 Compose 应用
打开 MainActivity.kt,默认代码如下:
package com.example.myapp
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
MyAppTheme {
Greeting("Android")
}
}
点击运行按钮(绿色三角),选择模拟器或真机,应用就会编译并安装。setContent 是 Compose 的入口,相当于 React 的 ReactDOM.render。
步骤 4:写一个带交互的计数器
把 Greeting 替换为:
@Composable
fun CounterScreen(modifier: Modifier = Modifier) {
var count by remember { mutableStateOf(0) }
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "点击次数: $count",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { count++ }) {
Text("点我 +1")
}
}
}
需要导入:
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.unit.dp
在 MainActivity.onCreate 中调用 CounterScreen()。点击按钮,数字会实时更新。这就是 Compose 的声明式 UI:状态变了,UI 自动重组。
步骤 5:对比 Kotlin 与 Java
Kotlin 与 Java 100% 互操作,但写法更简洁:
// Java: 需要 20 行的 POJO
data class User(val name: String, val age: Int)
// Java: 需要匿名内部类
button.setOnClickListener { println("clicked") }
// Java: 需要 Handler 或 RxJava
lifecycleScope.launch {
val data = repository.fetch()
_uiState.value = data
}
Kotlin 的空安全(?. 和 !!)、扩展函数、协程,都是为 Android 场景量身设计的。
讲清楚要点
-
Android 不是 JVM,是 ART:Android Runtime 使用 AOT(Ahead-of-Time)编译,安装时就把字节码编译成机器码,比 JVM 的 JIT 更省启动时间。但开发时仍然写 Kotlin/Java,编译成 DEX 字节码。
-
Gradle 是构建核心:
build.gradle.kts里声明依赖、编译配置、签名。Sync 失败 90% 是网络问题,配好代理或镜像源即可。 -
Compose 是声明式,View 是命令式:传统 View 需要
findViewById然后setText,Compose 直接描述「UI 应该长什么样」,框架自动 diff 和更新。这与 React 的 Virtual DOM 思想完全一致。 -
Activity 是入口,不是全部:一个应用可以有多个 Activity,但 Compose 时代推荐「单 Activity + 多 Compose 页面」架构,类似 Next.js 的单页应用。
-
资源系统解决适配:
res/values/strings.xml放文本,res/values-zh/strings.xml放中文,res/layout/放布局。Android 根据设备语言、屏幕密度自动选择。
你可能会懵的地方
-
Android 开发一定要学 Java 吗? 不需要。Kotlin 是官方首选,Google 的新 API 和文档都是 Kotlin 优先。但存量代码里还有大量 Java,能读懂即可,不需要主动写。
-
模拟器太慢怎么办? 用真机。开启开发者模式 → USB 调试 → 连接电脑。或者使用 Android Emulator 的 Quick Boot 快照功能。
-
Gradle Sync 一直失败? 检查
gradle-wrapper.properties里的 Gradle 版本与 Android Studio 是否匹配。国内用户建议配置阿里云 Maven 镜像。 -
Compose 和 XML 布局选哪个? 新项目一律 Compose。XML 只在维护老代码或特定场景(如自定义 View 性能极致优化)时使用。
-
Android 和 iOS 开发思路差异大吗? 架构层面很像:都是声明式 UI(Compose vs SwiftUI)、都是响应式状态管理、都有官方 DI 框架。差异在生态和 API 命名习惯。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
在 onCreate 里直接网络请求 | 阻塞主线程,ANR 崩溃 | 用 lifecycleScope.launch 或 ViewModel 里发起 |
| 所有代码写在一个 Activity 里 | 上帝类,无法测试和维护 | 拆分为 ViewModel + Repository + UseCase |
| 硬编码字符串在代码里 | 无法多语言适配 | 提取到 strings.xml |
| 忽视屏幕旋转 | 旋转后状态丢失,用户输入清空 | 用 rememberSaveable 或 ViewModel 保存状态 |
| 直接在 Composable 里读磁盘 | 阻塞 UI,掉帧 | 移交给 Dispatchers.IO 或使用 Room/DataStore |
卡点急救
-
模拟器启动后黑屏/卡住:删除 AVD 重新创建,或换用 API 30 的 x86_64 镜像。确保 BIOS 开启了虚拟化(VT-x/AMD-V)。
-
Gradle 下载依赖超时:在
settings.gradle.kts的dependencyResolutionManagement里添加阿里云镜像:maven("https://maven.aliyun.com/repository/google")。 -
应用安装后闪退:看 Logcat 过滤
AndroidRuntime,通常是ClassNotFoundException或Resources.NotFoundException,检查minSdk和依赖版本是否匹配。
面试常问
-
Android 系统架构分几层?每层职责? 四层:应用层(用户直接交互的 App)、应用框架层(Activity/Service/ContentProvider 等 Java API)、运行时与原生库(ART 虚拟机、OpenGL、SQLite 等 C/C++ 库)、Linux 内核(驱动、安全、进程管理)。ART 负责执行 DEX 字节码,与 JVM 的主要区别是 AOT 编译和针对移动设备优化的 GC。
-
Kotlin 相比 Java 在 Android 上的核心优势? 空安全(编译期避免 NPE)、协程(简化异步,替代 Callback Hell)、扩展函数(无需继承就能给现有类加方法)、data class(自动生成 equals/hashCode/toString)、与 Jetpack Compose 深度集成。
-
Gradle 在 Android 构建中做什么? 依赖管理(下载 AAR/JAR)、编译(Kotlin/Java → DEX)、打包(APK/AAB)、签名(debug/release keystore)、变体管理(debug/release/flavor)。相当于 Web 前端的 npm + webpack + babel 三合一。
自测三问
- 用一句话说明 ART 和 JVM 的区别。
- 为什么 Compose 里状态改变会自动刷新 UI?背后是什么机制?
AndroidManifest.xml里必须声明哪三类信息?
小结一句话
Android 开发 = Kotlin 语言 + Gradle 构建 + 声明式 UI + 移动设备生命周期管理;与 Web 前端思维相通,但 runtime 和分发方式完全不同。
延伸
- Android 官方入门指南
- Kotlin 官方文档
- 下一课:四大组件——Activity/Service/BroadcastReceiver/ContentProvider 的职责与生命周期。