4.2.2 升级Gradle7.0.0 后,第二次打包时,apk被删除,项目中修改了apk输出目录outputDirectory,故注释
outputDirectory=
代码排除,具体看了一下gradle 源代码未发现原因
//...
applicationVariants.all {
variant ->
if (variant.buildType.name != "debug") {
//防止AS无法安装debug包(apk)
variant.getPackageApplicationProvider().get().outputDirectory = APK_SAVE_DIR //这导致了,第二次打包,上次apk没保留
}
//...
}
//...
想法①:
不可行,doLast后outputDirectory为final
String outputApkPath = variant.getPackageApplicationProvider().get().outputDirectory.getAsFile().get().getPath()
variant.assembleProvider.get().doLast {
//
variant.getPackageApplicationProvider().get().outputDirectory = outputApkPath
}
想法②:copy-delete
applicationVariants.all {
variant ->
String outputApkPath = null
if (variant.buildType.name != "debug") {
//防止AS无法安装debug包(apk)
//variant.getPackageApplicationProvider().get().outputDirectory = APK_SAVE_DIR
outputApkPath = variant.getPackageApplicationProvider().get().outputDirectory.getAsFile().get().getPath()
}
variant.outputs.all {
def fiName
println("productFlavorsName:" + variant.productFlavors[0].name)
if (variant.productFlavors[0].name == "vscreen_demo") {
fiName = "VScreen_${variant.productFlavors[0].name}_build_${defaultConfig.versionCode}.apk"
} else if (variant.productFlavors[0].name == "vscreen_universally") {
fiName = "${variant.productFlavors[0].name}_v${versionName}_build_${defaultConfig.versionCode}.apk"
} else {
fiName = "VScreen_${variant.productFlavors[0].name}_v${versionName}_build_${defaultConfig.versionCode}.apk"
}
def noapkname = fiName.replaceAll("\\.apk", "")
outputFileName = fiName
variant.assembleProvider.get().doLast {
if (variant.getBuildType().isMinifyEnabled()) {
//cp位置
copy {
//apk files
from outputApkPath
duplicatesStrategy = DuplicatesStrategy.INCLUDE
include '**/*.apk'
include '**/*.txt'
//mapping files
from variant.getMappingFileProvider().get()
into APK_SAVE_DIR
rename {
String fileName ->
if (fileName.contains("mapping")) {
"${noapkname}-mapping.txt"
}
}
}
delete outputFile
def apkFile = new File(APK_SAVE_DIR, fiName)
def path = apkFile.getAbsolutePath()
println2file(String.format("apkVersion: v%s (%s)", versionName, GIT_VERSION) + ", apkSize: " + apkFile.length() + ", apkPath: " + path)
if (isJenkins) {
println2file("Jenkins DownloadUrl: http://192.168.3.136/job/vx-screen/ws/APK/" + fiName)
}
//上传apk
if (getBool(dict, 'auto_push_apk') || (project.hasProperty('AUTO_PUSH_APK') && project.getProperties().get('AUTO_PUSH_APK') == 'yes')) {
uploadFile(path)
}
} else {
def file = new File(project.rootDir.absolutePath + "/VScreen/build/outputs/apk/" + variant.productFlavors[0].name + "/debug")
def apkFile = new File(file, fiName)
println(String.format("apkVersion: v%s (%s)", versionName, GIT_VERSION) + ", apkSize: " + apkFile.length() + ", apkPath: " + apkFile.getCanonicalPath())
}
}
}
}
duplicatesStrategy:默认是INHERIT,需要调整才不报错,位置也有讲究。
duplicatesStrategy = DuplicatesStrategy.INCLUDE
Android gradle配置打包后 Copy APK到指定路径
gradle执行打包并导出Apk、mapping文件到指定文件夹
指定文件夹clean。gradle 文件树、cleanTask相关知识
clean {
println("VSApp:clean APK")
//clean 成功
doLast {
def tree = fileTree(new File(project.rootDir, 'APK'))
tree.include '*.apk'
tree.include '*.txt'
long now = System.currentTimeMillis()
//println now
tree.each {
//println (it.lastModified())
if (now - it.lastModified() >= 1000L * 60 * 60 * 24 * 30) {
println("VSApp:clean del: " + it.name)
it.delete()
}
}
}
}
新增环境变量读取
// 从环境变量中读取字符串或整数
def env = {
System.getenv it }
def envInt = {
Integer.parseInt(env(it)) }
def hasEnv = {
env(it) != null }
def GRADLE_USER_HOME_DIR = gradle.getGradleUserHomeDir()
def isJenkins = hasEnv("JENKINS_HOME")
println("isJenkins:" + isJenkins)
调试Gradle
//输出gradle版本 build.gradle
println("gradleVersion: " + gradle.gradleVersion)
println("getGradleUserHomeDir: " + gradle.getGradleUserHomeDir())
println("gradleHomeDir: " + gradle.gradleHomeDir)
sourceSets {
//引入Gradle源码: 【 需要 gradle - x.x - all.zip 】
def base = "${gradle.gradleHomeDir}/src"
main.java.srcDirs += [
"${base}/core",
"${base}/core-api",
"${base}/base-services",
"${base}/base-services-groovy",
"${base}/logging",
"${base}/plugins",
"${base}/diagnosticcopys",
"${base}/ide-native",
]
}
dependencies {
//引入Gradle插件源码: 【需要用 gradle-x.x-all.zip】
def gradle = "${GRADLE_USER_HOME_DIR}/caches/modules-2/files-2.1/com.android.tools.build/gradle/7.0.2"
implementation fileTree(dir: gradle, include: ["*.jar", "*\\*.jar"])
def gradleApi = "${GRADLE_USER_HOME_DIR}/caches/modules-2/files-2.1/com.android.tools.build/gradle-api/7.0.2"
implementation fileTree(dir: gradleApi, include: ["*.jar", "*\\*.jar"])
}