使用新的 Android Studio 加速你的开发
2016-05-03 15:58
471 查看
版权声明:眯眼探云原创,可随意转载,请保留该版权声明及链接:http://edhroyal.com/post/10.android-studio-2.1/
Android 开发者最头痛的问题之一就是在开发的时候,随便改一点东西,就需要编译好长时间,然后再花很长时间装上 APK,然后运行。
为了解决这个问题,Google 的工程师们在不断的努力,最终,闪亮闪亮的 Android Studio 2.1 stable 登场!
其实在 Android Studio 2.0版本就有了 instant run,在更早的版本就有了增量编译。不过嘛,在实际使用中常会碰到一些奇怪的小问题。直到 Android Studio 2.1,这两个功能终于可以大放光彩了。
废话不多说,进入主题。
Instant Run 在第一次编译打包 APK 的时候,会在其中加入了一些额外的代码,这部分代码的功能就是替换新的代码/资源的改动。这样,在有新的代码改动的时候,使用 Instant Run 就只会把这部分改动的代码/资源安装到目标设备,并对原来的代码/资源进行替换。
实际使用感受:第一次编译会比较慢,然后在安装后第一次运行的时候,APP 也会白屏一会儿。但是在后续的开发中,重新安装改动会非常的快。
AS2.1明显比AS2.0要快一些,不论是第一次还是后续的编译。
在进行代码/资源替换的时候,有几种方式。最常见的情况是,在替换的时候,并不会重启 Activity,因此,有些需要重启 Activity 才会生效的东西,这时候就需要 rerun 这个功能了。这个功能会执行一次增量编译,然后安装,重新启动 Activity。
现在 Android 开发中会经常用到非常多的第三方库,好处是可以快速的搭建一个 APP 出来,但其中一项坏处就是,APP 很容易就会超出 65k dex 限制。虽然可以使用 Multi Dex,但运行效率又是个问题。所以通常情况下,使用 Proguard 对代码进行裁剪是最好的策略。Proguard 主要是做两件事:一是裁剪代码,二是混淆代码。
但非常可惜的是增量编译和 Instant Run 都无法和 Proguard 共同工作。于是 Google 的工程师们自己做了一个 shrinker,它只做了 proguard 的一部分工作:那就是根据 proguard 配置文件来裁剪代码。但最重要的是,它可以和 Instant Run 和增量编译协同工作。实在是太完美了。
所以通常是在开发用的 buildType 中使用 shrinker,而在其他 buildType 中使用 proguard。
使用 shrinker
debug {
minifyEnabled true
useProguard false
}
使用 proguard
release {
minifyEnabled true
useProguard true
}
由于 Instant Run 在使用的时候是针对目标设备的 API LEVEL 进行编译的,所以如果你在不同的 API LEVEL 的设备之间进行切换使用的时候,instant run 会执行 clean 编译,会非常慢。所以,如果你在调试版本兼容性问题的时候,最好把 Instant Run 关掉。
不过好消息是:增量编译依然是可用的,而且增量编译也是非常快的。
如果你的项目使用了 legacy multidex 的话,instant run 也可能比较慢。不过我们的项目在配置好 proguard 后,就不需要 multidex 了,所以并没有实测它到底有多慢。
我们可以指定 gradle 运行的一些配置,来加速编译的过程。这些配置通常是放在 gradle.properties 这个文件中。这个文件可以放在几个地方:项目根目录下,或者 $HOME/.gradle/ 目录下面。
下面只列出几点我认为对编译速度影响最大的配置,其他也有一些,但我觉得不是特别大就不列出来了。比如,你的项目模块很多,那么你可以指定 preDexLibs 来加速后续的编译。
使用 gradle daemon,可以有效的加速后续编译。在 gradle.properties 中加入
org.gradle.daemon=true
在一个独立进程中来处理 dex,默认是开启的。但是这个选项会使用很多的内存,所以推荐在 gradle.properties 中给 gradle 设置较大的内存,推荐是不少于2g,于是我设置为3g:
org.gradle.jvmargs=-Xmx3g
如果你有些依赖使用了类似 xxx@2.+ 这种方式来指定版本,那么每次编译的时候,gradle 都要到远程 maven 仓库去寻找是否有这些依赖的最新版本。而如果你恰好访问这些仓库的速度比较慢,那就比较惨了。这时候你可以在 Android Studio 中把 Build, Executiojn, Deployment -> Build Tools -> Gradle 下面的 Offline Work 勾选上。这样 gradle 在编译的时候就不会去访问网络。只有你真正需要的时候,临时关闭这个选项进行编译就可以了。
在命令行中使用 gradle 也可以通过指定
还等什么,赶快升级用起来!
之前写的一篇博客:加速安卓项目编译
Instant Run: http://tools.android.com/tech-docs/instant-run
New Shrinker: http://tools.android.com/tech-docs/new-build-system/built-in-shrinker
Android 开发者最头痛的问题之一就是在开发的时候,随便改一点东西,就需要编译好长时间,然后再花很长时间装上 APK,然后运行。
为了解决这个问题,Google 的工程师们在不断的努力,最终,闪亮闪亮的 Android Studio 2.1 stable 登场!
其实在 Android Studio 2.0版本就有了 instant run,在更早的版本就有了增量编译。不过嘛,在实际使用中常会碰到一些奇怪的小问题。直到 Android Studio 2.1,这两个功能终于可以大放光彩了。
废话不多说,进入主题。
Instant Run
Instant Run 在第一次编译打包 APK 的时候,会在其中加入了一些额外的代码,这部分代码的功能就是替换新的代码/资源的改动。这样,在有新的代码改动的时候,使用 Instant Run 就只会把这部分改动的代码/资源安装到目标设备,并对原来的代码/资源进行替换。实际使用感受:第一次编译会比较慢,然后在安装后第一次运行的时候,APP 也会白屏一会儿。但是在后续的开发中,重新安装改动会非常的快。
AS2.1明显比AS2.0要快一些,不论是第一次还是后续的编译。
Rerun
在进行代码/资源替换的时候,有几种方式。最常见的情况是,在替换的时候,并不会重启 Activity,因此,有些需要重启 Activity 才会生效的东西,这时候就需要 rerun 这个功能了。这个功能会执行一次增量编译,然后安装,重新启动 Activity。
Proguard 和 New Shrinker
现在 Android 开发中会经常用到非常多的第三方库,好处是可以快速的搭建一个 APP 出来,但其中一项坏处就是,APP 很容易就会超出 65k dex 限制。虽然可以使用 Multi Dex,但运行效率又是个问题。所以通常情况下,使用 Proguard 对代码进行裁剪是最好的策略。Proguard 主要是做两件事:一是裁剪代码,二是混淆代码。但非常可惜的是增量编译和 Instant Run 都无法和 Proguard 共同工作。于是 Google 的工程师们自己做了一个 shrinker,它只做了 proguard 的一部分工作:那就是根据 proguard 配置文件来裁剪代码。但最重要的是,它可以和 Instant Run 和增量编译协同工作。实在是太完美了。
所以通常是在开发用的 buildType 中使用 shrinker,而在其他 buildType 中使用 proguard。
使用 shrinker
debug {
minifyEnabled true
useProguard false
}
使用 proguard
release {
minifyEnabled true
useProguard true
}
使用注意
由于 Instant Run 在使用的时候是针对目标设备的 API LEVEL 进行编译的,所以如果你在不同的 API LEVEL 的设备之间进行切换使用的时候,instant run 会执行 clean 编译,会非常慢。所以,如果你在调试版本兼容性问题的时候,最好把 Instant Run 关掉。不过好消息是:增量编译依然是可用的,而且增量编译也是非常快的。
如果你的项目使用了 legacy multidex 的话,instant run 也可能比较慢。不过我们的项目在配置好 proguard 后,就不需要 multidex 了,所以并没有实测它到底有多慢。
其他加速编译选项
我们可以指定 gradle 运行的一些配置,来加速编译的过程。这些配置通常是放在 gradle.properties 这个文件中。这个文件可以放在几个地方:项目根目录下,或者 $HOME/.gradle/ 目录下面。下面只列出几点我认为对编译速度影响最大的配置,其他也有一些,但我觉得不是特别大就不列出来了。比如,你的项目模块很多,那么你可以指定 preDexLibs 来加速后续的编译。
daemon
使用 gradle daemon,可以有效的加速后续编译。在 gradle.properties 中加入org.gradle.daemon=true
dexInProcess
在一个独立进程中来处理 dex,默认是开启的。但是这个选项会使用很多的内存,所以推荐在 gradle.properties 中给 gradle 设置较大的内存,推荐是不少于2g,于是我设置为3g:org.gradle.jvmargs=-Xmx3g
离线编译
如果你有些依赖使用了类似 xxx@2.+ 这种方式来指定版本,那么每次编译的时候,gradle 都要到远程 maven 仓库去寻找是否有这些依赖的最新版本。而如果你恰好访问这些仓库的速度比较慢,那就比较惨了。这时候你可以在 Android Studio 中把 Build, Executiojn, Deployment -> Build Tools -> Gradle 下面的 Offline Work 勾选上。这样 gradle 在编译的时候就不会去访问网络。只有你真正需要的时候,临时关闭这个选项进行编译就可以了。在命令行中使用 gradle 也可以通过指定
--offline来达到同样的效果。
用起来
还等什么,赶快升级用起来!
附录
之前写的一篇博客:加速安卓项目编译Instant Run: http://tools.android.com/tech-docs/instant-run
New Shrinker: http://tools.android.com/tech-docs/new-build-system/built-in-shrinker
相关文章推荐
- android stutio创建项目以及运行时遇到的问题总结
- Android 图片获取及上传
- Fiddler捕获 iPhone/Android 流量
- android操作xml
- Android与网页交互
- android技术要点梳理
- [置顶] Android开发之 SwipeRefreshLayout
- Android Studio 添加ndk右键工具
- android--------关于ActionBar的Overflow问题
- Android dialog 点击空白dialog不消失问题
- android学习,在项目上显示当前时间
- Android中invalidate()和postInvalidate() 的区别及使用方法
- Android事件总线框架之EventBus(3.0为例)
- android退出activity
- 常用工具类
- android学习,当viewFilpper需要滑出并且GONE
- Android进阶——属性动画Property Animation详解与应用(二)
- Android与iPhone应用程序界面布局对比
- android捕获子进程的异常操作
- Android 记住密码和自动登录界面的实现