android studio编译和命令行调用gradle编译的区别

81 篇文章 3 订阅

android studio编译比命令行调用gradle编译快很多

从Android Studio 2.3版本之后,通过Android Studio打包普遍比通过命令行调用gradle编译要快很多。这是因为Android Studio增加了一项功能。通过Android Studio打包是,检测到连接的手机android本部大于21,就会关闭传统multidex方案,而使用速度快得多的新版多dex打包流程。

google原文如下:
https://developer.android.com/studio/build/optimize-your-build

      // To avoid using legacy multidex when building from the command line,
      // set minSdkVersion to 21 or higher. When using Android Studio 2.3 or higher,
      // the build automatically avoids legacy multidex when deploying to a device running
      // API level 21 or higher—regardless of what you set as your minSdkVersion.

传统multidex和新版多dex打包区别

传统multidex打包流程:

app:kaptGenerateStubsDevDebugKotlin
app:kaptDevDebugKotlin
app:compileDevDebugKotlin
app:javaPreCompileDevDebug
app:compileDevDebugJavaWithJavac
app:compileDevDebugSources
app:transformClassesWithStackFramesFixerForDevDebug
app:transformClassesWithDesugarForDevDebug
app:transformClassesWithDexBuilderForDevDebug
app:transformClassesWithMultidexlistForDevDebug
app:transformDexArchiveWithDexMergerForDevDebug
app:transformNativeLibsWithMergeJniLibsForDevDebug
app:transformResourcesWithMergeJavaResForDevDebug
app:packageDevDebug
app:assembleDevDebug

新版多dex打包流程:

:app:kaptGenerateStubsDevDebugKotlin
:app:kaptDevDebugKotlin
:app:compileDevDebugKotlin
:app:generateDevDebugSources
:app:javaPreCompileDevDebug
:app:compileDevDebugJavaWithJavac
:app:compileDevDebugSources
:app:transformClassesWithStackFramesFixerForDevDebug
:app:transformClassesWithDesugarForDevDebug
:app:transformClassesWithDexBuilderForDevDebug
:app:transformDexArchiveWithDexMergerForDevDebug
:app:transformNativeLibsWithMergeJniLibsForDevDebug
:app:transformResourcesWithMergeJavaResForDevDebug
:app:packageDevDebug
:app:assembleDevDebug

可以看出,传统multidex比新版多dex打包,多了一个transformClassesWithMultidexlist的任务,而这个任务耗费时间非常的长。
这就是导致命令行调用gradle命令编译比Android Studio慢的区别。

Android Studio 如何改变了打包流程

Android Studio是通过检测连接手机的参数,来向gradle注入相关属性来修改gradle编译方式。
我们可以在build.gradle中加入如下命令来查看Android Studio注入的属性:

println "projectProperties: " + project.gradle.startParameter.projectProperties

project.gradle.startParameter.projectProperties表示当前gradle启动时设置的属性。

我测试发现,注入的属性如下:

projectProperties: [
android.injected.build.density:xxhdpi, 
android.injected.build.api:26, 
android.injected.invoked.from.ide:true, 
android.injected.build.abi:arm64-v8a,armeabi-v7a,armeabi
]

这几个属性:
android.injected.build.density 只打包对应density的资源,
android.injected.build.api 连接手机的android版本,就是这个属性使gradle采用新版多dex打包方案

让命令行调用gradle命令编译和Android Studio一样快

只要在原本的编译命令中加入-Pandroid.injected.build.api=26参数,即可在命令行中也采用新版多dex打包方案

./gradlew -Pandroid.injected.build.api=26 assembleDevDebug
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值