首页 > 代码库 > Android Freeline加速编译App方案 使用和总结

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

Freeline简单介绍

在Android Studio还没推出Instant Run功能之前,每次改动Android project项目时都要将整个项目又一次编译一次,然后再将资源和代码文件打包成APK文件传输到手机上安装执行。这个过程是非常耗时间的,在配置较低的PC上一般须要高达3分钟以上。配置较高的PC最低也须要1分钟以上的时间。程序员每天无数次改动代码然后编译执行都要浪费非常多宝贵的时间。之后在Android Studio2.0之后推出了Instant Run功能,也就是交换技术即Swap,来加速Android Studio的编译和部署的速度。

注意的是安装时间还是受限于測试手机的性能。毕竟配置高的手机安装软件的速度肯定要比配置低的要更快一点。

再到2016年8月,阿里蚂蚁金服团队开源了Freeline库来加速Android Studio的编译和部署的速度。

以下一段是官方对Freeline的介绍:

Freeline 是什么?
Freeline 是一款 Android 平台上的秒级编译方案。能够显著地提高 Android project的编译速度。

在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来加速Androidproject的构建,Freeline仅仅有极地的侵入性。也就是我们不用编写多余的代码来执行。却能极大地提高Androidproject师们的开发效率,大多数增量构建能够在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的执行button旁边就会多出来一个蓝色的Freeline Logobutton:
技术分享

这样就完毕Freeline的配置了。使用也非常easy,仅仅须要点击Freelinebutton就能够,第一次使用的时候,插件会自己主动检測是否安装了 Freeline,假设没有安装的话会弹出提示。依照提示点击“确定”。插件就会自己主动为你改动配置文件,并自己主动安装 Freeline 的依赖文件。第一次执行须要全量编译,所以须要耗时非常久,一般大项目起码10分钟左右,小项目也须要几分钟至少,请耐心等待。
技术分享

仅仅有最后命令行界面出现 以下输出时才算完毕全量编译:
技术分享

完毕了全量编译后,以后每次改动代码后就能够点击Freelinebutton来进行增量编译了。提升了编译和部署的速度,大大提高了开发效率,据官方称能够到秒级。

能够点击Android Studio下方的工具栏中的Freeline Console控制台来输入python命令或者查看日志输出:
技术分享

如命令>python freeline.py 就是Run Freeline的命令了,跟点击Freelingbutton执行的效果是一样的。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 project的增量构建
  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. 在简单的project上,与其它构建方案相比,没有明显的优势

Freeline 在以下几种情况下会自己主动进行全量编译:

  • 发现 AndroidManifest.xml 有改动
  • 发现 build.gradle 文件有改动
  • 发现有超过 20 个 Java 文件有改动过(通常在使用 git 切换分支的情况会出现)

原理

Freeline是蚂蚁金服旗下一站式理財平台蚂蚁聚宝团队在Android平台上的一个基于动态替换的编译方案。稳定性方面:完好的基线对齐,进程级别异常隔离机制。性能方面:内部採用了相似Facebook的开源工具buck的多project多任务并发思想, 并对代码及资源编译流程做了深入的性能优化。
总结来说,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占用率稍低,应该是内部使用了多线程并发执行增量编译任务。建议电脑配置低或低版本号的Android Studio的童鞋能够试试Freeline。

參考资料:
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方案 使用和总结