您的位置:首页 > 移动开发 > Android开发

使用新的 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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: