在项目中集成Freeline来提升编译速度【已失效】

转载请标明出处:http://www.jianshu.com/p/e1772bfa9a96

img

引言

作为一名 Androider 你应该也曾被 AS 那缓慢的编译速度所折磨 ,更为可怕的是即使你只是简单的修改了几行代码,修改了几个布局文件,当你再次运行的时候还是需要再次进行:「编译项目」—「安装 APK 到手机」。这两个步骤在我这台机器上,快则 4、5 分钟,慢则需要 10 多分钟,调试过程异常痛苦!

Google 推出过加快编译速度的解决方案 「Instant Run」,但是用过的朋友应该都知道,这个功能很多时候存在这一些神奇的 BUG,或者是无法应用的情况,而且速度提升有限。

还有一个比较不错的且简单易用的插件,名为 「JRebel for Android」,这个插件的功能十分强大,编译速度也很快,但是这个插件是付费插件。

今天我们要介绍的主角是「Freeline」,这是阿里巴巴蚂蚁金服旗下的几位工程师推出的 Android 平台下的秒级编译方案,Github 地址为:https://github.com/alibaba/freeline。功能十分强大,在第一次全量编译之后,每次启动从编译到部署到手机全程用时都在数秒之内!可以大大提高开发调试的速度与效率!

使用

「Freeline」 推荐的方式为直接安装 Android Studio 插件来使用,但是在实际使用过程中,可能会出现无法下载「Freeline」 的二进制依赖,而导致使用失败,使用 Gradle 命令行指令也会存在同样的问题。因此我推荐大家按照我下面的步骤来进行,可以确保万无一失!

0 准备工作

对于 Windows 用户来说,你需要提前安装 Python 2.7+(Freeline 暂时还不支持 Python 3+),安装完之后需要重启一下 Android Studio。

对于 Linux/Mac 用户,如果你已经安装了 Python 3+,推荐你将其 alias 设为 python3,再单独安装 Python 2.7+,并作为默认的 Python 指令,避免与 Android Studio 插件自动运行的 python 命令冲突,导致无法正常使用插件。

1 安装 Android Studio 插件

使用插件可以自动的帮我们在项目 build.gradle 文件中添加各种依赖,从而省去了我们自己修改 build.gradle 文件的步骤。
安装 Freeline 插件

点击运行 Freeline,在第一次运行插件时,会有如下提示:
提示是否自动初始化

大致意思是:检测到我们的项目没有初始化 Freeline,是否自动安装 Freeline?

我们点击 Install Freeline Automatically ,然后选择同步 build.gradle 文件。

再次点击运行 Freeline,来编译项目并部署到手机,这时如果出现了如下图的错误,不要惊慌,请按照接下来的步骤进行

提示执行 Gradle task

2 运行 Gradle task : initFreeline

根据提示内容「执行 initFreeline 任务并下在依赖」,我们点开右侧边栏的 Gradle 选项卡,选择执行:「Application」—「Application」—「Tasks」—「other」—「initFreeline」

具体位置

这时如果你能成功执行完毕,那么恭喜你,You are a lucky dog!

相信绝多数的小伙伴都是卡在无比漫长的下载过程中了,如下图所示:

无比漫长的下载过程

参考 Freeline 的手册可以看到,官方有考虑到这个问题,并且提供了我们其他的解决方法,比如使用 Gradle 指令:gradlew initFreeline -Pmirror 来将下载指向国内的镜像网站。

注意如果在 Linux/Mac 环境下需要使用指令 ./gradlew initFreeline -Pmirror ,否则你可能会出现如下提示 gradlew: 未找到命令

这时如果你能成功执行完毕,那么恭喜你,You are a lucky dog!

如果你的执行结果如下图:
手动初始化失败

那么恭喜你,请继续收看步骤三。

3 手动下载 Freeline 依赖并初始化

使用任何加载工具下载如下链接:http://static.freelinebuild.com/freeline/0.8.6/all/freeline.zip

请注意版本,本文使用的是 0.8.6 版本,请根据你使用的版本来调整下载链接。

下载完毕后,讲该文件保存在一个好记的位置,因为稍后要输入该文件的位置。

在 Terminal 中使用指令 ./gradlew initfreeline -PfreelineLocal="/home/junerver/Freeline/freeline.zip" 来使用本地依赖来进行初始化(博主使用的是 Debian 8.7.1,如果使用的是 Windows 系统请去掉 ./)。

使用本地依赖进行初始化成功
恭喜你,执行到这一步,我们就已经成功的在项目中集成了 Freeline。

4 运行插件使用 Freeline

这个步骤就是最终一步了,我们再次点击 Freeline 插件的图标来运行 Freeline,注意第一次运行的时候会进行一次全量编译,再之后的运行都是增量编译,如下图所示:

第一次全量编译

由于是一个空的项目,所以第一次运行一共用了 28.8 秒,我们来随便的修改一下布局文件,然后再次运行 Freeline 看一下时间:

增量编译耗时极短

从编译到部署到手机一共只用了 0.7 秒,可以看到这个提速效果真的是非常的明显。

一些补充

局限

看了上面的文章,你会感叹 Freeline 的强大,但它也还是有一些不足之处的,比如:仅支持 Java 语言,对其他的基于 JVM 语言(如 Kotlin)不支持;不支持删除带id的资源,否则可能导致aapt编译出错;不支持开启 Jack 编译等等,但是总体看来还是瑕不掩瑜的。

一些有用的命令行指令

大多数情况下我们使用插件就可以解决问题,但有时也会出现一些奇怪的 BUG,这时候你可能会需要用到一下的一个 Gradle 指令:

Gradle Task: checkBeforeCleanBuild
主要用于生成工程描述文件,每次 freeline 全量编译前会先执行一下这个任务。当你执行 python 命令提示报错的时候:freeline_core.exceptions.NoConfigFoundException: xxxxxx/project_description.json not found, please execute gradlew checkBeforeCleanBuild first.,也需要先执行一下gradlew checkBeforeCleanBuild。

freeline.py

使用 freeline 进行编译的主要入口,freeline 主要通过 python 来实现跨平台。

参数:

-h
    使用方式:python freeline.py -h
    参数说明:输出 freeline 的参数使用说明
-v
    使用方式:python freeline.py -v
    参数说明:获取 freeline.py 的版本号
-f
    使用方式:python freeline.py -f
    参数说明:强制进行全量编译
-d
    使用方式:python freeline.py -d(注:可与各类参数叠加使用)
    参数说明:输出 freeline 的调试日志(注意:不是对 Android 工程进行调试)
-w
    使用方式:python freeline.py -f -w
    参数说明:让应用启动的时候等待调试工具连接(目前只支持全量编译的时候配合使用),日常调试推荐直接使用 Android Studio 的attach debugger to Android process

感谢你的阅读,如果可以对你有一些微小的帮助,请点击喜欢+收藏,转载请标明出处。