Freeline是由蚂蚁聚宝Android团队开发的一款针对Android平台的增量编译工具。它可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时。
Freeline能够为Android开发者节省很多喝杯咖啡的时间 : )
之前在其他渠道已经对freeline以及JRebel还有Instant Run有过了解。Instant Run不多说,亲儿子,但是效果不是很好,甚至让你的app莫名其妙整出其他bug出来。JRebel也不错,可以试试,就是需要付费这点比较头疼。介绍freeline的文章很多,但是我觉得使用过程写的都过于简单。虽然最后看看这玩意的集成并不复杂,但是初次集成还是有很多弯路要走
功能
- 支持标准的多模块Gradle工程的增量构建
- 并发执行增量编译任务
- 进程级别异常隔离机制
- 支持so动态更新
- 支持resource.arsc缓存
- 支持retrolambda
- 支持DataBinding
- 支持各类主流注解库
- 支持Windows,Linux,Mac平台
以下列表为Freeline支持的热更新情况:
| | Java | drawable, layout, etc. | res/values | native so |
|:-------------:|:-------------:|:-------------:|:-------------:|
|add| √| √| √| √|
|change| √| √| √| √|
|remove| √| √| x| -|
Freeline已经分别在API 17,19,22,23的Android模拟器、Android 6.0 Nexus 6P以及Android 4.4锤子手机上经过测试。如果想要充分体验Freeline增量编译的速度的话,最好使用Android 5.0+的设备。
截止到目前0.8.3版本,还有几处限制要注意:
- 不支持删除带id的资源,否则可能导致aapt编译出错。其实这里我发现只要对资源文件进行操作,都有可能发生资源文件的错乱,这个还是很尴尬的,只能手动全量更新了
- 暂不支持抽象类的增量编译。可怜的base
- 不支持开启 Jack 编译
- 不支持 Kotlin/Groovy/Scala
使用
- 文件夹的添加
首先把freeline工程下载好,注意里面的runtime文件夹。runtime的主要作用是在Application启动时重载ClassLoader,插入dex,从而实现增量修改的目的。来看看sample里面的settings.gradle对它的处理
includeFlat 'runtime'
include ':runtime:runtime'
include ':runtime:runtime-no-op'
去主工程的上一级目录去寻找runtime文件夹,然后引用其中的runtime与runtime-no-op库。这个环节官方并没有进行说明,我在使用Sample时一开始没有添加这个模块,然后就出问题了。
- gradle脚本的添加
(1) settings.gradle添加,刚也说过了
(2)工程目录下的build.gradle
classpath 'com.antfortune.freeline:gradle:0.8.3'
(3)项目主模块app下的build.gradle
apply plugin: 'com.antfortune.freeline'
freeline {
hack true
autoDependency false
}
debugCompile project(":runtime:runtime")
- 下载python 和二进制依赖
在命令行中执行
gradle initFreeline -Pmirror
初始化成功,将配置信息写入json中
gradle initFreeline -Pmirror
文件下载成功之后项目目录结构
真正的打包等操作,均由python脚本来控制,所以这里一定要搭建python环境,且版本号低于3
-
保险起见,我们这时候clean Project然后Sync Project
-
第一次我们执行全量编译
python freeline.py -f
虽然上面写的是请等待1分钟,但是视项目的大小耐心等待下直到成功吧
python freeline.py -f
一般情况下成功之后,app就被启动了
- 增量编译
我在使用增量编译的时候,当时是0.8.2,出现applicationId与packageName不一致出错的问题,现在0.8.3修复了,所以可以愉快的耍了
python freeline.py
一共花费2.9s搞定
其他
- 遇到问题请去freeline提issue,开发者还是很用心的,回复评论的速度都很快,这个必须赞
- freeline版本发生升级,务必需要执行gradle initFreeline -Pmirror下载新版本资源,runtime文件夹也要随更新一起更新
- 建议使用freeline的插件直接编译,免去手动敲命令的劳累,路径为Preferences → Plugins → Browse repositories
- gradle的任何改变都会触发全量更新
- freeline目前只支持debug buildType,并且不支持混淆
- freeline的编译与as的编译应该是不兼容的,至少我这里会报错,所以两者如果发生切换必须先Clean Project
- 不支持多设备,所以你一旦换上新设备,可能会提示找不到设备。这时候,你就Clean Project或者Sync Project或者插拔手机,肯定会成功的,这点其实相当让人苦恼
网友评论