问题是这样的
As更新到3.5.0后 去掉了instant run 导致之前修改了apk安装路径 直接安装apk装不上去
解决思路:
gradle不仅是自动化构建工具也是一门基于groovy的语言的编程框架,gradle也有众多的api支持同时它也是有生命周期的,生命周期为三个阶段 初始化 、配置、构建。所以我找到了gradle提供的 配置与构建完成的方法。在配置后删掉之前打包出来的apk 构建完成后将apk复制到自己制定的目录 并且修改名称。
具体实现
我是将这一部分代码直接抽离成一个gradle文件 然后在app Module下引用 apply from :'apk_path_build.gradle'废话也不多说看看apk_path_build.gradle文件代码
def flavorInfo = rootProject.ext.flavor
/**
* 正式版 apk输出路径
* 在task执行前 修改apk输出的位置和名称
*/
android.applicationVariants.all { variant ->
variant.outputs.all {
if (outputFile.name.contains("release")) {
variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/apk/" + variant.flavorName)
def fileName = "${flavorInfo.appName}v${flavorInfo.versionName}_${getTime()}(${flavorInfo.serverName}环境)"
fileName += ".apk"
outputFileName = fileName
}
}
}
/**
* debug模式下 apk输出路径
* 在apk生成后 复制apk到指定的路径和修改名称
*/
/**
* afterEvaluate gradle生命周期方法 配置之后 执行之前
* 删除build/outputs/apk下面的 apk文件
*/
afterEvaluate {
def apkFilePath = getBuildDir().absolutePath + "/outputs/apk/"
def apkFile = new File(apkFilePath)
println ">>afterEvaluate=" + apkFilePath
if (apkFile.exists()) {
delete(apkFilePath)
println "apkFilePath delete"
}
android.applicationVariants.all { variant ->
variant.outputs.all {
def flavorApkFilePath = this.getProjectDir().absolutePath + "/" + variant.flavorName
def flavorApkFile = new File(flavorApkFilePath)
if (flavorApkFile.exists()) {
println "flavorApkFilePath delete"
delete(flavorApkFilePath)
}
}
}
}
/**
* buildFinished gradle生命周期方法 执行之后(所有的task 执行完毕后调用)
*/
this.gradle.buildFinished {
println 'zdq >>>buildFinished '
android.applicationVariants.all { variant ->
variant.outputs.all {
def fileName
if (outputFile.name.contains("debug")) {
def apkFileName = this.getProject().name + "-" + variant.flavorName + "-debug.apk"
fileName = "${flavorInfo.appName}v${flavorInfo.versionName}_${getTime()}(${flavorInfo.serverName}环境)_debug.apk"
//第一种情况 as3.5.0通过签名打包产生的apk在 工程目录/variant.flavorName/下
def flavorApkFilePath = this.getProjectDir().absolutePath + "/" + variant.flavorName
def flavorApkFile = new File(flavorApkFilePath)
println 'flavorApkFilePath=' + flavorApkFilePath
if (flavorApkFile.exists()) {
copy {
from variant.flavorName
into getRootDir().absolutePath + "/apk/" + variant.flavorName
rename(apkFileName, fileName)
println "flavorApk copy finish"
}
return
}
//第二种情况 就是直接运行安装apk As3.5.0 apk的目录在 build/outputs/apk下面
def apkFilePath = getBuildDir().absolutePath + "/outputs/apk/" + variant.flavorName + "/debug/"
println 'apkFilePath=' + apkFilePath + " apkFileName= " + apkFileName
//如果apk存在就copy
def apkFile = new File(apkFilePath + apkFileName)
if (apkFile.exists()) {
copy {
from "build/outputs/apk/"
into getRootDir().absolutePath + "/apk"
rename(apkFileName, fileName)
println "copy finish"
}
}
outputFileName = fileName
}
}
}
}
static def getTime() {
return new Date().format("M.d_HH.mm", TimeZone.getDefault())//包含时分
}
注意:上面的flavorInfo是引用了工程下面的ext 全局属性配置 这个可以自己随便定义 生命周期的方法都有注释自己也可以通过gradle 的源码查看
目前我工程用的gradle 版本是4.4.1-all
android gradle版本是3.1.4