+7

How to config your output file name in Gradle Kotlin DSL - Android

Config your output file name in Gradle Kotlin DSL

Thời gian qua mình có làm việc khá nhiều với Gradle Kotlin DSL. Có lần, mình cần config output file name của file .apk sau khi build để hỗ trợ cho CI/CD. Nếu sử dụng Groovy thì Okie, câu chuyện cũng khá đơn giản, mọi người có thể tìm thấy ở đây.

Nhưng với Gradle Kotlin DSL thì lại khác, mình cũng đã mất nữa buổi "chời ơi đất hởi" để tìm giải pháp cho vấn đề này. Cuối cùng mình tìm được bài post này.

Sau đó mình cũng đã chỉnh sửa lại đôi chút để nó work được. Sẵn đây chia sẻ với anh em bạn dì...

./app/build.gradle.kts

import com.android.build.gradle.api.ApplicationVariant
import com.android.build.gradle.api.BaseVariantOutput
import com.android.build.gradle.internal.api.BaseVariantOutputImpl
import java.text.SimpleDateFormat
import java.util.*

plugins {
    //...
}

android {
    compileSdkVersion(Android.targetSdk)

    defaultConfig {
        applicationId = Android.applicationId
        minSdkVersion(Android.minSdk)
        targetSdkVersion(Android.targetSdk)
        versionCode = Android.versionCode
        versionName = Android.versionName

        testInstrumentationRunner = AndroidJUnitRunner.runner
    }

    // Config your output file name
    applicationVariants.all(ApplicationVariantAction())
}

class ApplicationVariantAction : Action<ApplicationVariant> {
    override fun execute(variant: ApplicationVariant) {
        val fileName = createFileName(variant)
        variant.outputs.all(VariantOutputAction(fileName))
    }

    private fun createFileName(variant: ApplicationVariant): String {
        return "YourAppName" +
                "_${variant.name}" +
                "_verCode${Android.versionCode}" +
                "_${getDateTimeFormat()}.apk"
    }

    private fun getDateTimeFormat(): String {
        val simpleDateFormat = SimpleDateFormat("yyMdHms", Locale.US)
        return simpleDateFormat.format(Date())
    }

    class VariantOutputAction(
        private val fileName: String
    ) : Action<BaseVariantOutput> {
        override fun execute(output: BaseVariantOutput) {
            if (output is BaseVariantOutputImpl) {
                output.outputFileName = fileName
            }
        }
    }
}

dependencies {
    //...
}
  • applicationVariants: Chứa tất cả thông tin về buildTypes, productFlavors, outputs, bla.bla...
  • variant.outputs: Chứa thông tin về output file, bạn cần cast về BaseVariantOutputImpl thì mới change file name của nó được.

Khi build App, thì applicationVariants sẽ gọi execute() của ApplicationVariantAction. Tiếp theo, variant.outputs sẽ gọi execute() của VariantOutputAction.

Về file name, thì mình format AppName_variantName_versionCode_DateTime.apk. Mọi người có thể thay đổi tùy thích, xem function createFileName() nhé.

Đây là kết quả cuổi cùng,

Mọi người có thể xem full source demo của mình ở đây.

Hoặc gist cho nó gọn Config your output file name in Gradle Kotlin DSL

Chúc mọi người thành công,

Additional

Từ Gradle 6.5 và trở lên, bạn có thể sử dụng như bên dưới nhé, cho gọn gàn. Phía trên vì mục đích giải thích nên mình khai báo hơi cụ thể xíu. =)) (Thanks Chú An đã góp ý)

android {
    //...

    applicationVariants.all {
        val outputFileName = "YourAppName" +
                "_${name}" +
                "_verCode${Android.versionCode}" +
                "_${SimpleDateFormat("yyMdHms", Locale.US).format(Date())}.apk"
        outputs.all {
            val output = this as? BaseVariantOutputImpl
            output?.outputFileName = outputFileName
        }
    }
}

**Happy coding!!! **


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí