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. 88. Merge Sorted Array【Easy】【双指针-不用额外空间归并两个有序数组】

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...

  2. SpringBoot整合SpringSecurity简单实现登入登出从零搭建

    技术栈 : SpringBoot + SpringSecurity + jpa + freemark ,完整项目地址 : https://github.com/EalenXie/spring-secu ...

  3. Linux含交互的自动登录脚本

    近来经常要通过ssh登录服务器,每次输入命令和密码很麻烦,查资料发现有两种解决,一种是本地创建密钥直接登录,另一种是写个脚本. 这里介绍第二种方法,第一种资料也很多,但是觉得没啥意思. 先上脚本: # ...

  4. DBCS 从256开始

    ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字 ...

  5. Python lambda介绍(转)

    在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...

  6. 【jzyzoj】【p1320 patrol】 巡逻(网络流最小割例题)

    描述 Description FJ有个农场,其中有n块土地,由m条边连起来.FJ的养牛场在土地1,在土地n有个新开张的雪糕店.Bessie经常偷偷溜到雪糕店,当Bessie去的时候,FJ就要跟上她.但 ...

  7. 【数论】nefu119 组合素数

    算组合数中的素因子p的个数,基本同这题 http://www.cnblogs.com/autsky-jadek/p/6592194.html #include<cstdio> using ...

  8. 事件BOM DOM

    1.事件 1.1 事件绑定 # 1.写在html元素中 <button onclick='code'></button> # 2.把事件当作元素对象的方法 btnEle.onc ...

  9. MySQL中变量的定义和变量的赋值使用(转)

    说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解. 前 ...

  10. redis源码解析之dict数据结构

    dict 是redis中最重要的数据结构,存放结构体redisDb中. typedef struct dict { dictType *type; void *privdata; dictht ht[ ...