开发环境准备
1. 安装 JDK
- 先确认项目所用 Gradle Wrapper 与 Android Gradle Plugin 对 JDK 的要求,再安装匹配的 Temurin/OpenJDK 发行版。
- macOS 可通过 Homebrew 安装:
brew install --cask temurin(Homebrew cask 信息);Windows 可使用对应的 MSI 安装包。
2. 安装 Android Studio
- 选择与项目 Android Gradle Plugin 兼容的稳定版。通过 SDK Manager 安装项目
compileSdk对应的平台、Build Tools 和 Platform Tools;模拟器或特定设备需要的组件再按需添加。
3. 配置 Kotlin DSL 项目
新建项目时选择 Empty Activity,语言选择 Kotlin,构建脚本默认使用 Gradle Kotlin DSL(build.gradle.kts)。
// 根目录 settings.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
include(":app")
Kotlin 基本语法回顾
1. 入口函数与包结构
package com.example.hellokt
fun main() {
println("Hello Kotlin")
}
package声明需位于文件顶部。- Kotlin 默认将顶层函数编译为静态方法,Android 中常用于工具类函数。
2. 变量与常量
val appName: String = "Demo" // 只读
var counter: Int = 0 // 可变
val lazyValue by lazy {
"初始化只会执行一次"
}
- 默认采用类型推断,可省略类型声明。
lateinit var可用于延迟初始化的可变属性(仅限非原始类型)。
3. 字符串模板
val name = "Android"
val version = 14
val message = "Hello $name, API $version"
4. 空安全
val text: String? = null
val length = text?.length ?: 0
fun displayLength(value: String?): Int {
val text = requireNotNull(value) { "value must not be null" }
return text.length
}
Android 工程结构速览
app/
├── build.gradle.kts // 模块配置
├── src/main/
│ ├── AndroidManifest.xml
│ ├── java/ // Kotlin/Java 源码
│ ├── res/ // 资源文件
│ └── assets/
└── src/test/ // 单元测试
示例中的 SDK 和依赖版本来自后续修订,并非文章原始发布时的配置。这里主要展示配置字段的位置;新工程应按所选 Android Gradle Plugin、Gradle Wrapper、JDK 与 compileSdk 组合确定实际版本:
android {
namespace = "com.example.demo"
compileSdk = 34
defaultConfig {
applicationId = "com.example.demo"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.13.1")
implementation("androidx.appcompat:appcompat:1.7.0")
testImplementation("junit:junit:4.13.2")
}
IDE 效率提升技巧
- Live Templates:输入
logd自动展开Log.d(TAG, "message")。 - Kotlin Code Style:在
Settings > Editor > Code Style > Kotlin选择Set from... > Kotlin style guide;步骤见 Kotlin 官方编码规范。 - 代码检查:开启
ktlint或detekt,确保团队风格一致。
常见问题排查
| 问题 | 可能原因 | 解决办法 |
|---|---|---|
| Gradle 构建失败 | Gradle 使用的 JDK 与项目要求不匹配 | 检查终端的 JAVA_HOME、Android Studio 选定的 Gradle JDK 和 Gradle Wrapper;项目需要固定 Gradle JDK 时,gradle.properties 使用 org.gradle.java.home,而不是 JAVA_HOME(Gradle 文档) |
| Kotlin 插件版本冲突 | Kotlin Gradle Plugin、Gradle 与 Android Gradle Plugin 版本不匹配 | 对照项目使用的插件兼容要求,成组调整版本 |
| 设备无法运行 | USB 调试未开启 | 在开发者选项中开启 USB 调试 |
Dart 开发者可以先对照这些语法
有 Dart 背景时,语法对照能帮助快速建立直觉。相似写法不代表运行语义相同,尤其是 Future/协程、Stream/Flow 和对象组合方式;迁移时还要看 Kotlin API 的生命周期与调度规则。
| Dart | Kotlin | 对照时留意 |
|---|---|---|
final x = 1; | val x = 1 | 两者都限制重新赋值;集合对象本身仍可能可变 |
var x = 1; | var x = 1 | 都允许重新赋值,类型规则仍由各自语言决定 |
String? value = null; | val value: String? = null | 都用 ? 标记可空类型,后续解包规则不同 |
future.then(...) | suspend 函数与协程作用域 | suspend 调用需要协程上下文,并不等同于 Future 链式调用 |
Stream<T> | Flow<T> | 两者都表达异步数据序列,收集、取消与背压语义要看具体实现 |
mixin | 接口默认实现或委托 | 组合机制不同,不能按关键字一一替换 |
.. 级联 | apply { ... } | apply 返回接收者,但可执行语句和可用类型各有边界 |
is 类型测试 | is 类型检查与智能转换 | 条件分支中都可按检查结果缩小类型 |
迁移中常碰到的几个细节:
- 分号:Dart 语句通常以分号结束;Kotlin 允许省略行末分号,团队一般交给格式化工具统一风格。
- 静态成员:Kotlin 使用顶层声明或
companion object。后者是伴生对象,适用范围与 Dart 的static不完全相同。 - 协程生命周期:Kotlin 的
CoroutineScope和Job负责组织任务与取消。Dart 的 Future/Stream 使用另一套模型,迁移异步流程时应重新定义所有权和取消时机。
Android Studio 基于 IntelliJ 平台并内置 Kotlin 支持。实际构建时,应按项目的 Gradle Wrapper、JDK 和 Kotlin 插件版本配置环境;单纯安装 IDE 插件无法替代这些版本约束。
