为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android

提升编译速度的操作

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

webp

优化前耗时



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

webp

优化后耗时

究竟是做了些什么呢?

程序员不需要看冗长的文章,直接上代码,拷贝到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文件,如下图

webp

image

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

webp

image

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

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

// 方式一  注意放置的位置tasks.whenTaskAdded { task ->    if (task.name.equals("lint")) {
        task.enabled = false
    }
}// 方式二app/build.gradle
android{
    ...
    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中默认就集成好了,它会对我们的代码进行检测给出警告提示,

webp

image

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

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

webp

image

修改提示后:

webp

image

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

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

快捷键 "command + ,"搜索Inspections

webp

image

Lint的警告等级类似于logcat的日志级别和范围,都可以自定义,有下面几种:**

webp

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目录下

webp

image

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

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

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

webp

image



作者:拂晓是个小人物
链接:https://www.jianshu.com/p/8563e5131f7a


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消