前段时间尝试了最新版的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. 1. esc 安装 jenkins

    $ yum install yum-fastestmirror -y #安装自动选择最快源的插件 #添加jenkins源: $ sudo wget -O /etc/yum.repos.d/jenkin ...

  2. Web前端开发必不可少的9个开源框架

    大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是网页中最重要也是最常被遗忘的部分之一,尽管它是万维网的三大基础技术之一. ...

  3. [USACO3.2]魔板 Magic Squares

    松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...

  4. opencv-9-图像噪声以及评估指标 PSNR 与SSIM

    开始之前 我们在将 opencv 的图像显示在了 qt 的label 上, 我们能够将图显示在label 上, 用于显示我们的算法, 我们在 opencv 上一篇文章中介绍了 opencv 的核操作, ...

  5. 【Linux常见命令】paste命令

    paste - merge lines of files paste 命令用于合并文件的列. paste 指令会把每个文件以列对列的方式,一列列地加以合并. 语法: paste [OPTION]... ...

  6. mac OS 搭建PHP项目开发环境

    系统 macOS Mojave 版本10.14.6 mac OS 自带Apache和PHP 非常便利 sudo apachectl -v //查看apache版本 php -v //查看php版本 启 ...

  7. Vagrant (二) - 日常操作

    立即上手 上一节中,我们介绍了怎样安装 Vagrant,安装本身并不困难.本章节中我们首先要快速上手,以便获得一个直观的概念: 建立一个工作目录 打开命令行工具,终端工具,或者iTerm2等,建立一个 ...

  8. .NET平台上的编译器不完全列表(转别)

    http://www.cnblogs.com/william_fire/archive/2005/05/15/155800.html最近因为开发需要,要研究一下.NET上基于C#扩展的编译器实现的框架 ...

  9. Cobbler自动装机试验

    Cobbler自动装机简介:Cobbler是一个使用Python开发的开源项目,通过将部署系统所涉及的所有服务集中在一起,来提供一个全自动的批量快速建立Linux系统的网络安装环境.Cobbler提供 ...

  10. Xftp的下载安装,以及如何使用XFtp连接虚拟主机/服务器

    1.下载ftp软件  下载地址: 点我立即下载 2.下载后双击安装  下一步  选择Free for Home/School   然后其他的默认下一步即可 3.打开之前领取的免费一年虚拟主机的网址,登 ...