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/

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE0MDIxNjQ0NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

注意要下载相应的版本号,有32位和64位版本号。

下载完后依据软件提示 默认安装。一路点next就能够了。



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE0MDIxNjQ0NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

安装完后就须要进行环境设置了。桌面 右键我的电脑,选择属性-高级系统设置

选择高级选项卡以下的 环境变量,打开环境变量对话框,在系统变量以下选中Path,然后编辑:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE0MDIxNjQ0NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

点击编辑环境变量对话框中选择编辑文本,在变量值后面加入例如以下:

;C:\Python27



注意前面有个英文分号 ; 。

之后就打开Android Studio ,点击左上角的File - Setting,在打开的Setting对话框中选择Plugins,然后点击 Browse repositories:

搜索freeline就能够找到相应的插件了。然后安装就可以,最后重新启动Android Studio:

重新启动后在Android Studio的执行button旁边就会多出来一个蓝色的Freeline Logobutton:

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE0MDIxNjQ0NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

完毕了全量编译后,以后每次改动代码后就能够点击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 增量编译时间:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE0MDIxNjQ0NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

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

Android Freeline加速编译App方案 使用和总结的更多相关文章

  1. Android studio 加速编译方法

    JRebel for Android 是一个Android Studio的插件,可以大大加速Android Studio的编译速度,对于小项目来说或许不明显:但是当项目达到一定的规模时,它对于Andr ...

  2. Android 秒级编译 Freeline

    http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650662410&idx=1&sn=c654fa7b0cc8c91 ...

  3. android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测

    android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测https://dev.bangcle.com/ 业内专业的应用加固服务供应商 帮助数十万APP抵御破解风险,早 ...

  4. 【转】实践最有效的提高Android Studio运行、编译速度方案

    原文:https://blog.csdn.net/xwh_1230/article/details/60961723 实践最有效的提高Android Studio运行.编译速度方案 最有效提升Andr ...

  5. Android.mk编译App源码

    在Andriod源码环境编译APP主要考虑如何引入第三方jar包和arr包的问题,初次尝试,步步是坑,这里给出一个模板: LOCAL_PATH := $(call my-dir) include $( ...

  6. 【转】高通平台android 环境配置编译及开发经验总结

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  7. Android应用开发编译框架流程与IDE及Gradle概要

    1 背景 建议阅读本文之前先阅读<Android Studio入门到精通>和<Groovy脚本基础全攻略>及<Gradle脚本基础全攻略>三篇博客作为背景知识,这样 ...

  8. Android数据库加密之sqlciher方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6241964.html 前言 大家好,我是Cavalier ...

  9. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

随机推荐

  1. npm 安装或更新模块失败的解决办法

    头一次关注npm,在刚刚安装的机子上使用更新指令却报错,我还以为是SHA512有什么问题,后来发现是因为一些网络原因,所以,如果出现错误,务必修改默认配置为国内镜像,但是在publish之前,记得要改 ...

  2. spark sql遇到的问题

    项目背景:计算平台架构hadoop spark   spark on yarn,支持多种sql引擎如hive.spark sql.impala等. 问题描述:SPARK SQL在做insert ove ...

  3. 洛谷——P1346 电车

    P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...

  4. 有的系统区apk需要对其系统签名,才能正常使用。

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 向方案公司索要platform.x509.pem 和platform.pk8这两个文件. ...

  5. 【UOJ #131】【NOI 2015】品酒大会

    http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...

  6. python基础之序列化 time random os

    序列化与反序列化 json  pickle 1.什么是序列化与反序列化? 序列化就是将内存中的数据结构转成一种中间格式储存到硬盘或者基于网络传输 反序列化是网络,硬盘将被序列化的对象重新读到内存 2. ...

  7. python学习第九十天:vue补习2

    Vue 八.重要指令 v-bind <!-- 值a --> <div v-bind:class='"a"'></div> <!-- 变量a ...

  8. 使用redis时出现java.util.ArrayList cannot be cast to java.lang.Long

    java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long at redis.clients. ...

  9. IE主页被篡改为360导航终极处理办法

    不得不吐槽360真他妈是流氓至极,在不被用户许可的情况下直接修改用户浏览器默认主页,还不容易找到修改的地方. 以IE为例:我们将其首页设置为百度https://www.baidu.com/,终极处理办 ...

  10. NHibernate 存储过程 第十四篇

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...