1. 如何修改打包好的apk名稱
Android Studio從2.0升級到3.0之后,要修改打包后的apk名稱哭廉,必須采用以下配置:
android {
...
applicationVariants.all {variant ->
variant.outputs.all {output ->
if (variant.buildType.name == "debug") {
output.outputFileName = "iou_v${android.defaultConfig.versionName}_debug_${getCurrentTime()}.apk"
} else if (variant.buildType.name == "release") {
output.outputFileName = "iou_v${android.defaultConfig.versionName}_release_${getCurrentTime()}.apk"
}
}
}
}
//獲取當前時間
def getCurrentTime() {
return new Date().format("yyyy-MM-dd HH:mm:ss")
}
以我自己的某個工程為例,最終打出的一個debug包如下:
iou_v1.1.6.1_debug_2018-10-17 17:11:36.apk
這斷配置的核心是設置output.outputFileName,鼠標點上去可以發(fā)現(xiàn)帜慢,這個output對象是BaseVariantOutput類型的坏快,但是我們查看BaseVariantOutput的代碼铅檩,發(fā)現(xiàn)死活找不到outputFileName屬性,這樣就很令人費解了莽鸿,網(wǎng)上找了一圈也沒相關(guān)資料介紹昧旨。
秉著刨根究底的精神,我們看看這個output到底是個什么鬼富拗?采用以下代碼在控制臺打印出來看看:
println output
Field[] fields = output.getClass().getDeclaredFields()
fields.each { field ->
println field.name
}
ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}}
__dyn_obj__
__meta_class__
__mapping__
__apkData__
__assemble__
__baseName__
__dirName__
__filterTypes__
__filters__
__mainOutputFile__
__name__
__outputFile__
__outputFileName__
__outputType__
__outputs__
__packageApplication__
__processManifest__
__processResources__
__versionCode__
__versionCodeOverride__
__versionNameOverride__
__zipAlign__
可以看到這個output的真實類型是ApkVariantOutputImpl_Decorated臼予,里面有個屬性__outputFileName__,這其實是個裝飾類啃沪,它真正的類型是ApkVariantOutput粘拾,outputFileName就是ApkVariantOutput里的屬性值。
2. 如何打包完成后將apk復制到指定目錄
我們做持續(xù)集成的時候创千,自動打包之后缰雇,可能會需要將包復制到指定的目錄。
project.tasks.all {task ->
if ("assembleDebug" == task.name || "assembleRelease" == task.name) {
//在打包完成之后追驴,增加一個任務
task.doLast {
println "====${task.name} doLast===="
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def apkFile = output.outputFile
//如果目標文件存在
if (apkFile.exists()) {
//將apk文件復制到桌面去
copy {
from apkFile.getCanonicalPath()
into "/Users/hjy/Desktop"
}
//復制到指定目錄后刪除原文件
delete(apkFile)
}
}
}
}
}
}