首页 > 代码库 > Android Freeline加速编译App方案 使用和总结
Android Freeline加速编译App方案 使用和总结
Freeline简介
在Android Studio还没推出Instant Run功能之前,每次修改Android 工程项目时都要将整个项目重新编译一次,然后再将资源和代码文件打包成APK文件传输到手机上安装运行。这个过程是非常耗时间的,在配置较低的PC上一般需要高达3分钟以上,配置较高的PC最低也需要1分钟以上的时间。程序猿每天无数次修改代码然后编译运行都要浪费很多宝贵的时间,之后在Android Studio2.0之后推出了Instant Run功能,也就是交换技术即Swap,来加速Android Studio的编译和部署的速度。注意的是安装时间还是受限于测试手机的性能,毕竟配置高的手机安装软件的速度肯定要比配置低的要更快一点。
再到2016年8月,阿里蚂蚁金服团队开源了Freeline库来加速Android Studio的编译和部署的速度。下面一段是官方对Freeline的介绍:
Freeline 是什么?
Freeline 是一款 Android 平台上的秒级编译方案,能够显著地提高 Android 工程的编译速度。
在Google的Instant Run库里,分为4种模式,Hot Swap,Cold Swap,Warm Swap和Full Apk四种模式,Android Studio则根据你对代码的修改来选择这四种模式其中的一种来编译和部署,每种模式对应的情景都是不同的,大家可以参考下面链接中的文章:
你真的了解 Instant Run 吗?
Instant Run
由于Hot Swap,Cold Swap和Warm Swap这三种模式覆盖的情景很少,使用条件很有限,所以基本很多情况下都会执行Full Apk,即重新完全编译和安装Apk,可见Instant Run的效率很低。Freeline就是为了解决这种局面,使我们对代码修改后的运行能尽可能去使用Swap模式,而不是Full Apk。目前其他加速编译过程的技术手段还有修改Gradle构建任务,组件化开发,迁移构建系统到buck上等等。
在这样的背景下,蚂蚁金服的大佬们就开发了Freeline来加速Android工程的构建,Freeline只有极地的侵入性,也就是我们不用编写多余的代码来运行,却能极大地提高Android工程师们的开发效率,大多数增量构建能够在10秒内,甚至1秒完成,基本上告别了Gradle的卡,慢,和降低对Cpu的利用率。
使用方法
由于Freeline是利用python来执行命令行的,所以我们就必须在电脑上安装 Python 2.7+,注意是 Python 2.7+,目前还不支持Python3+。可以在一下链接下载:
https://www.python.org/downloads/release/python-2713/
注意要下载对应的版本,有32位和64位版本。
下载完后根据软件提示 默认安装,一路点next就可以了。
安装完后就需要进行环境设置了,桌面 右键我的电脑,选择属性-高级系统设置
选择高级选项卡下面的 环境变量,打开环境变量对话框,在系统变量下面选中Path,然后编辑:
点击编辑环境变量对话框中选择编辑文本,在变量值后面添加如下:
;C:\Python27
注意前面有个英文分号 ; 。
之后就打开Android Studio ,点击左上角的File - Setting,在打开的Setting对话框中选择Plugins,然后点击 Browse repositories:
搜索freeline就可以找到对应的插件了,然后安装即可,最后重启Android Studio:
重启后在Android Studio的运行按钮旁边就会多出来一个蓝色的Freeline Logo按钮:
这样就完成Freeline的配置了。使用也很简单,只需要点击Freeline按钮就可以,第一次使用的时候,插件会自动检测是否安装了 Freeline,如果没有安装的话会弹出提示,按照提示点击“确定”,插件就会自动为你修改配置文件,并自动安装 Freeline 的依赖文件。第一次运行需要全量编译,所以需要耗时很久,一般大项目起码10分钟左右,小项目也需要几分钟至少,请耐心等待。
只有最后命令行界面出现 下面输出时才算完成全量编译:
完成了全量编译后,以后每次修改代码后就可以点击Freeline按钮来进行增量编译了,提升了编译和部署的速度,大大提高了开发效率,据官方称可以到秒级。
可以点击Android Studio下方的工具栏中的Freeline Console控制台来输入python命令或者查看日志输出:
如命令>python freeline.py 就是Run Freeline的命令了,跟点击Freeling按钮运行的效果是一样的,Freeling插件就是对python命令行的封装,方便我们使用。
注意事项
- 当使用自定义Application时,需要进行一些build.gradle文件进行一些配置。需要修改的配置项为excludeHackClasses:
excludeHackClasses
引入版本:0.5.0
参数类型:List[String]
默认值:[]
参数说明:打包过程中,freeline 会对 class 进行插桩,默认会跳过父类为> android/app/Application的类。如果你有特殊需求需要绕过插桩,可以通过这个配置项进行配置
假设自定义Application类为MyApplication,我们需要在项目app的build.gralde的Android节点中添加如下内容:
android {
....//省略
freeline {
excludeHackClasses=[‘MyApplication.class‘]
}
}
然后在MyApplication的onCreate方法中调用Freeline的初始化方法:
public class MyApplication extends Application {
@Override
public void onCreate(){
super.onCreate();
FreelineCore.init(this);
}
}
特性
- 支持标准的多模块 Gradle 工程的增量构建
- 并发执行增量编译任务
- 进程级别异常隔离机制,App Crash后,仍然可以通过增量编译来修复
- 支持 so 动态更新
- 支持 resource.arsc 缓存
- 支持 retrolambda
- 支持 DataBinding
- 支持各类主流注解库(APT)
- 支持 Windows,Linux,Mac 平台
- 大多数情况下增量编译可以在10s内完成
- 支持大多数场景的增量编译
以下列表为 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+ 的设备。
局限性
- 第一次增量资源编译即全量编译的时候可能会有点慢,因为需要额外传递一个完整的资源包
- 不支持删除带id的资源,否则可能导致aapt编译出错
- 暂不支持抽象类的增量编译
- 部分 APT 插件可能需要单独适配
- 不支持开启 Jack 编译
想要使用 lambda 的话,先使用 Retrolambda 吧
- 不支持 Kotlin / Groovy / Scala
- 在简单的工程上,与其他构建方案相比,没有明显的优势
Freeline 在以下几种情况下会自动进行全量编译:
- 发现 AndroidManifest.xml 有修改
- 发现 build.gradle 文件有修改
- 发现有超过 20 个 Java 文件有修改过(通常在使用 git 切换分支的情况会出现)
原理
Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队在Android平台上的一个基于动态替换的编译方案,稳定性方面:完善的基线对齐,进程级别异常隔离机制。性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想, 并对代码及资源编译流程做了深入的性能优化。
总结来说,Freeline就是一个增量编译方案,主要是为了加快开发过程中项目编译速度,目前只支持debug模式非混淆的开发。Freeline 本质上是热更新技术在编译期的运用,通过对同一个 apk 进行持续地热更新来达到增量编译的效果。基于 Freeline 进行修改,也能够实现线上应用的热修复以及 A/B Test。
Freeline 的具体原理可参考以下文章:
Freeline - Android平台上的秒级编译方案
Android秒级编译工具Freeline新特性支持!
总结
目前Android Studio最新的版本2.3,经过本人的几次对Instant Run和Freeline进行一些测试,得出的一些数据。
中小项目测试:
Instant Run 增量编译时间:
Freeline 增量编译时间:
从小项目的测试结果中可以得出,最新版本Android Studio 中对Instant Run的优化已经很好了,比Freeline快一点点,所以小项目中使用Freeline并不比其他方案有优势。
大项目测试:
由于自己的项目引用了外部SDK,导致Freeline运行失败,可能后期Freeline团队会持续改进吧,所以提醒大家在使用这个方案时,请务必进行项目调研,分析是否适合开发需求,尽量符合Freeline的开发要求。但是第一次运行Freeline的全量编译时间却是很可怕的,足足跑了456秒,但是只要全量编译之后,以后运行的时候几乎都是增量编译了,这点不用担心了:
另一个优点就是Freeline对Cpu的消耗比较小,使用Instant Run时CPU占用率很高,导致笔记本电脑风扇呼呼狂转,但是使用Freeline就清凉很多了,对Cpu占用率稍低,应该是内部使用了多线程并发执行增量编译任务。
参考资料:
https://www.freelinebuild.com Freeline官方网站
https://github.com/alibaba/freeline Freeline 开源项目
Android Freeline加速编译App方案 使用和总结