很多 Android 开发者第一次接触 Jetpack 和 AndroidX 时,都会把它们当成同义词:一个像平台能力,一个像依赖前缀,名字总是一起出现。这篇文章把两者拆开讲清楚,再结合配置方式和常见组件示例,帮助你判断它们各自负责什么、项目里为什么几乎总会同时出现。
Jetpack 和 AndroidX,先用一句话分清
如果只保留一个最实用的判断标准,可以这样理解:
- Jetpack:一套组件、工具和开发指南的集合,目标是帮助开发者遵循最佳实践、减少样板代码,并让应用在不同 Android 版本和设备上更稳定地工作。
- AndroidX:Jetpack 组件所使用的统一命名空间和包结构,也是 Android 支持库升级后的新体系。现代 Android 库大多放在
androidx这个命名空间下。
换个更容易记的说法:Jetpack 更像“生态和内容”,AndroidX 更像“命名规则和基础设施”。你看到的是 androidx.* 的依赖名,使用到的往往是 Jetpack 提供的能力。
AndroidX 到底解决了什么问题
它是什么
AndroidX 是对早期 Android Support Library 的一次系统性重构和替代。在 AndroidX 之前,很多项目会使用类似 com.android.support:appcompat-v7 这样的支持库;进入新体系后,这些能力被迁移到更清晰的 androidx.* 命名空间中。

为什么要从支持库走向 AndroidX
- 统一命名空间
旧支持库使用com.android.support.*,和系统自身的android.*容易让人混淆。AndroidX 统一迁移到androidx.*后,库归库、平台归平台,识别成本低很多。 - 库可以独立发布版本
AndroidX 下的各个库,比如androidx.appcompat、androidx.lifecycle,都有自己的版本号,不再强依赖整个平台节奏。开发者可以按需升级单个组件,而不必等待系统级更新。 - 语义化版本更清晰
版本规则更明确,升级时对兼容性、功能变更和风险的判断也更容易。 - 模块拆分更细
你只需要引入当前功能真正依赖的部分,而不是把一整套大包都带进项目里。这对控制应用体积、梳理依赖关系都更有帮助。
所以,AndroidX 本质上不是某个具体功能库,而是现代 Android 组件体系的“新家底”。它把库的组织方式、命名方式和演进方式都重新整理了一遍。

Jetpack 是什么,为什么现代 Android 开发离不开它
Jetpack 不是单个库,而是一整套能力集合
Jetpack 是 Google 推出的 Android 开发组件集合。它不是一个可以一次性引入的单独依赖,而是一组围绕实际开发问题设计出来的库、工具和指导原则,覆盖架构设计、界面开发、后台任务、数据持久化、测试、Kotlin 支持等多个方面。
Jetpack 主要解决哪些实际开发问题
- 把推荐实践做成现成组件
例如围绕 MVVM 等常见架构思路,Jetpack 提供了可直接落地的基础组件,让项目更容易保持可维护、可测试的结构。 - 减少样板代码
像ViewModel、LiveData这类组件,本质上是在帮你处理那些本来要自己写、而且容易写错的生命周期和状态管理逻辑。 - 改善旧版本兼容成本
很多 Jetpack 组件会在旧版 Android 上提供一致的行为或者兼容实现,让你更放心地使用较新的开发模式。 - 把复杂能力封装成更顺手的 API
例如用Room管理 SQLite、用WorkManager管理后台任务,通常都比直接操作原生 API 更直观,也更接近日常业务开发需求。
Jetpack 的四大类组成
Jetpack 一般可以按能力范围分成四类:
1. 架构组件(Architecture)
这部分主要服务于应用结构、数据流和可维护性:
Data Binding:以声明方式把界面组件和数据源绑定起来。Lifecycle:感知并管理 Activity、Fragment 的生命周期。LiveData:数据变化时自动通知界面层。ViewModel:以生命周期友好的方式存储和管理界面数据。Room:SQLite 抽象层,带编译时校验和更方便的数据库 API。Navigation:处理应用内页面导航。Paging:按需、分批加载数据。
2. 界面组件(UI)
这部分围绕界面开发和视觉体验:
Fragment:模块化的界面构件。Layout:用于组织视图层级的布局系统。AppCompat:在不同系统版本上提供一致的界面体验。Emoji:在系统未更新时也尽量正确显示新 emoji。Transition:处理界面切换动画。Palette:从图片中提取主题颜色。
3. 行为组件(Behavior)
这类组件主要负责与系统服务或跨组件行为衔接:
Download Manager:管理长时间运行的 HTTP 下载任务。Media & Playback:媒体播放与路由相关支持。Notifications:向后兼容的通知 API。Permissions:权限检查和请求。Sharing:共享能力支持,例如ShareActionProvider。Slices:在 Google 搜索等场景中展示应用的交互内容。
4. 基础组件(Foundation)
这部分提供的是横向底层能力:
AppCompat:为旧版 Android 提供 Material Design 相关支持。Android KTX:提供一组 Kotlin 扩展函数,让写法更简洁。Multidex:支持方法数超过 64K 的应用。Test:单元测试与仪器测试支持框架。
从这个结构就能看出来,Jetpack 说的是“你可以用哪些现代开发组件来搭建应用”,而不是单纯的某个包名或某种配置开关。
Jetpack 和 AndroidX 的区别与联系
如果把两者并排来看,差别会更直观:
| 特性 | Jetpack | AndroidX |
|---|---|---|
| 定义 | 一套组件、工具和指南的集合,是现代 Android 开发生态的一部分。 | Jetpack 组件普遍采用的官方命名空间和包结构。 |
| 范围 | 覆盖架构、UI、行为、基础等多个方向,包含大量库。 | 更具体,主要体现在 androidx.* 这一套依赖和包名前缀上。 |
| 关注点 | 关注“有哪些能力可用,以及这些能力解决什么问题”。 | 关注“这些库如何命名、如何组织、如何引入项目”。 |
| 关系 | 偏内容和能力层。 | 偏承载这些内容的组织和标准层。 |
最关键的一点是:所有 Jetpack 组件都使用 AndroidX 命名空间。 也就是说,当你在项目里引入 androidx.lifecycle、androidx.room 这样的依赖时,看到的是 AndroidX 的包结构,用到的则是 Jetpack 的组件能力。
因此,对现代 Android 项目来说,通常不存在“二选一”这回事。它们本来就是协同出现的:AndroidX 提供统一容器,Jetpack 提供具体能力。
项目里怎么用:配置方式与常见示例
先开启 AndroidX 配置
在项目中,首先要确保 AndroidX 已启用。常见做法是在 gradle.properties 中加入以下配置:

