提升编译速度的操作
在"小步快跑快速迭代"的日常开发过程中,项目稍微大点,编译一次就要好久,与开发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.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=true
org.gradle.parallel=true
org.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
小总结:
- Debug阶段屏蔽 Lint检查
- Debug阶段屏蔽AAPT检查
- 开启多线程支持和增量编译
- 开启Instant Run
下面会简单介绍下Lint和aapt.
Lint
Lint是一个代码扫描工具,可以帮助我们发现并纠正代码结构质量的问题,而无需实际执行该应用也不必编写测试用例.该工具会报告其检测到的每个问题并提供该问题的描述信息和严重级别,以便可以快速确定需要优先进行哪些关键改进.此外可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题.
Lint在AS中默认就集成好了,它会对我们的代码进行检测给出警告提示,
imageLint警告提示对于我们修改提高代码质量就很有帮助,举一个小例子,在我自己和多人开发的过程中,对于代码的命名就很严格,力争做到见名知意,好的命名甚至连注释都省了.我们就可以让lint对不规范的拼写的提示优先级由警告变为error醒目的红色提示,先看效果:
修改提示优先级前:请忽略,完全是为了演示才这么写的
image修改提示后:
image我们看到默认的提示不明显,修改后无论是拼写错误还是没有按照驼峰命名规则的不规范行为,都有一个特别的警醒提示.
具体说一下,我是怎么修改的:Preference/Editor/Inspections/Spelling/Type
快捷键 "command + ,"搜索Inspections
imageLint的警告等级类似于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
获取所有的使用方法,只截取部分结果如下, 有兴趣可以先自行研究下.
后面可能会补一些性能优化和自定义控件的文章,敬请期待.
网友评论