Anko 详解:Kotlin 安卓开发的先行者与退场
如今用 Jetpack Compose 写声明式 UI 的开发者可能不知道,早在 Compose 诞生前五年,JetBrains 就官方维护过一套纯 Kotlin 的声明式 UI 方案——Kotlin/anko(Anko)。它用 DSL 取代 XML 布局、用扩展函数抹平 Android SDK 的粗糙边缘,一度是 Kotlin 安卓开发的标配;2020 年 7 月官方将其归档停维,它的思想则由 Compose 与 Android KTX 接棒。本文回顾它的四大组件、代表性用法与退场原因,既是致敬先行者,也为读懂老代码。
1、项目概述与历史地位
Anko 是 JetBrains(Kotlin 语言官方团队)推出的 Android 开发库,自我定位是"让 Android 应用开发更快更简单"——用更干净的 Kotlin 代码隐藏面向 Java 的 Android SDK 的毛边。仓库约 15.8k Star、1.3k Fork,Apache 2.0 协议,最终版本 0.10.8。
历史地位:
- 官方背书的"Kotlin 优先开发 Android"样板,带动了一代 Kotlin DSL 风格
- 其布局 DSL 是 Android 声明式 UI 的早期实践,理念由 Jetpack Compose 继承
- Commons 的大量便利函数后被 Android KTX 吸收
- 至今仍是阅读 2016-2020 年代 Kotlin 老项目时绕不开的一环
2、已归档:重要前提
进入用法之前必须先说清状态:仓库已于 2020 年 7 月 13 日归档(archived),转为只读。README 顶部明确标注"Anko is deprecated",详情在告别文档 GOODBYE.md。
这意味着:
- 不再有任何修复与更新,不再适配新 Android 版本与 AndroidX 演进
- 新项目切勿选用;老项目应规划迁移(见第 7 节)
- 但作为历史方案,其设计思想仍值得理解——尤其对照 Compose
3、四大组件全景
Anko 按功能拆成四个模块,可整体引入也可按需挑用。
// 整体引入(最终版 0.10.8)
implementation "org.jetbrains.anko:anko:$anko_version"
// 或按需引入单个 artifact
// anko-commons、anko-sdk25、anko-sqlite 等四大组件:
- Anko Commons:轻量工具箱——intents、对话框与吐司、日志、资源与尺寸
- Anko Layouts:类型安全的动态布局 DSL,无需 XML(0.10.4 起支持 ConstraintLayout,配 Android Studio 预览插件)
- Anko SQLite:查询 DSL 与结果解析器,替代裸 Cursor 操作
- Anko Coroutines:基于 kotlinx.coroutines 的工具,含 bg() 与 asReference()
4、Anko Layouts:声明式 UI 的先声
布局 DSL 是 Anko 最具辨识度的部分:用 Kotlin 函数直接"写"出界面结构,告别 XML;点击监听里还能直接写挂起函数。
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}这段代码的三个看点:
1. verticalLayout、editText、button 全是函数调用,嵌套结构即视图层级,类型安全、可重构
2. onClick 接受挂起 lambda——异步逻辑可以直接写进监听器,不必另开回调
3. toast() 是 Commons 提供的顶层函数,一行弹吐司
与 Compose 的对照:
- 相同:声明式、Kotlin DSL、函数即组件、 lambda 配置属性
- 不同:Anko 仍创建传统 View 对象,无重组与状态驱动;Compose 是真正的响应式
- 可以说 Anko 验证了"Kotlin 写 UI"的可行性,Compose 把它做成了完整范式
5、Anko Commons 与 SQLite
Commons 负责日常琐事的一行化,SQLite 则把数据库查询变成链式 DSL。
// SQLite:按姓氏查用户,替代裸 Cursor 写法
fun getUsers(db: ManagedSQLiteOpenHelper): List<User> = db.use {
db.select("Users")
.whereSimple("family_name = ?", "John")
.doExec()
.parseList(UserParser)
}能力速览:
- Commons:startActivity 的意图构建、alert / selector 对话框、log 系列、尺寸换算
- SQLite:select / whereSimple / doExec 链式查询,parseList 自动映射数据类
- 迁移提示:如今这些场景分别对应 Android KTX、Room 与 Material Dialogs
6、Anko Coroutines:bg 与 asReference
在协程尚未进入 Android 官方范式的年代,Anko 提供了两个高频工具。
两个工具:
- bg():把代码块调度到公共线程池执行,是那个时代的"后台任务一行写法"
- asReference():把对象包成弱引用,长周期异步块里持有引用而不阻止回收,避免泄漏
要点:
1. 这两个 API 是协程早期生态的产物,如今对应 Dispatchers.Default 与生命周期感知作用域
2. 老代码里的 bg() 迁移时可直接换成 withContext(Dispatchers.IO) 等标准写法
3. 泄漏防护场景则由 viewModelScope / lifecycleScope 正规解决
7、为何退场:被谁取代
Anko 的每个组件都"后继有人",归档是自然的谢幕而非意外。
继承者映射:
- 布局 DSL → Jetpack Compose:官方声明式 UI,重组与状态驱动才是完整答案
- Commons 工具 → Android KTX:官方扩展函数集覆盖了绝大多数便利 API
- SQLite DSL → Room:官方 ORM,编译期校验与迁移支持远超手写 DSL
- 协程工具 → kotlinx.coroutines + lifecycle 感知作用域
迁移建议:
1. 盘点 anko 依赖与调用点,按组件分类(布局 / Commons / SQLite / 协程)
2. Commons 调用优先替换为 Android KTX 等价函数,机械替换为主
3. SQLite DSL 分批迁移到 Room;布局 DSL 视情况迁 Compose 或暂留
4. 新代码一律不再引入 anko,逐步把依赖从 build.gradle 移除
8、总结
Anko 是 JetBrains 官方的 Kotlin 安卓开发库(约 15.8k Star、Apache 2.0、终版 0.10.8),以 Commons、Layouts、SQLite、Coroutines 四大组件,把意图、对话框、布局、数据库与后台任务全面 DSL 化;2020 年 7 月归档停维,布局思想由 Jetpack Compose 继承,工具函数由 Android KTX 接棒,数据库场景让位 Room。
它的价值今天有两层:读老代码时的必备知识,以及一条启示——Anko 证明了"用 Kotlin 声明式描述 UI"可行且受欢迎,为 Compose 的登场铺了路。对于开发者:新项目直接用 Compose + KTX + Room;维护含 Anko 的老项目时按组件映射逐步迁移。把它当作 Kotlin 安卓进化史上重要的先行者来理解,而非可选项。