// 在 gradle.properties 文件中(如果没有则添加)
android.useAndroidX=true
android.enableJetifier=true // 这个标志表示自动迁移旧的依赖到 AndroidX
这里的 android.useAndroidX=true 表示项目明确使用 AndroidX;android.enableJetifier=true 的作用,则是帮助仍依赖旧支持库的三方库做自动迁移兼容。
示例一:引入 ViewModel 和 LiveData
这组依赖属于 Jetpack 的架构组件,但实际添加时会体现为 AndroidX 依赖:
dependencies {
def lifecycle_version = "2.6.2"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// 可选 - 生命周期感知组件,如默认的 LifecycleObserver
implementation "androidx.lifecycle:lifecycle-common-ja va8:$lifecycle_version"
}
在代码层,这类组件的价值主要体现在生命周期安全和界面数据管理上:
// MainActivity.kt
class MainActivity : AppCompatActivity() {
// 通过 ViewModelProvider 获取 ViewModel 实例
private val viewModel: MainViewModel by viewModels()
override fun onCreate(sa vedInstanceState: Bundle?) {
super.onCreate(sa vedInstanceState)
setContentView(R.layout.activity_main)
// 观察 LiveData,当数据变化时自动更新 UI
viewModel.myData.observe(this) { data ->
// 更新 TextView 或其他 UI 组件
textView.text = data
}
}
}
// MainViewModel.kt
class MainViewModel : ViewModel() {
// 使用 MutableLiveData 来持有可以被改变的数据
private val _myData = MutableLiveData()
// 对外暴露不可变的 LiveData,防止外部修改
val myData: LiveData = _myData
fun updateData(newData: String) {
_myData.value = newData
}
}
这个例子很能说明 Jetpack 的定位:它不是简单给你几个 API,而是把常见的界面状态保存、数据观察和生命周期协同整理成一套默认可用的模式。
示例二:使用 Room 操作本地数据库
Room 也是 Jetpack 中最常见的架构组件之一。引入依赖时同样使用的是 AndroidX 命名空间:
dependencies {
def room_version = "2.5.2"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // 对于 Kotlin,使用 kapt。Ja va 用 annotationProcessor
// 可选 - Kotlin 扩展和协程支持
implementation "androidx.room:room-ktx:$room_version"
}
对应代码通常包括实体、DAO 和数据库定义三部分:
// 1. 定义数据实体(Entity)
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String,
@ColumnInfo(name = "last_name") val lastName: String
)
// 2. 定义数据访问对象(DAO)
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List
@Insert
fun insertAll(vararg users: User)
}
// 3. 定义数据库(Database)
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
// 在 Activity 或 Application 中创建数据库实例
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.ja va, "database-name"
).build()
// 使用 DAO
val users = db.userDao().getAll()
如果直接操作 SQLite,开发者通常要自己维护建表、查询、对象映射和不少重复代码。Room 的价值就在于把这些基础工作抽象掉,同时保留较清晰的数据结构定义和编译期校验。
实际开发中该怎么判断和选择
对于今天的新项目,判断方法其实很简单:
- 看到
androidx.*,你面对的是 AndroidX 体系下的库组织方式。 - 看到
ViewModel、LiveData、Room、Navigation、Paging这些组件,你用到的是 Jetpack 提供的能力。 - 当 Android Studio 默认创建现代项目结构时,往往已经同时把这两部分前提准备好了。
所以更准确的结论不是“Jetpack 和 AndroidX 有什么冲突”,而是:
- AndroidX 是基础设施,是现代支持库的新体系和统一命名空间。
- Jetpack 是建立在这套体系上的组件集合,负责把现代 Android 开发常见问题做成可直接复用的解决方案。
对大多数开发者来说,你并不需要在“使用 AndroidX”还是“使用 Jetpack”之间做选择。只要项目启用了 AndroidX,并开始引入 androidx.* 下的现代组件,你实际上就已经进入了 Jetpack 的开发方式。







