Android开发初体验

搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。

学习目标

  • 能沿“Android开发初体验”的用户事件解释Android组件、状态所有者、线程与销毁边界。
  • 能围绕“搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。”改出一个可运行结果,并用前后状态而非组件数量验收。
  • 能在旋转、进程重建、拒权、离线或无效输入中选择适用反例,定位首个状态分叉。
  • 能用构建指纹、用户操作、状态快照、原始日志和行为断言独立重放结论,并标明第四版机制与现代targetSdk政策的边界。

你的第一个 Android 应用——从零到跑起来

你以前用的手机 App,背后都是别人写的代码。这一章,你来做那个人——从下载工具、点几下按钮,到自己的手机上弹出一个新界面,全程不超过一小时。

这件事的核心是一条工厂流水线:你写 Kotlin 代码和 XML 布局(原料),经过一道叫 Gradle 的工位把所有东西打包压缩,最后输出一个叫 的成品。把这个 APK 装进手机,点一下图标,你就看到了自己写的界面。

没有这条流水线会怎样?你写的几百行 Kotlin 代码永远只是一堆纯文本文件,手机一个字也不认识。这一章的每一节都在帮你把这条流水线走通一遍。

那条流水线的"成品"——APK——到底装了什么?把它剖开看一眼:

APK 解剖:一个剖开的 zip 压缩包把 .apk 后缀改成 .zip 就能直接解压,里面是这些东西MyApp.apk(= zip)classes.dex编译后的字节码(ART 运行的就是它)resources.arsc编译后的资源表(id → 资源的映射)res/图片 / 布局等资源(已编译为二进制)assets/原始资源:按原样打包,按文件名读取lib/原生库 .so(按 ABI 分目录,如 arm64-v8a)AndroidManifest.xml二进制清单:组件声明与权限META-INF/签名信息:证书与各文件摘要
APK 就是一个 zip 包:字节码(classes.dex)、资源表(resources.arsc)、res / assets / lib 各类资源、二进制清单和 META-INF 签名,全压在一起。安装时系统把它解开铺到设备上。

概念讲解

Android Studio:你的工作台

是你写 Android 应用的"主战场"。它集成了代码编辑器、模拟器、调试工具和 Gradle 构建系统——你不需要单独安装任何其他东西就能完整地开发、运行、调试一个 Android 应用。

下载安装 Android Studio 后,第一次启动会让你下载 Android SDK——这是一套包含 Android 各个版本系统镜像、开发工具的命令行工具集。从 Android Studio 官网下载最新稳定版即可,安装向导会自动帮你把 SDK 配好。

项目结构:三间房各管什么事

创建新项目时选"Empty Views Activity",你会得到一个叫 app 的模块。打开左侧项目面板,把视图从 Android 切换到 Project,你会看到一个标准 Gradle 项目的完整目录树。核心的三个目录:

app/
├── manifests/
│   └── AndroidManifest.xml    ← 应用的"身份证"
├── java/
│   └── com.example.myapp/
│       └── MainActivity.kt    ← 你的 Kotlin 代码
└── res/
    ├── layout/
    │   └── activity_main.xml  ← 界面的样子
    ├── values/
    │   ├── strings.xml        ← 文字资源
    │   └── colors.xml         ← 颜色资源
    └── drawable/              ← 图片资源
项目结构:app 模块的目录树app/应用模块(你的代码与资源都在这里)manifests/AndroidManifest.xml组件声明与权限:应用「身份证」java/com.example.app/MainActivity.ktKotlin 源码:界面的「大脑」res/资源目录(与代码分开管理)layout/UI 布局 XML:界面长什么样values/字符串 / 颜色等常量drawable/矢量图 / 图片资源mipmap/应用启动图标(多分辨率)Gradle Scripts构建脚本(怎么编、依赖谁)build.gradle.kts (项目级)全局插件与仓库配置build.gradle.kts (模块级)本模块 SDK 版本与依赖settings.gradle.kts声明工程包含哪些模块
Android Studio 项目「三间房 + 一份脚本」:manifests 放清单(身份证)、java 放 Kotlin 代码、res 放资源(布局 / 值 / 图片 / 图标),Gradle Scripts 决定怎么把它们编成 APK。

