1. 核心概念:一句话概括
- Jetpack : 一套组件、工具和指南的集合。它的目的是帮助开发者遵循最佳实践,减少样板代码,并让应用在各种 Android 版本和设备上都能一致地工作。
- AndroidX : Jetpack 组件的 "包装"和"命名空间" 。它是 Android 支持库的重新设计和替代品,所有 Jetpack 组件都存放在
androidx这个命名空间下。
可以把它们的关系理解为:
Jetpack 是一个"品牌"或"生态",而 AndroidX 是这个品牌下所有产品的"包装规格"和"出厂标准"。
2. 详细介绍
AndroidX
是什么?
AndroidX 是对原始 Android 支持库(Android Support Library)的重大改进和替代。在 AndroidX 出现之前,开发者使用像 com.android.support:appcompat-v7 这样的支持库。
为什么需要它?
- 统一的命名空间 : 旧的支持库包名混乱(
com.android.support.*),与 Android 操作系统本身的包名(android.*)容易混淆。AndroidX 将所有库都迁移到清晰的androidx.*命名空间下。 - 独立的版本控制 : AndroidX 下的每个库(如
androidx.appcompat,androidx.lifecycle)都有自己独立的版本号,不再与 Android 平台版本绑定。这意味着你可以单独更新某个库,而不必等待整个系统更新。 - 更好的语义化版本: 遵循严格的语义化版本控制,让开发者更清楚地了解版本升级带来的变化。
- 更好的打包和模块化: 库被拆分得更细,你可以只引入你需要的部分,减少应用体积。
总结:AndroidX 是一个基础设施层面的改进,为 Jetpack 组件提供了统一的"家"。
Jetpack
是什么?
Jetpack 是一个由 Google 精心策划的组件集合,旨在加速 Android 应用开发。它不是一个单一的库,而是一个"全家桶",涵盖了应用开发的各个方面。
为什么需要它?
- 遵循最佳实践: Jetpack 组件内置了 Google 推荐的最佳架构和实践(如 MVVM),帮助开发者构建健壮、可测试和可维护的应用。
- 消除样板代码 : 例如,
ViewModel和LiveData可以帮你以生命周期感知的方式管理界面相关的数据,无需手动处理生命周期带来的各种问题。 - 保证向后兼容: Jetpack 组件通常会在旧版 Android 系统上提供新功能的实现,让你能轻松使用新 API,而无需担心系统版本碎片化。
- 简化复杂任务 : 例如,使用
Room库操作 SQLite 数据库,使用WorkManager管理后台任务,都比使用原生 API 简单得多。
Jetpack 的组成部分:
Jetpack 被分为四个大类:
-
架构组件(Architecture) : 构建稳健、可测试、可维护应用的核心。
Data Binding: 以声明方式将布局界面组件绑定到应用中的数据源。Lifecycle: 管理 Activity 和 Fragment 的生命周期。LiveData: 在底层数据发生变化时通知视图的可观察数据持有者。ViewModel: 以注重生命周期的方式存储和管理界面相关的数据。Room: SQLite 数据库的抽象层,提供编译时校验和便利的 API。Navigation: 处理应用内导航。Paging: 逐步从数据源加载信息。
-
界面组件(UI) : 提供各种界面控件和辅助工具。
Fragment: 模块化的界面组件。Layout: 用于排列视图的 XML 布局。AppCompat: 让应用在新版 Android 上也能拥有 Material Design 外观。Emoji: 确保设备在系统未更新时也能显示最新的 emoji。Transition: 处理界面之间的动画过渡。Palette: 从图片中提取有意义的颜色。
-
行为组件(Behavior) : 与标准 Android 服务集成。
Download Manager: 处理长时间运行的 HTTP 文件下载。Media & Playback: 用于媒体播放和路由(向后兼容)。Notifications: 提供向后兼容的通知 API。Permissions: 用于检查和请求应用权限。Sharing: 提供共享操作(如ShareActionProvider)。Slices: 在 Google 搜索等地方展示应用的交互式内容。
-
基础组件(Foundation) : 提供横向功能,如向后兼容、测试和 Kotlin 语言支持。
AppCompat: 为旧版 Android 提供 Material Design 的实现。Android KTX: 提供了一系列 Kotlin 扩展函数,让代码更简洁、更地道。Multidex: 为方法数超过 64K 的应用提供支持。Test: 用于进行单元测试和仪器测试的框架。
3. 区别与联系
| 特性 | Jetpack | AndroidX |
|---|---|---|
| 定义 | 一套组件、工具和指南的集合(一个"生态"或"品牌")。 | Jetpack 组件的官方命名空间和包结构(一个"包装标准")。 |
| 范围 | 广泛,包含架构、UI、行为、基础等超过 100 个库。 | 具体,是所有 Jetpack 库的包名前缀。 |
| 关系 | 内容。Jetpack 定义了"有什么库"和"这些库能做什么"。 | 形式。AndroidX 定义了"这些库叫什么"和"如何被引入项目"。 |
| 类比 | 如同 "宜家家居" 这个品牌,它提供卧室、厨房、客厅等各种系列的家具。 | 如同宜家所有产品都遵循的 "平板包装"和"Allen Key 组装" 标准。 |
核心联系:
所有 Jetpack 组件都使用 AndroidX 命名空间。 当你使用 Jetpack 时,你实际上是在使用 androidx.* 包下的库。
4. 用法示例
1. 在项目中配置
首先,在你的项目的 build.gradle 文件中,确保已经配置了 AndroidX:
gradle
ini
// 在 gradle.properties 文件中(如果没有则添加)
android.useAndroidX=true
android.enableJetifier=true // 这个标志表示自动迁移旧的依赖到 AndroidX
2. 添加依赖
然后,在你的 App 模块的 build.gradle 文件中,添加你需要的 Jetpack 组件(即 AndroidX 库)。
示例 1:使用 ViewModel 和 LiveData(架构组件)
gradle
kotlin
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-java8:$lifecycle_version"
}
在代码中使用:
kotlin
kotlin
// MainActivity.kt
class MainActivity : AppCompatActivity() {
// 通过 ViewModelProvider 获取 ViewModel 实例
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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<String>()
// 对外暴露不可变的 LiveData,防止外部修改
val myData: LiveData<String> = _myData
fun updateData(newData: String) {
_myData.value = newData
}
}
示例 2:使用 Room(架构组件)
gradle
kotlin
dependencies {
def room_version = "2.5.2"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // 对于 Kotlin,使用 kapt。Java 用 annotationProcessor
// 可选 - Kotlin 扩展和协程支持
implementation "androidx.room:room-ktx:$room_version"
}
在代码中使用:
kotlin
less
// 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<User>
@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.java, "database-name"
).build()
// 使用 DAO
val users = db.userDao().getAll()
总结
- AndroidX 是基础设施 ,是所有现代 Android 支持库的新家(
androidx.*包名) 。 - Jetpack 是建立在 AndroidX 之上的一套强大的开发工具集,它提供了构建优秀应用所需的各种组件和架构指导。
对于开发者来说,你不需要在"使用 AndroidX"和"使用 Jetpack"之间做选择 。当你开始一个新项目时,Android Studio 默认会使用 AndroidX。而当你引入任何一个 androidx.* 包下的库时,你就在使用 Jetpack。它们是现代 Android 开发的基石,强烈建议所有新项目都基于它们进行开发。