当前位置: 首页 > news >正文

加速 gradle 编译之屏蔽部分 Task | 掘金技术征文

灵感来源

首先祝大家圣诞快乐! :smile: :+1:

该篇博客灵感来自之前的一片博客:

Android Studio clean 时产生 Error:Execution failed for task ':app:mockableAndroidJar' > java.lang.NullPointerException (no error message)

和一个神库的issue:

android-hidden-api#21

首先简单介绍下这个神库——android-hidden-api: 可以让你使用安卓系统中 internal/hidden 的方法。

比如, Activity 里有一个@hide的方法:

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}复制代码

没用该库之前引用这个方法会报找不到该方法:

isResumed

但是使用该库后, 编译正常:

isResumed internal

编译通过了, 实际运行怎么样呢, 该方法可运行正常, 但是不保证所有系统, 同时也不能保证所有内部方法可运行。裤子不错, 不要贪用哦, 要多测试, 并加入异常处理。

详细使用可参考鸿神之前的文章:

Android 轻松的查看与使用hide与internal API

加速gradle编译

1 常用的加速方法, 大家可能都配置好了, 主要下面几个:

  • 开启gradle单独的守护进程
    在gradle.properties文件中输入如下代码:
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true复制代码

当然,上面的这些参数也可以配置到前面的用户目录下的gradle.properties文件里,那样就不是针对一个项目生效,而是针对所有项目生效。
gradle.properties配置文件主要就是增大gradle运行的java虚拟机的大小,让gradle在编译的时候使用独立进程,让gradle可以平行的运行。

  • 申请大内存

as安装目录/bin/studio64.vmoptions or studio.vmoptions(linux下,其他系统找类似文件)
使用文本编辑器打开,找到起始两行,如下
-Xms128m
-Xmx750m

修改最小值和最大值,建议为
-Xms256m
-Xmx2048m

  • incremental dex
    改变incremental dexing的值,这是一个实验的功能并且默认是关闭的。打开这个开关有可能会导致构建失败,错误信息类似jdk finished with non-zero exit value 2
    (尤其是在连续运行的时候),但我还是推荐你尝试一下,看看它是否对你有用。

在主APP模块的build.gradle文件中,添加下面的代码:

dexOptions {
    incremental true
}复制代码

2 屏蔽部分Task

我们知道, 编译的时候, 是有很多Task运行的, 可在右侧 gradle 标签下看到:

gradle tasks

当我们正常编译的时候, 这些Task都是会运行的, 我们看下编译log:

gradle uptodate

很多Task后面都有 UP-TO-DATE也就是Task已是最新, 这些基本不耗时, 其他都耗时, 项目大, 同时依赖多个库, 那么慢是正常的了...

下面, 哦,,, 没错, 就是下面,

屏蔽不需要的Task, 比如一些测试Task, 中间含有Test的一些Task, 把这些屏蔽掉:

在项目的根build.gradle脚本里添加屏蔽Task的代码:

allprojects {
    repositories {
        jcenter()
    }

    //skip Test tasks
    gradle.taskGraph.whenReady {
        tasks.each { task ->
            if (task.name.contains("Test"))
            {
                task.enabled = false
            }
        }
    }

}复制代码

这样sync, 编译, 见证奇迹的时刻:

task skipped

Oh, 圣诞快乐 :smile: 没错, 好多Task后面被标记了SKIPPED, 那这些Task都被无情的忽视了, 酸爽。

当然还可以屏蔽掉其他Task, 欢迎讨论。编译时间的提升效果还是很明显的, 项目越大越明显。

到这里就差不多了, 当然, 网上还有很多加速编译的方法, 最好用的还是阿里的

秒级编译工具freeline

这个还没使用的, 赶紧用起来, 赶紧用起来, 赶紧用起来, 不解释。

到这里该说再见了, 有任何问题欢迎评论, 感谢您的阅读, 圣诞快乐!

掘金技术征文:
gold.xitu.io/post/58522d…

相关文章:

  • Using Call_Form in Oracle D2k
  • php日志记录类
  • 乐观锁的一种实现方式——CAS
  • 中国科学院大学2014年数学分析高等代数考研试题
  • JavaScript标准库系列——Math对象和Date对象(二)
  • 图像处理中经常用的一幅图片Lena.jpg
  • Git的安装和介绍
  • linux下netstat --timers / -o详解及keepalive相关
  • iOS 10 开发 相机相关的适配
  • LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别
  • 2017阅读计划
  • svnserve+ssh服务器Apache+svn服务器创建
  • nginx proxy_pass代理小结
  • Charles抓取android设备http信息
  • 2016 年 Linux 领域的十大新闻,你有关注吗?
  • __proto__ 和 prototype的关系
  • android图片蒙层
  • Angular数据绑定机制
  • css布局,左右固定中间自适应实现
  • es6要点
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaWeb(学习笔记二)
  • linux学习笔记
  • SegmentFault 2015 Top Rank
  • Shell编程
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从零开始学习部署
  • 大数据与云计算学习:数据分析(二)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对JS继承的一点思考
  • 复习Javascript专题(四):js中的深浅拷贝
  • 深入浅出webpack学习(1)--核心概念
  • 一个完整Java Web项目背后的密码
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (分布式缓存)Redis持久化
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) Android中ViewStub组件使用
  • .bat文件调用java类的main方法
  • .CSS-hover 的解释
  • .net core 6 redis操作类
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET的数据绑定
  • .vue文件怎么使用_我在项目中是这样配置Vue的