manifests/ 里放的是 ——应用的"身份证"。它告诉 Android 系统:这个应用叫什么名字、图标是哪个、里面有哪些界面(Activity)、需要哪些权限(比如联网、拍照)。

java/(或 kotlin/)放你的 Kotlin 源代码。每个界面通常对应一个 类——MainActivity 就是你应用的第一个界面。

res/ 是资源目录。layout/ 里放布局 XML 文件,定义界面上按钮、文字摆在哪里、长什么样;values/ 里放字符串、颜色等常量;drawable/ 里放图片。这种把代码和资源分开管理的方式是 Android 的核心设计理念之一。

Gradle:流水线的工位

你点"Run"按钮之后,背后真正干活的是 。它是把源码变成 APK 的自动化流水线

  1. 编译:把 Kotlin 代码编译成 Java 字节码(.class),再转成 Android 专用的 DEX 格式(.dex
  2. 打包:把 DEX 文件 + 编译后的资源 + AndroidManifest.xml 等打成一个未签名的 APK
  3. 签名:给 APK 加上数字签名(debug 模式下 Android Studio 自动用 debug 签名)
  4. 安装:通过 adb 把 APK 推送到模拟器或真机上安装
可交互
01源码.kt / .java02编译kotlinc/javac → .class03D8 / R8→ classes.dex04资源AAPT2 → resources.arsc05打包→ 未签名 APK06签名apksigner07安装adb install → 设备▼ 原料▼ 跑在设备上

第 1 / 7 步 · 源码:你写的 Kotlin / Java 文件,是这条流水线的原料

点击播放,看 Gradle 把源码逐工位加工成 APK;可暂停、单步、拖进度逐帧观察。

Gradle 构建流水线:源码 → 编译 → D8/R8 转 DEX → AAPT2 编资源 → 打包 → 签名 → adb 安装。你点的那一下「Run」,背后就是这条流水线在依次跑完每个工位。

Gradle 的配置写在 build.gradle 文件里。你有两个:项目根目录的(全局配置)和 app/ 目录下的(当前模块配置)。app/build.gradle 里最重要的几项:

android {
    namespace = "com.example.myapp"
    compileSdk = 35
 
    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 24
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
    }
}
 
dependencies {
    implementation("androidx.core:core-ktx:1.15.0")
    // ... 你的第三方库写在这里
}

applicationId 是应用的全球唯一标识,minSdk 是最低支持的 Android 版本,dependencies 里列出你依赖的第三方库。

动手:走通你的第一条流水线

下面创建一个新项目并运行它。每一步都配合实际操作。

猜一猜:点 Run 到手机上弹出界面,中间最快的步骤是哪一步?最慢的呢?做完下面全流程再看答案。

分步1 / 4

① 创建新项目

打开 Android Studio → New Project → 选 "Empty Views Activity" → Next。 在配置页填好:Name = "MyFirstApp",Package name = "com.example.myfirstapp"(保持默认即可),Language = Kotlin,Minimum SDK = API 24。 点 Finish,等待 Gradle 同步完成(底部状态栏显示 "Gradle sync finished")。

代码逐段拆解

MainActivity.kt:界面的大脑

package com.example.myfirstapp
 
import { Term } from "@/components/mdx/term";
import { Glossary, GlossaryItem } from "@/components/mdx/glossary";
import { Objectives } from "@/components/mdx/objectives";
import { ApkAnatomyDiagram } from "@/components/mdx/diagrams/apk-anatomy-diagram";
import { AndroidProjectStructureDiagram } from "@/components/mdx/diagrams/android-project-structure-diagram";
import { GradleBuildPipelineDiagram } from "@/components/mdx/diagrams/gradle-build-pipeline-diagram";
import { Step, Stepper } from "@/components/mdx/stepper";
import { Callout } from "@/components/mdx/callout";
import { Answer, Exercises } from "@/components/mdx/exercises";
import { Attribution } from "@/components/mdx/attribution";
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
 
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

