Config your output file name in Gradle Kotlin DSL
Last time I worked a lot with Gradle Kotlin DSL . Once, I need to configure output file name of .apk
file after building to support CI / CD. If using Groovy then Okie, the story is quite simple, you can find it here .
But with Gradle Kotlin DSL, it’s different, I also spent half of my “oh my god” to find a solution to this problem. Finally I found this post .
After that, I also edited it a bit to make it work. Available here to share with you guys …
./app/build.gradle.kts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <span class="token keyword">import</span> com <span class="token punctuation">.</span> android <span class="token punctuation">.</span> build <span class="token punctuation">.</span> gradle <span class="token punctuation">.</span> api <span class="token punctuation">.</span> ApplicationVariant <span class="token keyword">import</span> com <span class="token punctuation">.</span> android <span class="token punctuation">.</span> build <span class="token punctuation">.</span> gradle <span class="token punctuation">.</span> api <span class="token punctuation">.</span> BaseVariantOutput <span class="token keyword">import</span> com <span class="token punctuation">.</span> android <span class="token punctuation">.</span> build <span class="token punctuation">.</span> gradle <span class="token punctuation">.</span> internal <span class="token punctuation">.</span> api <span class="token punctuation">.</span> BaseVariantOutputImpl <span class="token keyword">import</span> java <span class="token punctuation">.</span> text <span class="token punctuation">.</span> SimpleDateFormat <span class="token keyword">import</span> java <span class="token punctuation">.</span> util <span class="token punctuation">.</span> <span class="token operator">*</span> plugins <span class="token punctuation">{</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> android <span class="token punctuation">{</span> <span class="token function">compileSdkVersion</span> <span class="token punctuation">(</span> Android <span class="token punctuation">.</span> targetSdk <span class="token punctuation">)</span> defaultConfig <span class="token punctuation">{</span> applicationId <span class="token operator">=</span> Android <span class="token punctuation">.</span> applicationId <span class="token function">minSdkVersion</span> <span class="token punctuation">(</span> Android <span class="token punctuation">.</span> minSdk <span class="token punctuation">)</span> <span class="token function">targetSdkVersion</span> <span class="token punctuation">(</span> Android <span class="token punctuation">.</span> targetSdk <span class="token punctuation">)</span> versionCode <span class="token operator">=</span> Android <span class="token punctuation">.</span> versionCode versionName <span class="token operator">=</span> Android <span class="token punctuation">.</span> versionName testInstrumentationRunner <span class="token operator">=</span> AndroidJUnitRunner <span class="token punctuation">.</span> runner <span class="token punctuation">}</span> <span class="token comment">// Config your output file name</span> applicationVariants <span class="token punctuation">.</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token function">ApplicationVariantAction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> ApplicationVariantAction <span class="token operator">:</span> Action <span class="token operator"><</span> ApplicationVariant <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">execute</span> <span class="token punctuation">(</span> variant <span class="token operator">:</span> ApplicationVariant <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">val</span> fileName <span class="token operator">=</span> <span class="token function">createFileName</span> <span class="token punctuation">(</span> variant <span class="token punctuation">)</span> variant <span class="token punctuation">.</span> outputs <span class="token punctuation">.</span> <span class="token function">all</span> <span class="token punctuation">(</span> <span class="token function">VariantOutputAction</span> <span class="token punctuation">(</span> fileName <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">fun</span> <span class="token function">createFileName</span> <span class="token punctuation">(</span> variant <span class="token operator">:</span> ApplicationVariant <span class="token punctuation">)</span> <span class="token operator">:</span> String <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"YourAppName"</span> <span class="token operator">+</span> <span class="token string">"_ <span class="token interpolation"><span class="token delimiter variable">${</span> variant <span class="token punctuation">.</span> name <span class="token delimiter variable">}</span></span> "</span> <span class="token operator">+</span> <span class="token string">"_verCode <span class="token interpolation"><span class="token delimiter variable">${</span> Android <span class="token punctuation">.</span> versionCode <span class="token delimiter variable">}</span></span> "</span> <span class="token operator">+</span> <span class="token string">"_ <span class="token interpolation"><span class="token delimiter variable">${</span> <span class="token function">getDateTimeFormat</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token delimiter variable">}</span></span> .apk"</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">fun</span> <span class="token function">getDateTimeFormat</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">:</span> String <span class="token punctuation">{</span> <span class="token keyword">val</span> simpleDateFormat <span class="token operator">=</span> <span class="token function">SimpleDateFormat</span> <span class="token punctuation">(</span> <span class="token string">"yyMdHms"</span> <span class="token punctuation">,</span> Locale <span class="token punctuation">.</span> US <span class="token punctuation">)</span> <span class="token keyword">return</span> simpleDateFormat <span class="token punctuation">.</span> <span class="token function">format</span> <span class="token punctuation">(</span> <span class="token function">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token function">VariantOutputAction</span> <span class="token punctuation">(</span> <span class="token keyword">private</span> <span class="token keyword">val</span> fileName <span class="token operator">:</span> String <span class="token punctuation">)</span> <span class="token operator">:</span> Action <span class="token operator"><</span> BaseVariantOutput <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">override</span> <span class="token keyword">fun</span> <span class="token function">execute</span> <span class="token punctuation">(</span> output <span class="token operator">:</span> BaseVariantOutput <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> output <span class="token keyword">is</span> BaseVariantOutputImpl <span class="token punctuation">)</span> <span class="token punctuation">{</span> output <span class="token punctuation">.</span> outputFileName <span class="token operator">=</span> fileName <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> dependencies <span class="token punctuation">{</span> <span class="token comment">//...</span> <span class="token punctuation">}</span> |
applicationVariants
: Contains all information about buildTypes, productFlavors, outputs, bla.bla …variant.outputs
: Contains information about the output file, you need to cast it toBaseVariantOutputImpl
to change its file name.
When building App, applicationVariants
will call the execute()
of ApplicationVariantAction
. Next, variant.outputs
will call execute()
of VariantOutputAction
.
Regarding the file name, then we will format AppName_variantName_versionCode_DateTime.apk
. Everyone can change as you like, see function createFileName()
.
Here is the final result,
You can view my full source demo here .
Or gist
it neatly Config your output file name in Gradle Kotlin DSL
Wished everyone success,
** Happy coding !!! **