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!!! **