逐行看:package 声明这个文件属于哪个包——和你在创建项目时填的包名一致。import 导入需要用到的类,AppCompatActivity 是 Android 官方兼容库提供的一个基类(兼容老版本 Android)。class MainActivity : AppCompatActivity() 声明你的 MainActivity 继承自 AppCompatActivity——继承了它所有现成的功能,你只需要重写(override)你需要改的部分。

onCreate(savedInstanceState: Bundle?) 是 Activity 生命周期的第一个回调——系统创建你的界面时首先调它。super.onCreate(savedInstanceState) 先让父类把该做的初始化做了(这条必须放第一行),然后 setContentView(R.layout.activity_main) 把你写的布局 XML 加载进来,变成屏幕上可见的按钮和文字。

R.layout.activity_main 里的 R 是 Android 自动生成的一个类——你放进 res/ 的每一个资源,Gradle 都会在 R 里生成一个对应的整数 ID,你的 Kotlin 代码通过这些 ID 来引用资源。

activity_main.xml:界面的骨架

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
 
</androidx.constraintlayout.widget.ConstraintLayout>

ConstraintLayout 是一种布局容器——它里面可以放各种控件(按钮、文字、图片),并通过"约束"来控制它们的位置。android:layout_width="match_parent" 意思是宽度撑满整个父容器(这里是屏幕)。TextView 是显示文字的控件,wrap_content 意思是"内容的尺寸多大我就多大"——文字有多宽,控件就多宽。

四个 app:layout_constraint... 属性把 TextView 的上下左右都约束在父容器中央——效果就是文字居中显示。

小结

  • Android Studio + Gradle 构成一条自动化流水线:源码 → 编译 → DEX 转换 → 打包 → 签名 → APK
  • 项目三间房:manifests/ 是身份证,java/ 是代码,res/ 是资源——三个分开管理
  • MainActivity.onCreate() 是应用的入口,setContentView() 把布局加载到屏幕
  • R.layout.activity_main 是布局文件的 ID,Gradle 自动生成的 R 类管理所有资源引用
  • 模拟器需要单独创建;首次运行 Gradle 较慢是正常现象

练习

问题 1:“第1章 Your First Android Application”覆盖哪些正式节点和项目主线?

问题 2:怎样建立本页最小可执行实验?

问题 3:为什么只在正常点击路径运行不能证明完成?

问题 4:怎样设计能推翻当前实现的反例?

问题 5:从第4版语境迁移到现代目标SDK时如何控制变量?

问题 6:本页达到独立交接标准需要什么?

名词解释

本章出现的专业名词,用大白话再讲一遍。

APK

Android 应用的安装包文件,本质是一个 zip 压缩包。里面装着编译好的 .dex 字节码文件、res 目录下的所有资源、AndroidManifest.xml 清单文件、以及签名信息。把 APK 传进手机点安装,你的应用就出现在桌面上了。详见本章"你的第一个 Android 应用"一节。

Android Studio

Google 官方提供的 Android 集成开发环境,基于 JetBrains IntelliJ IDEA。集成了代码编辑、模拟器管理、Gradle 构建、Logcat 日志查看、Profiler 性能分析等所有开发必需的模块。免费下载使用。详见本章"Android Studio:你的工作台"一节。

AndroidManifest.xml

每个 Android 应用根目录下必须有的 XML 清单文件。它向 Android 系统声明:应用里有哪些组件(Activity、Service 等)、需要哪些权限(联网、相机等)、支持哪些设备特性、最低和目标 SDK 版本。系统在安装 APK 前会先解析这个文件。详见本章"项目结构"一节。

Activity

Android 四大应用组件之一,代表一个用户可以交互的屏幕。每一个界面(登录页、设置页、聊天列表等)都是一个 Activity。它管理界面的生命周期(创建→可见→暂停→销毁),处理用户输入。详见本章"MainActivity 与布局文件"一节。

Gradle

