提升AS编译速度 [效率与工具]

作者 : 开心源码 本文共3006个字,预计阅读时间需要8分钟 发布时间: 2022-05-12 共54人阅读

提升编译速度的操作

在”小步快跑快速迭代”的日常开发过程中,项目略微大点,编译一次就要好久,与开发ios的小伙伴相比,跑一次总感觉慢的不是一点半点,下面先看下我未优化前的耗时截图:

优化前耗时

下面是优化后的耗时,可以看到效果是十分显著的:优化后耗时

到底是做了些什么呢?

程序员不需要看冗长的文章,直接上代码,拷贝到app/build.gradle中体验下吧

tasks.whenTaskAdded{ task->   if(task.name.equals("lint")) {       task.enabled=false  }}

重要的事强调一遍,肯定要写到apply plugin: 'com.android.application' 前面才生效,之前看网上的博客说直接拷贝上述代码到build.gradle就有显著的速度提升,小编自己试了屡次,无论拷贝到根目录的build.gradle还是module的build.gradle都是没起作用的,最后在Stack Overflow上看到理解决方案,实际上只要要注意放置的位置就处理了.

当我们用手机本地连接调试的时候,debug打包很快即可以装到手机上了.可以自己体验这个速度.

性能检测

对于我们Android Studio客户来说,最大的痛点就是Gradle超慢的编译速度,那么到底是什么拖慢了编译的速度呢?我们需要借助Gradle内置的一个性能分析工具——profile来检测性能

直接在AS提供的终端中运行build命令,只要追加 -profile参数即用该功能.

?  qiangwo gradle build -profile

上面的命令编译后,会在根目录与app同级的Build目录下就会生成一个profile文件,如下图

image

用浏览器打开该文件,显示一律的Gradle编译总耗时(如图1),一般来说开发者最关心的是Task Execution的数据,我也贴一张部分耗时的Task数据:

image

看到这个lint是个耗时大户,而这个Lint Task一般在Debug的时候是不需要的,因而可以先禁用这个Task来完成Lint的禁用.

具体屏蔽Lint方法有两种,贴下代码,任选其一:

// 方式一  注意放置的位置tasks.whenTaskAdded { task ->    if (task.name.equals("lint")) {        task.enabled = false    }}// 方式二app/build.gradleandroid{    ...    buildTypes{        ...        debug{            ...            project.gradle.startParameter.excludedTaskNames.add('lint')  // 屏蔽lint耗时检查        }    }    ...}

同时我们看到uploadReleaseSymtabFile耗时也挺多的,我在查看耗时的时候也是挺吃惊的,这个是项目中集成的bugly符号表自动上传的插件,果断在Debug阶段屏蔽掉先,记得上线时肯定要放开.

通过profile工具,找到编译耗时的Task,我们即可以有针对性的屏蔽掉来提高编译速度.

除了Task的耗时以外,AAPT检查也是一个耗时的大户.在Debug版本中,建议使用如下代码提高AAPT的速度:

aaptOptions{        cruncherEnabled = false}

注意:可以通过这种方式提高编译速度,但因为资源没有经过AAPT优化,在Release的时候可能会导致少量运行的问题,所以建议在Debug阶段采用这种方式,Release时记得屏蔽掉.

官网镇楼:AaptOptions

开启多线程支持和增量编译

在gradle.properties文件中添加如下所示代码: 表示开启Gradle的多线程和多核心支持.

org.gradle.daemon=trueorg.gradle.parallel=trueorg.gradle.configureondemand=true

在app/build.gradle android{}闭包中增加如下代码:表示开启Gradle的增量编译,添加编译的内存资源到4G

dexOptions{        // incremental true        javaMaxHeapSize "4g"}

最好屏蔽 incremental true,在编译的时候可能会有一个警告信息WARNING: DSL element 'DexOptions.incremental' is obsolete and will be removed at the end of 2018.由于在 AS 3.0这个已经是默认实现了.

最后就是开启Instant Run

小总结:

  1. Debug阶段屏蔽 Lint检查
  2. Debug阶段屏蔽AAPT检查
  3. 开启多线程支持和增量编译
  4. 开启Instant Run

下面会简单详情下Lint和aapt.

Lint

Lint是一个代码扫描工具,可以帮助我们发现并纠正代码结构质量的问题,而无需实际执行该应用也不必编写测试用例.该工具会报告其检测到的每个问题并提供该问题的形容信息和严重级别,以便可以快速确定需要优先进行哪些关键改进.此外可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题.

Lint在AS中默认就集成好了,它会对我们的代码进行检测给出警告提醒,

image

Lint警告提醒对于我们修改提高代码质量就很有帮助,举一个小例子,在我自己和多人开发的过程中,对于代码的命名就很严格,力争做到见名知意,好的命名甚至连注释都省了.我们即可以让lint对不规范的拼写的提醒优先级由警告变为error醒目的红色提醒,先看效果:

修改提醒优先级前:请忽略,完全是为了演示才这么写的

image

修改提醒后:

image

我们看到默认的提醒不显著,修改后无论是拼写错误还是没有按照驼峰命名规则的不规范行为,都有一个特别的警醒提醒.

具体说一下,我是怎样修改的:Preference/Editor/Inspections/Spelling/Type

快捷键 “command + ,“搜索Inspections

image

Lint的警告等级相似于logcat的日志级别和范围,都可以自己设置,有下面几种:**

image

  • Error: 错误,红色 最显眼的一个
  • Warning:警告 黄色 略微显眼一点
  • Weak Warning:
  • Server Problem:
  • Type: 拼写问题 绿色波浪下划线
  • Unused Entry 没有使用的属性

Lint的功能远不止这些,我们可以手动运行检查或者从命令行运行Lint,配置Lint扫描范围和检测出问题的严重级别,配置Lint对Java和XML源文件的检查等等,详细信息可以查看 Lint官网,关键还是中文的,具体的使用就不再搬运了.

AATP

AAPT全称 Android Asset Packaging Tool.该工具位于Android SDK的build-tools目录下

image

这个工具主要用于Android编译 打包.它可以查看 创立 修改压缩文件(zip,jar包,apk文件),也可以将资源编译成二进制文件,AS在编译时调用该工具进行资源打包,将所有文件打包成一个apk文件.

具体使用方法,我们可以把aapt所在的build-tools目录加入到环境变量中,或者者直接在该目录下操作.

我们可以执行./aapt获取所有的使用方法,只截取部分结果如下, 有兴趣可以先自行研究下.

image

后面可能会补少量性能优化和自己设置控件的文章,敬请期待.

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 提升AS编译速度 [效率与工具]

发表回复