前段时间尝试了最新版的AndroidStudio3.6,整体来说gradle调试和自带的虚拟机相比较历史版本有了更香的体验。

刚好有个新项目,就直接使用最新版了,这次新版的升级除了保持原有的界面风格,主要还是优化了编译速度的短板问题,所以新项目很快就开发完成了。然而在打包的时候却出了点小插曲,下面先上两次打包之后的效果图看下。

  

  奇怪,新打包的apk把以前打包的apk覆盖掉了,难道是我做了什么操作?

于是我开始检查build.gradle中的相关配置,涉及到文件打包的相关代码还是照之前老版本的写法,大致如下。

 android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.contains('release')) {
def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk"
println "print apk name:" + fileName
outputFileName = fileName
}
}
10 }

  顺便提一下,AS3.6对应的gradle5.6在创建项目时新生成的settings.gradle文件中,比以往多加了一行参数,也就是上面用得到的

rootProject.name='GradleApp'

该参数也就是声明了新项目的名称,因此可以在上边作为全局变量引用,就不需要每个使用的地方都要自定义了。

  话说回来,gradle的写法没什么问题,我怀疑是有某个新的tasker是删除以前的打包文件,于是继续查找新增的build.gradle,发现在项目的配置文件下的确新增了一条陌生的task,

 task clean(type: Delete) {
delete rootProject.buildDir
}

看样子是删除所有的build文件了,可是打包的文件应该不会再build目录下的吧,只能死马当作活马医了,我把上边的三行注释掉,重新试着打包再来一次。。。果然还是一如既往的旧版本被覆盖了。这里就有点想吐槽AS的开发者了,既然apk还可以重命名,为什么重命名之后还要再删除呢?这样对历史版本的保存很是不友好啊。当然不嫌麻烦的话可以每次将打包好的文件手动存储到其他位置,但是这就失去了自动化的意义了(对于我这种懒癌症晚期来说实在不能忍)。

  那么看来只能重新修改build.gradle中的文件输出相关代码了。思路就是用gradle脚本将打包的新apk复制并重命名一份,姑且称之为新命名apk,生成路径可以到指定目录,也可以还在原始目录。下次打包时AS只会自动删除上次的新apk,而不会删除上次的新命名apk,同时生成本次的新apk。之后会再次执行新增的这段gradle脚本,将本次的新apk复制重命名为新命名apk。按照之前对AS的理解,新脚本很简单,修改后如下。

 android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.contains('release')) {
def fileName = "${rootProject.name}${android.defaultConfig.versionName}_${releaseTime()}.apk"
println "print apk name:" + fileName
// outputFileName = fileName
assembleRelease.doLast{
project.copy{
from "${output.outputFile}"
into "${output.outputFile.parent}"
rename("${output.outputFile.name}","${fileName}")
println "copy file from ${output.outputFile} to ${fileName}"
}
}
}
}
}

如此编译之后即可,生成的文件效果图如下。

  

值得注意的是,在上边的代码中copy命令要在assemble任务之后执行,不然copy中的变量

${output.outputFile}

只是使用了上一次打包的apk并重命名,之后再执行assemble结束后才会生成本次打包的新apk。

  虽然AS3.6还有些使用不太习惯的地方,但整体来说比以往的大版本更新效果更显著,对Android开发者来说可以把时间用在更高效的事情上,而以前那种在编译项目时先抽根烟冷静下的时光恐怕也会一去不复返了。

AndroidStudio3.6升级后的坑-apk打包的更多相关文章

  1. Appium升级后安装UnicodeIME-debug.apk 提示

    使用appium1.8 ,启动app过程中报错: 2018-05-08 17:09:16:890 - [W3C] Encountered internal error running command: ...

  2. 【转】android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程.   流程概述: 1.打包资源文件,生成 ...

  3. Android Studio升级后projectBuild failed.

    近期在升级Android Studio后,发现原先能编译通过的project,突然就编译只是了,原因是生成的AndroidManifest.xml文件里有乱码. 升级后: android studio ...

  4. android-xBuild apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩

    android-xBuild 是一项集成了apk差分与合成,zip差分与合成,lua打包.apk打包,png/jpg图片压缩五大功能的开源项目 (github地址:https://github.com ...

  5. 【朝花夕拾】Android性能篇之(四)Apk打包

    前言 APK,即Android Package,是将android程序和资源整合在一起,形成的一个.apk文件.相信所有的Android程序员是在IDE的帮助下,完成打包轻而易举,但对打包流程真正清楚 ...

  6. Android APK 打包过程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Android studio升级后原有项目无法正常编译运行问题

    Android studio工具升级后Gradle版本问题 背景 升级AndroidStudio到最新版本后,原来可正常编译输出AndroidTest的项目无法正常编译通过. 原因 升级后的Andro ...

  8. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  9. Unity5.5.6 升级到 2018.4.1 打包出现的问题 : Gradle version 2.10 is required. Current version is 5.1.1

    起因:最近要在googleplay上架新游戏,而谷歌要求新上架的应用要支持64位,鉴于老版本的unity不支持打包64位apk,所以决定升级unity版本到2018.4.1, 但打包过程中出现了几个问 ...

随机推荐

  1. kubernetes的Statefulset介绍

    StatefulSet是一种给Pod提供唯一标志的控制器,他可以保证部署和扩展的顺序. Pod一致性 包含次序(启动和停止次序).网络一致性.此一致性和Pod相关.与被调度到哪个Node节点无关. 稳 ...

  2. react引入图片不显示问题

    在react 中引入图片的方式和正常不同,,很容易引入不显示 引入本地图片 1.(采用组件式引入方法) import Logo from "图片路径" <img src={L ...

  3. php 数据库备份(可用作定时任务)

    参考: https://blog.csdn.net/weixin_37616043/article/details/87721181 https://blog.csdn.net/stpeace/art ...

  4. 20199310《Linux内核原理与分析》第十二周作业

    1.问题描述 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发.在本实验中,通过学习重现攻击该漏洞,加深对于ShellSho ...

  5. java 中的fork join框架

    文章目录 ForkJoinPool ForkJoinWorkerThread ForkJoinTask 在ForkJoinPool中提交Task java 中的fork join框架 fork joi ...

  6. 【手把手教你】win10 虚拟机 VMware Workstation Pro 15下安装Ubuntu 19.04

    虚拟机 VMware Workstation Pro 15.5.0 及永久激活密钥 https://www.cnblogs.com/zero-vic/p/11584437.html Ubuntu19. ...

  7. 联想在S规则债券市场完成了里程碑式的新债券发行

    腾讯科技讯,香港,2020 年 4 月 24 日-联想集团(HKSE:992)(ADR:LNVGY)今日宣布,在S规则债券市场上成功发行了里程碑式的 6.5 亿美元债券. 这些债券吸引了全球大量固定收 ...

  8. 本周ASP.NET英文技术文章推荐[02/03 - 02/16]:MVC、Visual Studio 2008、安全性、性能、LINQ to JavaScript、jQuery...

    摘要 继续坚持,继续推荐.本期共有9篇文章: 最新的ASP.NET MVC框架开发计划 Visual Studio 2008 Web开发相关的Hotfix发布 ASP.NET安全性教程系列 ASP.N ...

  9. 配置secondarynamenode主机名masters

    1.配置hadoop的secondarynamenode,配置内容如下 node2 本文转自 素颜猪 51CTO博客,原文链接:http://blog.51cto.com/suyanzhu/19592 ...

  10. 数学--数论--Alice and Bob (CodeForces - 346A )推导

    It is so boring in the summer holiday, isn't it? So Alice and Bob have invented a new game to play. ...