背景
曾经为了把玩Jetpack Compose,下载了AndroidX的源码并在本地编译运行。虽然现在Compose已经发布了独立aar,无需通过编译源码引入工程了,但是如果想了解AndroidX其他库的实现,或者像尝试增加自己的修改时,本地编译还是一个不错的选择,这里整理一下本地编译AndroidX源码的步骤。
下载源码
AndroidX也属于AOSP的一部分。下载AOSP源码需要使用repo。repo是一个脚本工具,可以一次性组合下载多个Git仓库。首先安装repo命令如下:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
AOSP 中我们只下载AndroidX相关的Git仓库 ,可以通过指定 androidx-master-dev 分支进行下载
$ mkdir androidx-master-dev && cd androidx-master-dev
$ repo init -u https://android.googlesource.com/platform/manifest \
-b androidx-master-dev
$ repo sync -c -j9
打开工程
AndroidX 的开发调试需要使用Android Studio。 为了避免源码与开发者手头的AS版本不兼容,下载的源码中自带了配套的AS,可以通过cmd启动:
$ cd androidx-master-dev/frameworks/support
$ ./studiow
需要注意Jetpack Compose 相对于其他组件,需要特别版本的AS才能运行,路径如下:
$ cd androidx-master-dev/frameworks/support/ui
$ ./studiow
运行demo
AndroidX 项目中包含几个Demo的APP,便于开发者和学习者进行一些参考和调试。
- support-v4-demos
- support-v7-demos
- support-transition-demos
- support-emoji-demos
- …
可以使用Android Studio编译运行,也可以直接用gradle命令运行
# build
$ ./gradlew assembleDebug
# test
$ ./gradlew support-transition:connectedCheck
提交PR
如果发现了AndroidX的bug,可以基于AndroidX主线拉一个分支,修改并经过Demo/Test验证后,向AOSP提交PR(Pull Reauest),在AOSP中一般被称为CL(Change List):
$ cd frameworks/support
# 切分支,repo start 其实是 git checkout -b 的封装
$ repo start my-change .
# 本地修改,调试,测试
# git commit
$ git add .
$ git commit
# 提交Gerrit review
$ repo upload .
# review结果修正后,追加comment 重新上传
$ git add .
$ git commit --amend
$ repo upload .
提交的comment message有一定要求,一般会自动添加 Change-id:
行,此行不能删除。
另外,需要在Change-Id上面追加测试情况 Test: {Test Class名等}
AOSP的bug会使用 issuetracker 进行管理,如果修复了issuetracker的bug,还需要追加Bug:{BugID}
本地Marven
除了本地基于源码调试以外,也可以将工程打包成本地aar使用,通过以下gradle命令发布到本地maven仓库
cd frameworks/support
./gradlew publishMavenPublicationToMavenLocal
执行后,可以在以下位置看到androidx的目录
$ ls ~/.m2/repository/androidx/
activity benchmark contentpager ....
可以确认当前androidx版本:
$ ls ~/.m2/repository/androidx/work/work-runtime-ktx/
2.3.0-rc01
在项目中配置本地marven库:
allprojects {
repositories {
google()
jcenter()
mavenLocal() // 追加本地仓库依赖
}
}
然后在module中的dependencies
中就可以依赖本地marven中的支持的AndroidX版本了
implementation 'androidx.work:work-runtime-ktx:2.3.0-rc01'