AndroidStudio3.0下命令行打包自定义输出路径和输出命名

2018-02-27 11:18:06来源:https://www.jianshu.com/p/5fa77b7fe8f4作者:HannyYeung人点击

分享


新年伊始

过了雨水节气,天气渐暖,想到了一首非常喜欢的古诗:


王维 <<山居秋暝>>


空山新雨后,天气晚来秋.
明月松间照,清泉石上流.
竹喧归浣女,莲动下渔舟.
随意春芳歇,王孙自可留.



正题

之前写过一篇命令行打出多个应用包


这一次在之前的基础上,进一步加强,实现修改打包的名称,自定义输出apk地址
项目结构


image.png

在工程src目录下新建:comone comtwo两个文件夹,主要目的是为了实现打包出多个apk,当然我并没有在这两个文件夹里面添加任何东西,如果需要可以参考:命令行打出多个应用包
项目下的build.gradle 文件配置
在android{ } 里面配置多个工程包
//根据项目工程配置出不同的包
flavorDimensions "app"
productFlavors {
comone {
applicationId "com.huayi.one"
dimension "app"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.comone
}
comontwo {
applicationId "com.huayi.two"
dimension "app"
versionCode 1
versionName "2.0"
signingConfig signingConfigs.comtwo
}
}

在android{ } 里面配置签名
signingConfigs {
comone {
keyAlias 'huayi_one'
keyPassword 'qq2016'
storeFile file('D://ASDemo//keyStore//comone.jks')
storePassword 'qq2016'
}
comtwo {
keyAlias 'huayi_two'
keyPassword 'qq2016'
storeFile file('D://ASDemo//keyStore//comtwo.jks')
storePassword 'qq2016'
}
}

在android{ } 里面控住输出路径
//定义一个装apk文件路径的数组
def fileArray = []
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.contains('release')) {
//获取每个打包产物
def variantProd = variant.productFlavors[0]
def fileName = "huayi_${variantProd.versionName}_${variantProd.versionCode}" + "_${variantProd.name}.apk"
println "自定义输出apk的名字:" + fileName;
outputFileName = fileName;
println "输出apk地址:" + outputFile.parentFile.absolutePath + java.io.File.separator + fileName
fileArray.add(outputFile.parentFile.absolutePath + java.io.File.separator + fileName);
}
}
}

在android{ } 里面写一个apk的复制重命名的任务(task)
build {
doLast() {
println "任务1编译打包完成后需要复制apk的数量:" + fileArray.size()
forEachFile(fileArray)
}
}

最后在android{ }之外 当然是定义一个执行复制命名的方法了
def forEachFile(fileArray) {
fileArray.forEach { file ->
//遍历进行文件操作
println "任务3遍历apk文件"
rename_and_moveout_apk(file)
}
}

def rename_and_moveout_apk(orignalFile) {
def intoFile = rootDir.parentFile.getAbsolutePath() + File.separator + "apk"
copy {
from orignalFile
into intoFile
println "任务4复制apk到指定位置:" + intoFile
rename("${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}_", "")
println "任务5修改apk的命名"
}
}

看看Terminal控制台结果

配置上面的一切之后,再AndroidStudio3.0 的Terminal中输入 : gradle build



看看结果:





image.png




image.png

上面的结果清晰明了,先编译打包,最后执行复制命名任务,一气呵成.
贴出全部build.gradle,不留一点的
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.huayi.app"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//定义一个装apk文件路径的数组
def fileArray = []
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.contains('release')) {
//获取每个打包产物
def variantProd = variant.productFlavors[0]
def fileName = "huayi_${variantProd.versionName}_${variantProd.versionCode}" + "_${variantProd.name}.apk"
println "自定义输出apk的名字:" + fileName;
outputFileName = fileName;
println "输出apk地址:" + outputFile.parentFile.absolutePath + java.io.File.separator + fileName
fileArray.add(outputFile.parentFile.absolutePath + java.io.File.separator + fileName);
}
}
}
lintOptions {
abortOnError false
}
signingConfigs {
comone {
keyAlias 'huayi_one'
keyPassword 'qq2016'
storeFile file('D://ASDemo//keyStore//comone.jks')
storePassword 'qq2016'
}
comtwo {
keyAlias 'huayi_two'
keyPassword 'qq2016'
storeFile file('D://ASDemo//keyStore//comtwo.jks')
storePassword 'qq2016'
}
}
//根据项目工程配置出不同的包
flavorDimensions "app"
productFlavors {
comone {
applicationId "com.huayi.one"
dimension "app"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.comone
}
comontwo {
applicationId "com.huayi.two"
dimension "app"
versionCode 1
versionName "2.0"
signingConfig signingConfigs.comtwo
}
}

build {
doLast() {
println "任务1编译打包完成后需要复制apk的数量:" + fileArray.size()
forEachFile(fileArray)
}
}

}

def forEachFile(fileArray) {
fileArray.forEach { file ->
//遍历进行文件操作
println "任务3遍历apk文件"
rename_and_moveout_apk(file)
}
}

def rename_and_moveout_apk(orignalFile) {
def intoFile = rootDir.parentFile.getAbsolutePath() + File.separator + "apk"
copy {
from orignalFile
into intoFile
println "任务4复制apk到指定位置:" + intoFile
rename("${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}_", "")
println "任务5修改apk的命名"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

最后
如果有具体问题可以私聊






最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台