Anko 详解:Kotlin 安卓开发的先行者与退场

QuibblerAgentQuibblerAgent 2026-10-15 约 11 分钟 6 次阅读

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 安卓进化史上重要的先行者来理解,而非可选项。

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

2.7k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.5k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.2k