Android 官方使用的自动化构建工具。你点 Run 之后,Gradle 依次执行:编译 Kotlin → 转 DEX 字节码 → 打包资源和代码 → 签名 → 生成 APK。构建规则写在 build.gradle(Kotlin DSL)文件里。详见本章"Gradle:流水线的工位"一节。

“Android开发初体验”不使用未获授权的纸书正文;InformIT出版信息授权电子版完整目录只用于确认第四版32章、269个正式目录节点和时代语境,第四版官方勘误用于识别工具链变更。下列中文解释、图示、交互、代码与练习均为独立教学重写,平台行为再以Android Developers的一手文档复核。

为什么“Android开发初体验”必须回到可观察状态

“Android开发初体验”的学习结果不是记住类名,而是能预测“搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。”在一次输入、一次重建和一次失败中的不同状态,并指出哪条Android合同产生差异。

第四版机制逐项深读

1. Your First Android Application

在“Android开发初体验”中,“1. Your First Android Application”把源码、资源、清单和Gradle配置变成可安装APK;验证要从干净构建开始,保存variant、SDK、依赖与安装后的首帧,而不是只看IDE绿色三角。

App Basics

在“Android开发初体验”中,验证“App Basics”只改变一个生命周期或外部条件,保存操作、原始日志、状态快照和用户可见断言。

Creating an Android Project

在“Android开发初体验”中,“Creating an Android Project”把源码、资源、清单和Gradle配置变成可安装APK;验证要从干净构建开始,保存variant、SDK、依赖与安装后的首帧,而不是只看IDE绿色三角。

在“Android开发初体验”中,“Navigating in Android Studio”把源码、资源、清单和Gradle配置变成可安装APK;验证要从干净构建开始,保存variant、SDK、依赖与安装后的首帧,而不是只看IDE绿色三角。

Laying Out the UI

在“Android开发初体验”中,“Laying Out the UI”若依赖第四版时期API,应分开说明原书机制与现代平台政策,并用Android官方文档核对迁移边界。

From Layout XML to View Objects

在“Android开发初体验”中,“From Layout XML to View Objects”的视觉正确性必须与语义树一致;看得见但读屏无名称、焦点不可达或点击区过小仍判失败。

Wiring Up Widgets

在“Android开发初体验”中,“Wiring Up Widgets”把约束、测量与布局落实为View树几何;用小屏、长文本与大字体验证,不能用单一模拟器截图证明适配。

Making Toasts

在“Android开发初体验”中,分析“Making Toasts”先冻结设备API、targetSdk和输入,再沿回调与数据流寻找首个状态分叉,不能只描述最终页面。

Running on the Emulator

在“Android开发初体验”中,“Running on the Emulator”服务于“搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。”;解释要落到用户事件、Android所有者、状态变化、线程和可观察结果,并给出一个会推翻实现的反例。

For the More Curious: The Android Build Process

在“Android开发初体验”中,“For the More Curious: The Android Build Process”把源码、资源、清单和Gradle配置变成可安装APK;验证要从干净构建开始,保存variant、SDK、依赖与安装后的首帧,而不是只看IDE绿色三角。

Challenges

在“Android开发初体验”中,“Challenges”用于推翻“搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。”的顺利路径:先写预期,再引入一个边界输入、重建或平台差异,并用状态、日志与用户结果解释首个分叉。

Challenge: Customizing the Toast

在“Android开发初体验”中,“Challenge: Customizing the Toast”用于推翻“搭建 Android Studio 开发环境,创建并运行你的第一个 Android 应用,看懂项目结构中的每一部分。”的顺利路径:先写预期,再引入一个边界输入、重建或平台差异,并用状态、日志与用户结果解释首个分叉。

“Android开发初体验”验收回顾

“Android开发初体验”只有在构建指纹、用户操作、状态快照、原始日志和行为断言能够从相同基线再次得到相同断言时才通过;第四版机制与现代平台政策分别记录,不用新API名称掩盖旧行为。

← 上一页:《Android Programming: The Big Nerd Ranch Guide(第4版)》权威学习地图 · 下一页:Android与MVC设计模式 →

讨论

评论区加载中…