自動重命名android 裏面的versionName字段(創建一個自定的gradle插件)
爲毛開發這個屌功能,你們這些辣雞開發都知道吧。
那麼,我回答問題之前我先問一個問題,你們所有的apk自動生成一樣的名字?當然不,應用的名字就像2.3 13.1.0——2342等等。這個似乎對發佈一個版本已經足夠了,但是這個應用是處於正在開發,應用程序的名字最好能提供更多的信息。
我發現這個方法對我的團隊非常的有用,每個團隊成員開發不同的功能,這個工具就會自動的根據開發的功能重命名,所以不同的構建系統的模塊基於不同的開發功能命名,例如:測試,產品作者,代碼整合。
自定義gradle插件
作爲一個開發者日常開發就用到了幾個gradle的插件,比如com.android.application 是用於android app的插件。插件將讓我們操作和擴展我們的構建系統非常方便或者讓我們指定一些設置。實際上,這就是我們想要的功能,修改默認的構建系統並讓它修改viersionname字段。
有三種不同的方法去創建一個gradle的插件。構建gradle插件文檔 ,但是我們將會使用一個buildSrc文件(文件找不到?看看文檔吧,在根目錄下創建一個buildSrc文件夾,然後sync一下。就可以噠),主要因爲它簡單,而且它會添加到你的倉庫中。另一方面,插件會被附到你的項目上,不會被重用。
1.首先我需要在gradle的編譯文件夾中創建一個proper的文件(提示:同步之後,gradle 會檢測到groovy文件夾並且會標記成圖片這樣。)所以,構建進程會編譯每個在這個文件夾下的代碼。
2.然後我們創建一個插件文件夾(CustomPlugin.groovy) 在剛纔那個包下。這個插件的主要功能是會創建一個gradle的工作task,其實就是爲了去修改app versionName並且把它添加到任務流程中。我們在編寫拆件之前創建一個gradle 的修改app名字的task。
gradle task
正如猜測的那樣,一個task在一個構建進程中只有一個實例對現實跟。下一步我們就要自定義一個修改app的名字的task,類似android構建系統裏面的task一樣。
就想其它的task一樣,我們需要繼承DefaultTask 並且必須實現默認方法run
class RenameAppVersionNameTask extends DefaultTask {
@TaskAction
def run() {
project.configure(project) {
// Check if plugin works on an Android module
if (it.hasProperty("android")) {
// Iterate over app build variants (build types + flavors)
project.android.applicationVariants.all { variant ->
// Only change debug build type variants
if (variant.buildType.name == project.android.buildTypes.debug.name) {
// Rename versionName
def customVersionName = variant.mergedFlavor.versionName
variant.mergedFlavor.versionName = customVersionName + " custom"
}
}
}
}
}
RenameAppVersionNameTask() {
group = 'customPlugin'
description = 'Renames versionName of the app depends on the current git branch name'
}
}
task 依附
我們已經設計了一個task修改VersionName,現在我們要實現gradle插件並且把這個插件加到構建系統中去。
自動Android構建給app加入了versionName信息,我們必須確定task相關的功能會在android構建系統開始之前出發。下面是prebuild 能夠在構建之前完成相關的任務。
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('renameAppVersionName', type: RenameAppVersionNameTask)
project.tasks.getByName('preBuild').dependsOn('renameAppVersionName')
}
}
應用插件:
這個我們已經創建的插件我們能夠應用到android application module裏面(甚至是android library modlue裏面)
只需要應用這個插件在build。gradle文件中,就像下面這樣。
apply plugin: CustomPlugin