首页 > 代码库 > 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命令行的封装,方便我们使用。

注意事项


  1. 当使用自定义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);

    }
}

特性

  1. 支持标准的多模块 Gradle 工程的增量构建
  2. 并发执行增量编译任务
  3. 进程级别异常隔离机制,App Crash后,仍然可以通过增量编译来修复
  4. 支持 so 动态更新
  5. 支持 resource.arsc 缓存
  6. 支持 retrolambda
  7. 支持 DataBinding
  8. 支持各类主流注解库(APT)
  9. 支持 Windows,Linux,Mac 平台
  10. 大多数情况下增量编译可以在10s内完成
  11. 支持大多数场景的增量编译

以下列表为 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+ 的设备。

局限性


  1. 第一次增量资源编译即全量编译的时候可能会有点慢,因为需要额外传递一个完整的资源包
  2. 不支持删除带id的资源,否则可能导致aapt编译出错
  3. 暂不支持抽象类的增量编译
  4. 部分 APT 插件可能需要单独适配
  5. 不支持开启 Jack 编译
    想要使用 lambda 的话,先使用 Retrolambda 吧
  6. 不支持 Kotlin / Groovy / Scala
  7. 在简单的工程上,与其他构建方案相比,没有明显的优势

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 开源项目

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Android Freeline加速编译App方案 使用和总结