天天看點

Android Studio3.0修改apk名稱

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,滑鼠點上去可以發現,這個output對象是BaseVariantOutput類型的,但是我們檢視BaseVariantOutput的代碼,發現死活找不到outputFileName屬性,這樣就很令人費解了,網上找了一圈也沒相關資料介紹。

秉着刨根究底的精神,我們看看這個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複制到指定目錄

我們做持續內建的時候,自動打包之後,可能會需要将包複制到指定的目錄。

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)
                    }
                }
            }
       }
    }
}
           

繼續閱讀