Skip to content

Dashboard

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

Created by Admin

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 file name khi build của file .apk để 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 trên Stack Overflow.

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ề buildType, productFlavor, 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 TênApp_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,

**Happy coding!!! **

Source: https://viblo.asia/p/how-to-config-your-output-file-name-in-gradle-kotlin-dsl-android-L4x5x6qYZBM