前言
在开始学习 Android 应用开发前,先把几个容易混在一起的概念理清楚。
Android 应用开发和 Android 系统开发有什么区别?原生应用开发为什么既有 Java,又有 Kotlin?Flutter 又属于什么?
这篇文章先把这些概念整理一下,看看现在 Android 应用开发主要有哪些技术路线。
Android 应用开发与系统开发
Android 应用开发和 Android 系统开发虽然都带有“Android”,但面向的层次并不一样。
Android 应用开发主要是在系统提供的公开 API 之上实现具体功能,比如界面、数据存储、网络请求和系统能力调用。最终产物通常是 APK 或用于发布的 Android App Bundle。
Android 系统开发则更接近 Android 本身。按照 AOSP 的系统架构,它可能涉及 Framework、系统服务、HAL、原生库,甚至 Linux 内核和设备适配。
这里主要对比普通第三方应用与 AOSP 平台或设备开发。预装应用、特权应用和设备厂商应用可能会使用系统 API,处在两者之间。
| 对比项 | Android 应用开发 | Android 系统开发 |
|---|---|---|
| 常见工作 | 界面、业务逻辑、网络和数据存储 | Framework、系统服务、HAL、原生库和内核等 |
| 主要接口 | 公开的 Android SDK 和 Jetpack 库 | AOSP 源码、系统 API 和底层接口等 |
| 常见工具 | Android Studio、Gradle 和 Android SDK | Linux、Repo、Soong 和 Android.bp 等 |
| 常见产物 | 可安装的 APK,或用于应用商店发布的 AAB | 系统组件或系统镜像 |
两者需要掌握的知识也不太一样。应用开发更关注 Android SDK、应用组件、界面和业务逻辑。系统开发则要根据所在层次,理解系统源码、编译流程、进程通信或硬件接口等内容。
当然,它们并不是完全割裂的。做应用时了解一些系统机制,会更容易理解权限、进程和生命周期等问题,但不需要一开始就编译整个 Android 系统。
这个系列主要学习 Android 应用开发,不会把重点放在 AOSP 系统移植和底层开发上。
Android 原生应用开发
这里说的“原生开发”,是指直接使用 Android 官方提供的 SDK、工具和平台能力开发应用。
Java 与 Kotlin
Android 原生应用开发常见的语言是 Java 和 Kotlin。两者都可以调用 Android API,也可以在同一个项目中共存并互相调用。
Android 在 2017 年宣布正式支持 Kotlin,又在 2019 年宣布 Android 开发将逐步转向 Kotlin 优先。官方现在建议新建 Android 应用优先从 Kotlin 开始,同时仍然继续支持 Java。
从这个时间线来看,维护时间较长的项目通常还保留着不少 Java 代码,当前新建项目则更常优先选择 Kotlin。
不过,这并不是绝对的年代分界。项目最终使用哪种语言,还会受团队经验、历史代码、依赖库和迁移成本影响。
Kotlin 与 Java 的互操作性也让老项目可以逐个文件或逐个模块引入 Kotlin,不需要为了更换语言一次性重写整个项目。
界面与构建脚本
除了编程语言,界面方案也要分开来看。传统 Android 界面通常使用 XML 描述布局,再通过 View 系统控制界面。
现在 Android 的 UI 工具、示例、文档和课程已经转向 Compose 优先。Jetpack Compose 可以直接使用 Kotlin 编写界面,因此新项目现在更倾向使用 Kotlin 和 Compose。
不过,XML 和 View 不会立刻从现有项目中消失。传统 View 目前已经进入维护模式,主要接收重要修复,但官方仍然支持它与 Compose 混合开发和逐步迁移。
构建脚本又是另外一层。较早的项目常用 Groovy 编写 build.gradle。从 Android Studio Giraffe 开始,新项目默认使用 Kotlin DSL,也就是 build.gradle.kts。
Kotlin DSL 只是 Gradle 构建脚本的写法,并不等于应用代码必须使用 Kotlin。Java 和 Kotlin 是编程语言,XML View 和 Compose 是界面方案,Groovy DSL 和 Kotlin DSL 是构建脚本写法,不要把它们混在一起。
老项目与新项目的常见技术栈
结合上面的技术变化和历年默认模板,Android 原生项目常见的技术栈大致可以分成下面几类:
| 项目情况 | 应用语言 | 界面方案 | 构建脚本 |
|---|---|---|---|
| 维护时间较长 | Java 较多,也可能混用 Kotlin | XML 与 View 较常见 | Groovy DSL 较常见 |
| 正在迁移 | Java 与 Kotlin 并存 | View 与 Compose 可能并存 | Groovy DSL 或 Kotlin DSL |
| 当前新建 | 通常优先使用 Kotlin | 更倾向 Jetpack Compose | 默认使用 Kotlin DSL |
这里整理的是常见情况,不是行业占比统计。
所以,如果准备开发新的 Android 应用,Kotlin 很适合作为入门语言。不过,如果后面需要阅读和维护老项目,了解 Java、XML 布局和 View 依然很实用。
Flutter 等跨端方案
除了 Android 原生开发,还可以使用跨端框架开发应用。这类方案通常可以复用大部分代码,同时面向 Android、iOS 或其他平台。
Flutter 是其中比较常见的方案。它主要使用 Dart 语言和 Flutter 自己的 UI 框架,可以通过一套代码库构建 Android、iOS、Web 和桌面应用。
常见的跨端方案还有 React Native,它主要使用 JavaScript 或 TypeScript 与 React 开发应用。
不过,跨端开发不等于完全不需要了解目标平台。权限、通知、后台任务和硬件能力等功能可能仍要单独处理,有时还需要在 Android 端接入 Kotlin 或 Java 原生代码。
原生和跨端各有适用的场景。怎么选,还是要看目标平台、现有技术栈、团队经验,以及应用对平台能力的依赖程度。
这个系列使用 Kotlin
作为一个刚开始学习 Android 应用开发的新手,我在打算学习官方推荐的 Kotlin 开发。因为我没学过 Java,也没有什么技术债,纯粹为了了解当前的 Android 应用是怎么一回事,后面如果如果有实际需求再补充对应知识。
总结
Android 应用开发与 Android 系统开发面向不同的层次。这个系列关注的是前者,也就是使用公开 Android API 完成具体应用。
原生 Android 应用可以使用 Java 或 Kotlin。维护时间较长的项目中常见 Java、XML View 和 Groovy DSL,当前新项目则更倾向 Kotlin、Jetpack Compose 和 Kotlin DSL,实际项目中也常常会有多种技术并存。
除了原生开发,还有 Flutter 和 React Native 等跨端方案。考虑到 Android 当前的 Kotlin-first 方向,这个系列后续会使用 Kotlin 学习 Android 原生应用开发。
参考资料
- Architecture overview | Android Open Source Project
- Try Android development | Android Open Source Project
- Android Announces Support for Kotlin
- Android’s Kotlin-first approach
- Android is Compose-first
- Migrate your build configuration from Groovy to Kotlin
- Flutter
- React Native