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
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
: 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,
**Happy coding!!! **