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/
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命令行的封装,方便我们使用。
注意事项
- 当使用自己定义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 project的增量构建
- 并发执行增量编译任务
- 进程级别异常隔离机制,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
- 在简单的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方案 使用和总结的更多相关文章
- Android studio 加速编译方法
JRebel for Android 是一个Android Studio的插件,可以大大加速Android Studio的编译速度,对于小项目来说或许不明显:但是当项目达到一定的规模时,它对于Andr ...
- Android 秒级编译 Freeline
http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650662410&idx=1&sn=c654fa7b0cc8c91 ...
- android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测
android安全检测工具,梆梆安全 - 防止反编译|APP安全加固|应用加固|盗版监测https://dev.bangcle.com/ 业内专业的应用加固服务供应商 帮助数十万APP抵御破解风险,早 ...
- 【转】实践最有效的提高Android Studio运行、编译速度方案
原文:https://blog.csdn.net/xwh_1230/article/details/60961723 实践最有效的提高Android Studio运行.编译速度方案 最有效提升Andr ...
- Android.mk编译App源码
在Andriod源码环境编译APP主要考虑如何引入第三方jar包和arr包的问题,初次尝试,步步是坑,这里给出一个模板: LOCAL_PATH := $(call my-dir) include $( ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- Android应用开发编译框架流程与IDE及Gradle概要
1 背景 建议阅读本文之前先阅读<Android Studio入门到精通>和<Groovy脚本基础全攻略>及<Gradle脚本基础全攻略>三篇博客作为背景知识,这样 ...
- Android数据库加密之sqlciher方案
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6241964.html 前言 大家好,我是Cavalier ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
随机推荐
- HTML的介绍
什么是HTML? HTML:Hyper Text Markup Language :超文本标记语言. 超文本:功能比普通文本更加强大 标记语言:使用一组标签对内容进行描述的语言,它不是编程语言 htm ...
- Codeforces 379 F. New Year Tree
\(>Codeforces \space 379 F. New Year Tree<\) 题目大意 : 有一棵有 \(4\) 个节点个树,有连边 \((1,2) (1,3) (1,4)\) ...
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- 【最大权闭合图】BZOJ1565-[NOI2009]植物大战僵尸
害怕地发现我以前写的Dinic几乎都是有错的……??!!! [题目大意] (以下摘自popoqqq大爷)给定一个m*n的草坪,每块草坪上的植物有两个属性:1.啃掉这个植物,获得收益x(可正可负)2.保 ...
- [PKUSC2018]最大前缀和
[PKUSC2018]最大前缀和 题目大意: 有\(n(n\le20)\)个数\(A_i(|A_i|\le10^9)\).求这\(n\)个数在随机打乱后最大前缀和的期望值与\(n!\)的积在模\(99 ...
- Java中的文件操作(一)RandomAccessFile
今天,学到的是java中的文件操作. Java.IO.File Java中操作文件用到RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据,但不同与普通输入/输出流的是Rand ...
- mysql select 1
看数据库连接池源码,发现连接池的参数validationQuery(SQL查询,用来验证从连接池取出的连接)设置的值为"SELECT 1",之前很少用这种写法,于是 google一 ...
- Inno Setup入门(十七)——Inno Setup类参考(3)
标签 标签(Label)是用来显示文本的主要组件之一,也是窗口应用程序中最常用的组件之一,通过对标签的使用,将能够给用户提供更加详细的信息. Pascal脚本中的标签由类TlLabel实现,该 ...
- subline text 常用插件
C语言 Alignment c Improved cool format doc Blocker cTags AllAutoComplete wakatime 精确统计你再 ...
- 【Thumbnailator】java 使用Thumbnailator实现等比例缩放图片,旋转图片等【转载】
Thumbnailator概述: Thumbnailator是与Java界面流畅的缩略图生成库.它简化了通过提供一个API允许精细的缩略图生成调整生产从现有的图像文件的缩略图和图像对象的过程, ...