一、背景
前不久的 Googel IO
大会上亮相的 JetPack ,他为android 开发带来了极大地便利,于是开启了尝(爬)鲜(坑)之旅。
自从接手了一个 MVVM
架构的项目,就喜欢上了这种模式的开发,使用 Kotlin
开发,里面用到了 Databinding,LiveData、Lifecycler 和 viewmodel 等架构组件,代码简洁,流程清晰,整个开发是十分愉快的,慢慢的习惯了用这些东西。
这些组件都是吸引人的,如果还没有了解的可以上手试试。
二、Jetpack 简介
官网介绍:Jetpack 是一套库、工具和架构指南,可以帮助我们快速轻松的构建优秀的Android应用,它提供了公共基础代码,因此我们可以专注于让自己应用独一无二的东西。
主要有三个有点:
- 加速开发
组件可以单独使用或者组合是使用,同时利用 Kotlin 语言功能,可以使开发效率更高。 - 消除样板代码
Android Jetpack管理诸如后台任务,导航和生命周期管理等繁琐的活动,因此您可以专注于什么使您的应用更棒 - 构建搞质量健全的应用
以现代设计实践为基础,Android Jetpack组件可降低崩溃次数并减少内存泄漏,并向后兼容
其中包含组件如下图所示:
以下是官方博客中的图,更加直白:
以上内容来自 Google 官方jetpack文档,更多 jetpack 使用及介绍相关内容请参考官方文档。
三、AS 3.2 爬坑
3.1 转换过项目为 androidx
将项目转换成了 androidx
的,具体转换步骤如下:
- 将项目编译的sdk 版本调成
android-P
- 从AS 菜单栏选择
Refactor
->Refactor to AndroidX ..
如下为转换前gradle文件:
如下为转换后gradle文件:
官方博客介绍:Hello World, AndroidX
更多转换库依赖可参考 Google maven repo
3.2 databinding + kotlin
习惯使用 kotlin 开发,配合 databinding 进行数据绑定,但是两者生成的 BR
会冲突,解决办法是 使用 kapt
依赖 databinding, 如果 项目的是这样的:
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
}
那么 model 中的依赖应该是下面的:
// ...
apply plugin: "kotlin-kapt"
android {
// ...
databinding {
enabled = true
}
kapt {
generateStubs = true
}
}
dependencies {
// ...
kapt "com.android.databinding:compiler:3.1.1"
}
$\color{red}{注意: 两者依赖的版本要一致,否者编译时就会抛出异常}$
然后我的 金丝雀 中 使用的 android plugin version
是 3.2.0-alpha16
,但是 databinding compile
的版本却没有与之对应的,导致无法依赖使用,折腾了很久没有解决就只好将其移除,放弃使用。还天真的以为是 AS 的 bug ,然后傻傻的去 Issue Tracker 给 Google 提了个 bug 。
最近在 看官方文档时,发现了 $\color{red}{androidx}$,而且在访问 Google maven repo 时 也看到了很多 androidx
的身影,如下图:
3.3 navigation 使用
由于上面将项目转换成 androidx
,而使用 navigation
时,需要在xml 中使用 fragment
标签,但在运行时会抛出找不到 android.support.v4.app.Fragment
的问题,
在 stackoverflow 上有类似的问题,在 google 的 issuetracker 上有相关bug的反馈,点击查看,官方回复下个版本修复,如下图:
$\color{red}{所以: 玩 navigation 的不要用 androidx,或者等下个版本修复}$
上述项目地址:https://github.com/imtianx/JetpackLearning
这里简记最近体验AS3.2经历的坑!