前段时间尝试了最新版的AndroidStudio3.6,总体来讲gradle调试和自带的虚拟机相比较历史版本有了更香的体验。android
恰好有个新项目,就直接使用最新版了,此次新版的升级除了保持原有的界面风格,主要仍是优化了编译速度的短板问题,因此新项目很快就开发完成了。然而在打包的时候却出了点小插曲,下面先上两次打包以后的效果图看下。app
奇怪,新打包的apk把之前打包的apk覆盖掉了,难道是我作了什么操做?gradle
因而我开始检查build.gradle中的相关配置,涉及到文件打包的相关代码仍是照以前老版本的写法,大体以下。优化
1 android.applicationVariants.all { variant -> 2 variant.outputs.all { output -> 3 def outputFile = output.outputFile 4 if (outputFile != null && outputFile.name.contains('release')) { 5 def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk" 6 println "print apk name:" + fileName 7 outputFileName = fileName 8 } 9 } 10 }
顺便提一下,AS3.6对应的gradle5.6在建立项目时新生成的settings.gradle文件中,比以往多加了一行参数,也就是上面用获得的ui
rootProject.name='GradleApp'
该参数也就是声明了新项目的名称,所以能够在上边做为全局变量引用,就不须要每一个使用的地方都要自定义了。spa
话说回来,gradle的写法没什么问题,我怀疑是有某个新的tasker是删除之前的打包文件,因而继续查找新增的build.gradle,发如今项目的配置文件下的确新增了一条陌生的task,3d
1 task clean(type: Delete) { 2 delete rootProject.buildDir 3 }
看样子是删除全部的build文件了,但是打包的文件应该不会再build目录下的吧,只能死马看成活马医了,我把上边的三行注释掉,从新试着打包再来一次。。。果真仍是一如既往的旧版本被覆盖了。这里就有点想吐槽AS的开发者了,既然apk还能够重命名,为何重命名以后还要再删除呢?这样对历史版本的保存非常不友好啊。固然不嫌麻烦的话能够每次将打包好的文件手动存储到其余位置,可是这就失去了自动化的意义了(对于我这种懒癌症晚期来讲实在不能忍)。调试
那么看来只能从新修改build.gradle中的文件输出相关代码了。思路就是用gradle脚本将打包的新apk复制并重命名一份,姑且称之为新命名apk,生成路径能够到指定目录,也能够还在原始目录。下次打包时AS只会自动删除上次的新apk,而不会删除上次的新命名apk,同时生成本次的新apk。以后会再次执行新增的这段gradle脚本,将本次的新apk复制重命名为新命名apk。按照以前对AS的理解,新脚本很简单,修改后以下。code
1 android.applicationVariants.all { variant -> 2 variant.outputs.all { output -> 3 def outputFile = output.outputFile 4 if (outputFile != null && outputFile.name.contains('release')) { 5 def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk" 6 println "print apk name:" + fileName 7 // outputFileName = fileName 8 assembleRelease.doLast{ 9 project.copy{ 10 from "${output.outputFile}" 11 into "${output.outputFile.parent}" 12 rename("${output.outputFile.name}","${fileName}") 13 println "copy file from ${output.outputFile} to ${fileName}" 14 } 15 } 16 } 17 } 18 }
如此编译以后便可,生成的文件效果图以下。blog
值得注意的是,在上边的代码中copy命令要在assemble任务以后执行,否则copy中的变量
${output.outputFile}
只是使用了上一次打包的apk并重命名,以后再执行assemble结束后才会生成本次打包的新apk。
虽然AS3.6还有些使用不太习惯的地方,但总体来讲比以往的大版本更新效果更显著,对Android开发者来讲能够把时间用在更高效的事情上,而之前那种在编译项目时先抽根烟冷静下的时光恐怕也会一去不复返了。