引言
作为一名 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 命令行指令也会存在同样的问题。因此我推荐大家按照我下面的步骤来进行,可以确保万无一失!
准备工作
对于 Windows 用户来说,你需要提前安装 Python 2.7+(Freeline 暂时还不支持 Python 3+),安装完之后需要重启一下 Android Studio。
对于 Linux/Mac 用户,如果你已经安装了 Python 3+,推荐你将其 alias 设为 python3,再单独安装 Python 2.7+,并作为默认的 Python 指令,避免与 Android Studio 插件自动运行的 python 命令冲突,导致无法正常使用插件。
步骤一:安装 Android Studio 插件
使用插件可以自动的帮我们在项目 build.gradle 文件中添加各种依赖,从而省去了我们自己修改 build.gradle 文件的步骤。
点击运行 Freeline,在第一次运行插件时,会有如下提示:
大致意思是:检测到我们的项目没有初始化 Freeline,是否自动安装 Freeline?
我们点击 Install Freeline Automatically ,然后选择同步 build.gradle 文件。
再次点击运行 Freeline,来编译项目并部署到手机,这时如果出现了如下图的错误,不要惊慌,请按照接下来的步骤进行
步骤二:运行 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!
如果你的执行结果如下图:
那么恭喜你,请继续收看步骤三。
步骤三:手动下载 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。
步骤四:运行插件使用 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
一个报错 - 2018.4.23
最近在一个新项目上使用了 Freeline ,完成 Freeline 的依赖之后,在运行 python freeline.py
时出现错误。报错内容为:
/usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts (没有那个文件或目录)
进入该文件夹发现存在该文件,但双击该文件提示 无法使用此链接,因为其目标“/etc/ssl/certs/java/cacerts”不存在。
解决方法是:
在终端运行指令 apt-get install ca-certificates-java
参考
感谢你的阅读,如果可以对你有一些微小的帮助,请点击喜欢+收藏,转载请标明出处。