Day 1:环境搭建 安装 Android StudioAndroid Studio 是 Google 官方推出的 Android 集成开发环境IDE基于 IntelliJ IDEA 构建整合了代码编辑、编译构建、调试、性能分析和模拟器是 Android 开发的标准工具。系统要求在安装前先确认机器是否满足最低配置。Windows 平台的最低要求是 64 位 Windows 10、8 GB 内存如需同时运行模拟器建议 16 GB、8 GB 可用磁盘空间带模拟器则需 16 GB。CPU 需要支持虚拟化技术Intel VT-x 或 AMD-V并在 BIOS 中开启否则模拟器无法正常启动。下载安装与启动配置访问 developer.android.com/studio 下载最新版 Android Studio。Windows 平台推荐下载.exe安装包双击运行后按向导操作即可。安装完成后首次启动如果之前装过旧版本会提示是否导入旧配置如果是全新安装选择 “Do not import settings” 继续。接着进入 Setup Wizard选择安装类型为 Custom自定义安装进入自定义安装界面在这个界面中我们只修改Android SDK的下载路径默认的下载路径在 C 盘用户文件夹下我们需要将这个路径修改到其他盘最后确认 SDK 组件列表点击 Finish。Android Studio 会自动下载缺失的 SDK 组件这个过程可能需要几分钟取决于网络状况。安装 SDKAndroid SDKSoftware Development Kit不是单一的东西而是一组工具的集合包括各版本 Android 平台库、构建工具、平台工具adb 等、模拟器镜像等。第一步安装 Android Studio 时已经下载了基础组件但通常还需要按需追加。SDK Manager在 Android Studio 欢迎页点击 “More Actions” → “SDK Manager”或者进入项目后从菜单栏选择 Tools → SDK Manager。SDK Manager 分三个标签页按需配置即可。SDK Platforms列出所有可用的 Android 版本建议至少勾选两个最新正式版当前是 Android 17, API Level 37用于编译和调用最新 API以及一个与项目minSdk一致的较低版本比如 Android 7.0, API Level 24便于在低版本模拟器上验证兼容性。SDK Tools控制与 Android 版本无关的独立工具有三项必须保持安装工具说明Android SDK Build-Tools编译打包核心保持最新版本即可Android Emulator模拟器本体必装Android SDK Platform-Tools包含adb、fastboot等命令行工具必装SDK Update Sites是 SDK 组件的更新源地址通常不需要动。只有网络无法直连 Google 时才需要在这里添加国内镜像源如东软信息学院或中科大的 Android SDK 镜像。配置完成后点击 Apply → OKAndroid Studio 会下载并安装所选组件过程中如有防火墙或杀毒软件提示允许访问网络即可。创建第一个项目环境准备就绪之后开始创建第一个 Android 项目。在 Android Studio 欢迎页点击New Project。左侧选择Phone and Tablet右侧模板选择Empty Views Activity。这个模板只包含一个空白 Activity 和一个 “Hello World” 标签很适合从零开始理解项目结构。不要被其他花哨的模板吸引在搞清楚基础之前多出来的代码只会增加困惑。点击 Next 进入项目配置配置项填写NameHelloAndroid项目名也是默认的应用显示名Package namecom.example.helloandroid应用唯一标识反域名格式Save location选择一个你方便管理的路径LanguageKotlinMinimum SDKAPI 24: Android 7.0 (Nougat)Minimum SDK 决定了应用最低能运行在哪个 Android 版本上。API 24 覆盖了绝大多数活跃设备同时不至于牺牲太多新特性点击 “Help me choose” 可以看到各版本的设备覆盖率分布图选之前可以参考一下。Build configuration language 保持默认的Kotlin DSL即build.gradle.kts不要选 Groovy。Kotlin DSL 是当前推荐的 Gradle 脚本编写方式与工程语言统一。点击 Finish。Android Studio 开始生成项目文件并进行 Gradle 同步Sync。底部状态栏会显示进度首次同步会下载 Gradle 发行版和项目声明的依赖Kotlin 标准库、AndroidX 核心库等可能需要几分钟。同步完成后app/src/main/java/com/example/helloandroid/MainActivity.kt就是你的第一个 Kotlin 文件app/src/main/res/layout/activity_main.xml是布局文件。此时你看到的是一个可编译、可运行的最小 Android 应用。模拟器使用模拟器让你无需真机就能在电脑上运行和调试 Android 应用Android Emulator 是一台完整的虚拟 Android 设备支持自定义屏幕尺寸、API 级别和硬件配置。创建虚拟设备点击工具栏上的Device Manager图标手机图标或从菜单选择 View → Tool Windows → Device Manager。在 Device Manager 面板中点击Add a new device或 “” 号然后选择Create Virtual Device。在 Add Device 窗口中左侧选 Phone然后从列表中选择一台设备比如Pixel 7 Pro。这个选择决定了模拟器的屏幕尺寸和分辨率对布局调试很重要点击 Next。在配置设备界面初次使用需要先点击 Download 下载对应 API Level 的系统镜像。推荐选择 API 37Services 选带 “Google Play Store” 的版本包含了 Google Play 服务和一些调试工具。下载过程可能较长镜像约 2 GB取决于网络速度。其他配置根据自己的需求选择默认值一般够用。点击 Finish模拟器就创建完成了并会出现在 Device Manager 列表中。启动与使用在 Device Manager 中点击刚创建的设备右侧的 ▶ 按钮即可启动模拟器。首次启动需要完成完整的开机过程后续使用 Quick boot 会快很多。实践Hello Android创建并运行项目前面已经创建了HelloAndroid项目现在直接运行看效果。确保模拟器已经启动在 Android Studio 顶部的运行配置下拉菜单中选择app点击绿色 ▶ 按钮或 ShiftF10。Gradle 会先编译项目、生成 APK再通过 adb 推送到模拟器安装并启动首次编译较慢后续增量编译会快很多。几秒后模拟器上应该出现一个白底屏幕正中央有一行 “Hello World!” 文字。如果运行按钮是灰的检查两件事底部状态栏的 Gradle Sync 是否已经完成以及 Device Manager 中模拟器状态是否为 “Connected”。修改文字和颜色默认的文字和颜色都在资源文件里集中管理找到它们并修改就能看到即时变化。修改文字打开app/src/main/res/values/strings.xml找到app_name对应的string标签resourcesstringnameapp_name我的第一个应用/string/resources将app_name的值改为我的第一个应用。这个字符串是应用的显示名会出现在启动器的应用图标下方。要修改屏幕中间那行文字需要去布局文件app/src/main/res/layout/activity_main.xml找到android:textHello World!把它删掉然后在strings.xml中新增一个名为hello_text的字符串再在布局中引用它stringnamehello_text你好Android/string然后回到activity_main.xml将 TextView 的android:text改为android:textstring/hello_text这样做的好处是所有界面文字集中在strings.xml管理后续做国际化翻译、统一替换都很方便。直接在布局里写死字符串硬编码是 Android 开发里需要避免的习惯。修改颜色打开app/src/main/res/values/themes.xml或themes.xml (night)用于暗色模式找到color/...的引用再到res/values/colors.xml中新增颜色值colornameblue#FF1565C0/color改为你喜欢的颜色比如深蓝#FF1565C0。颜色值格式是#AARRGGBB前两位 AA 是透明度FF 完全不透明。修改完成后再次 Run模拟器上的颜色和文字就会更新。也可以点击 Run 按钮旁边的闪电图标Apply Changes这个功能只推送改动的代码和资源不需要重新安装 APK速度更快适合快速迭代 UI。Project 结构在开始写更多代码之前有必要先理解 Android 项目的目录结构。Android Studio 左侧的 Project 窗格默认以Android视图显示这个视图按功能模块组织文件隐藏了不会直接编辑的内部文件。你可以通过下拉菜单切换到Project视图它显示的是磁盘上的真实文件布局。以下是Day1项目的完整结构Day1/ ├── .gitignore ├── .gradle/ # Gradle 缓存自动生成 ├── .idea/ # IDE 工程配置 ├── .kotlin/ # Kotlin 插件缓存 ├── app/ # 主模块 │ ├── .gitignore │ ├── build.gradle.kts # 模块级构建脚本 │ └── src/ │ ├── androidTest/java/com/example/helloandroid/ │ │ └── ExampleInstrumentedTest.kt │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/com/example/helloandroid/ │ │ │ └── MainActivity.kt │ │ ├── keepRules/ │ │ │ └── rules.keep │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── ic_launcher_background.xml │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26/ │ │ ├── mipmap-hdpi/ │ │ ├── mipmap-mdpi/ │ │ ├── mipmap-xhdpi/ │ │ ├── mipmap-xxhdpi/ │ │ ├── mipmap-xxxhdpi/ │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── values-night/ │ │ │ └── themes.xml │ │ └── xml/ │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ └── test/java/com/example/helloandroid/ │ └── ExampleUnitTest.kt ├── build/ # 根项目编译输出 ├── build.gradle.kts # 项目级构建脚本 ├── gradle.properties ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle.kts下面从根目录开始自上而下逐一讲解每个文件和目录的作用。根目录文件与目录根目录下的文件大致分四类性质和处理方式各不相同。首先是自动生成的缓存目录完全不需要手动操作也不应该提交到 Git。.gradle/存放 Gradle 的构建配置缓存、文件哈希和 VCS 信息.idea/是 IDE 的工程配置记录了代码风格、运行配置、编译器设置等团队协作时只提交代码风格相关的文件其余走.gitignore.kotlin/是 Kotlin 编译器插件的会话缓存。如果 Gradle 构建行为异常比如缓存了旧依赖版本关闭 Android Studio 删掉.gradle/和build/再重新 Sync 通常能解决。.gitignore也在根目录——Android Studio 生成了根目录和app/各一份根目录的那份负责声明所有不该提交的内容。其次是 Gradle 构建脚本。settings.gradle.kts是 Gradle 启动时最先读取的文件负责定义项目名称、声明子模块include(:app)、配置插件和依赖的仓库来源。根目录下的build.gradle.kts则声明整个项目使用的插件版本统一用apply false管理——在这里锁定版本但不直接启用留给各子模块按需 apply防止不同模块各用各的版本。然后是两个配置文件处理方式截然相反。gradle.properties是团队共享的构建参数常用来调整 JVM 堆大小org.gradle.jvmargs-Xmx2048m、配置代理、启用 AndroidX 等适合提交到版本控制。local.properties则只记录当前机器的 SDK 路径sdk.dirC\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk这个文件绝对不能提交——每台机器的路径不同一旦提交其他人拉取代码后构建会直接失败。模板的.gitignore已默认排除了它但换项目时最好再确认一次。最后是 Gradle Wrapper 相关的文件。gradlewUnix和gradlew.batWindows是 Wrapper 入口脚本首次执行时会自动下载项目声明的 Gradle 版本不需要手动安装也保证了团队所有成员用同一版本构建。gradle/目录下的libs.versions.toml是 Version Catalog集中管理所有第三方依赖的版本号在build.gradle.kts中按别名引用避免多模块版本不一致wrapper/gradle-wrapper.properties声明了当前使用的 Gradle 版本和分发 URL升级 Gradle 只需改这里的 URLAndroid Studio 也支持通过 File → Project Structure → Project → Gradle Version 修改。模块目录app/app/是项目当前唯一的模块存放所有源码、资源和构建配置。大型项目会有多个模块如:lib_base、:feature_login每个结构都和app/类似各自独立编译。模块根目录下有两个文件app/.gitignore负责忽略编译产物app/build/模板同时在根目录和模块目录各放一份是为了保证模块拆出去独立运行时.gitignore依然有效。app/build.gradle.kts是模块最核心的配置文件声明了插件com.android.application表明这是一个可安装的 App对应的是com.android.library用于组件库、Android 编译参数compileSdk、minSdk、targetSdk、versionCode等以及所有第三方依赖。每次添加新库、调整支持版本范围都在这里改。后面的 Gradle 章节会逐块拆解它的内容。源码目录app/src/app/src/包含三个独立的源码集Source Setmain/是主体代码和资源所在地日常开发几乎都在这里test/是本地单元测试跑在 JVM 上执行速度极快不需要启动 Android 设备androidTest/是仪表化测试必须在真机或模拟器上运行用于测试依赖 Android 系统的功能。三者包名结构一致但各自独立编译互不干扰。主源码集app/src/main/这里是整个项目真正的工作区三个关键文件撟起了最小可运行应用的骨架。AndroidManifest.xml是应用的“身份证”声明了包名、所需权限网络、相机、定位等、四大组件Activity、Service、BroadcastReceiver、ContentProvider以及设备兼容性约束。每个 Activity 都必须在这里注册否则启动时系统会直接抛出ActivityNotFoundException崩溃。当前模板的 Manifest 很简洁只注册了 MainActivity 并配置了启动入口的 intent-filter。java/com/example/helloandroid/MainActivity.kt是第一个 Kotlin 源文件也是应用唯一的 Activity。模板使用了 Jetpack Compose用声明式代码构建 UI不再依赖 XML 和findViewByIdpackagecom.example.helloandroidimportandroid.os.Bundleimportandroidx.activity.ComponentActivityimportandroidx.activity.compose.setContentimportandroidx.compose.foundation.layout.fillMaxSizeimportandroidx.compose.material3.MaterialThemeimportandroidx.compose.material3.Surfaceimportandroidx.compose.material3.Textimportandroidx.compose.ui.Modifierimportcom.example.helloandroid.ui.theme.HelloAndroidThemeclassMainActivity:ComponentActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContent{HelloAndroidTheme{Surface(modifierModifier.fillMaxSize(),colorMaterialTheme.colorScheme.background){Text(Hello Android!)}}}}}onCreate()是 Activity 的生命周期入口setContent {}是 Compose 的入口替代了传统的setContentView()。HelloAndroidTheme和Surface提供 Material Design 3 的主题外观Text(Hello Android!)就是模拟器上显示的那行字。把它改成Text(你好)然后点 Apply Changes文字会立刻更新连重新安装 APK 都省了。还有一个keepRules/rules.keep是 R8 混淆的保留规则文件。开启 Release 混淆isMinifyEnabled true后R8 会激进地删除未被直接引用的类和方法通过反射调用的代码如 Gson 反序列化、依赖注入框架等因无法被静态分析到误删后会在运行时崩溃。rules.keep就是用来声明“这些类无论如何不能删”。模板里这个文件是空的因为目前没有需要保护的类。资源目录app/src/main/res/res/是 Android 资源系统的核心所有非代码的静态内容——布局、字符串、颜色、图片、图标——集中在这里通过目录名的限定符后缀实现多配置自动适配。图标资源分两套体系共存。drawable/下的ic_launcher_background.xml和ic_launcher_foreground.xml是矢量文件定义了自适应图标Adaptive Icon的背景层纯色方块和前景层图标主体系统根据设备 OEM 的图标形状自动裁切前景层保证在不同厂商手机上风格统一。layout/activity_main.xml是布局文件但在这个 Compose 项目里只是一个空壳根节点只有一个ComposeView真正的 UI 全由setContent {}代码定义。mipmap-anydpi-v26/存放 API 26 及以上的自适应图标入口文件不包含图像数据只是告诉系统去drawable/中合成API 26 以下的设备则回退到五个密度级别的位图目录mdpi~160dpi、hdpi1.5x、xhdpi2x、xxhdpi3x、xxxhdpi4x系统自动选择最匹配的版本加载。values/目录下的三个 XML 管理着应用所有的视觉“参数”。colors.xml定义颜色常量集中管理主题色和强调色避免在布局里散落硬编码色値strings.xml存放所有用户可见文字通过string/xxx引用——这既便于统一修改也是国际化的基础新建values-zh/strings.xml就能适配中文其他语言同理themes.xml声明应用全局的 Material Design 3 视觉样式颜色方案、状态栏颜色、默认字体等全在这里子组件没有自己指定样式时会自动继承。values-night/themes.xml是暗色模式的覆盖版本-night限定符让系统在深色主题时自动从这里加载资源颜色値换成暗色调不需要手写任何条件判断逻辑。xml/下的两个文件控制数据备份行为。backup_rules.xml是 Android 6.0 的云备份规则data_extraction_rules.xml是 Android 12 的扩展版还涵盖设备间迁移。默认配置允许应用数据全部参与备份如果存储了 token、密码等敏感信息需要用exclude明确排除。下面是backup_rules.xml的默认结构示例data-extraction-rulescloud-backupincludedomainsharedprefpath./includedomaindatabasepath./includedomainfilepath.//cloud-backup/data-extraction-rules测试目录test/下的ExampleUnitTest.kt是本地单元测试示例跑在开发机 JVM 上毫秒级执行适合测试 ViewModel 业务逻辑、数据转换、工具方法等纯 Kotlin 代码不需要启动 Android 设备。androidTest/下的ExampleInstrumentedTest.kt是仪表化测试示例必须在真机或模拟器上运行适合测试 Activity 启动流程、Fragment 交互、Room 数据库等依赖 Android 运行时的功能。两个示例都只做最基础的验证目的是确认测试框架已正常搭建好。重点Gradle 基本概念Gradle 是 Android 项目的构建系统负责把 Kotlin 源码、资源文件、第三方库整合编译成可安装的 APK。理解 Gradle 不需要从零学会 Groovy 或 Kotlin DSL 语法先把几个核心概念和文件的关系搞清楚就足够入门了。三个关键文件settings.gradle.kts是 Gradle 的入口。它定义项目名称和包含哪些模块pluginManagement{repositories{google()mavenCentral()gradlePluginPortal()}}dependencyResolutionManagement{repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories{google()mavenCentral()}}rootProject.nameHelloAndroidinclude(:app)include(:app)告诉 Gradle 这个项目有一个叫app的子模块。大型项目中可能有多个模块如:lib_base、:feature_login都在这里声明。pluginManagement和dependencyResolutionManagement分别控制插件和依赖的仓库来源。google()和mavenCentral()是 Android 开发中两个几乎必加的仓库——Google 自家的库AndroidX、Material Design 等在 google 仓库Kotlin 和其他开源库在 Maven Central。项目级build.gradle.kts根目录下的声明全局的 Gradle 插件plugins{id(com.android.application)version8.2.0applyfalseid(org.jetbrains.kotlin.android)version1.9.20applyfalse}apply false表示插件在此声明了版本但并不会应用到项目本身而是留给子模块按需apply。这样做的好处是整个项目的插件版本在根脚本里统一管理不会出现不同模块引用不同版本的问题。模块级build.gradle.ktsapp/build.gradle.kts定义真正模块级别的编译配置plugins{id(com.android.application)id(org.jetbrains.kotlin.android)}android{namespacecom.example.helloandroidcompileSdk35defaultConfig{applicationIdcom.example.helloandroidminSdk24targetSdk35versionCode1versionName1.0}buildTypes{release{isMinifyEnabledfalseproguardFiles(getDefaultProguardFile(proguard-android-optimize.txt),proguard-rules.pro)}}compileOptions{sourceCompatibilityJavaVersion.VERSION_17 targetCompatibilityJavaVersion.VERSION_17}kotlinOptions{jvmTarget17}}dependencies{implementation(androidx.core:core-ktx:1.12.0)implementation(androidx.appcompat:appcompat:1.6.1)implementation(com.google.android.material:material:1.11.0)}逐块来看plugins块真正应用了根脚本声明的插件com.android.application表明这是一个可安装运行的 App 模块如果是组件库则用com.android.library。android {}块是 Android 编译参数的集中地。namespace是代码层面的包命名空间applicationId是设备上安装时的唯一标识通常二者相同打渠道包时可以不同。compileSdk设为最新版本以调用最新 APIminSdk决定最低支持的 Android 版本低于此版本的设备无法安装targetSdk声明已充分测试的目标版本Google Play 要求这个值不能太旧否则拒绝上架。versionCode是每次发版递增的内部整数versionName是展示给用户的版本字符串。buildTypes定义构建类型release块中的isMinifyEnabled控制是否开启 R8 代码混淆proguardFiles指定混淆规则文件。dependencies {}块声明第三方库。implementation是最常用的依赖方式库只对当前模块可见不向外传递。core-ktx提供大量 Kotlin 扩展函数让原本 Java 风格的 API 更符合 Kotlin 习惯appcompat提供向后兼容的 Activity 基类material是 Google 的 Material Design 组件库。Gradle Sync 是在做什么每次修改build.gradle.kts或新增依赖后Android Studio 顶部会弹出黄色提示条 “Gradle files have changed since last project sync”提示你需要同步。Sync 的过程是 Gradle 根据你声明的插件、依赖和配置从远程仓库下载对应的 JAR/AAR 文件到本地缓存~/.gradle/caches/并生成 IDE 可识别的项目模型。同步完成后Android Studio 才有新依赖的代码补全、语法检查和跳转能力。这也是为什么每次加一个新库都要先 Sync 然后等一会儿——Gradle 要去下载这个库以及它传递依赖的所有库。Gradle Wrapper项目根目录下的gradlewWindows 上还有一个gradlew.bat就是 Gradle Wrapper。它是一个脚本会在首次执行时自动下载项目指定的 Gradle 版本不需要你手动安装 Gradle。你可以用它在命令行中执行构建任务./gradlew assembleDebug# 编译 debug 版 APK./gradlew assembleRelease# 编译 release 版 APK./gradlew clean# 清理编译产物同一个项目团队里的所有人都用 Wrapper 构建可以保证 Gradle 版本一致从根本上避免我这能编译你那不行的问题。依赖冲突怎么办刚入门的项目一般不会遇到但提前知道这个概念没坏处。当 A 库依赖 X 的 v1.0B 库依赖 X 的 v2.0 时Gradle 默认会选择最高版本v2.0来解决冲突。大多数情况下这个策略是合理的但如果 v2.0 与 v1.0 之间存在不兼容的 API 变更运行时可能崩溃。排查这类问题的方法是在 Android Studio 右侧打开 Gradle 面板找到app→Tasks→help→dependencies双击执行控制台会打印完整的依赖树。找到冲突的库用implementation(xxx) { exclude(group ..., module ...) }排除掉不需要的版本或者用constraints强制指定版本。