Android 工程打包的時候apk 的名字會使用默認的名字,每次發佈還需要手工修改名字比較麻煩 之前 是在module 的build.gradle 中添加了 groovy 代碼,但是在進行其他項目的時候還需要將代碼添加到新的工程中不是很方便 所以覺得製作一個簡單的gradle 插件 用起來方便點。
//第一步將創建一個library module ,然後將apply library 修改爲 apply groovy 刪除 android 等用不到的閉包
//刪除 src 文件下的 Androidtest test 文件夾 這些都用不到 只留下 main文件夾
//刪除 main 文件加下 的 res 文件夾(裏面是Android 的資源文件 用不到), Androidmanfest 文件 (android 配置文件)
//將java 文件夾修改爲 groovy
//在main 文件夾下 創建 resources 文件 resources/META-INF/gradle-plugins 路徑格式強制要求
(創建properties文件,該文件名字就是你插件的名字 在其他地方引用的時候 apply 的時候用的就是這個文件的名字, 我這裏就是 apply plugin: 'com.zjhcsoft.apkname')implementation-class=com.zjhcsoft.fyh.ApkNamePlugin
//一行代碼 就是你繼承Plugin<Project> 類的groovy 文件 路徑
ApkNamePlugin.groovy 文件用來實現功能 內容如下:
package com.zjhcsoft.apknameplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* @author by nate_fu on 2019/3/6.
* @version vision 1.0
* @Email: [email protected]
* @description: groovy 的語法和Java很相似 我們把之前 寫在 build.gradle 的 修改apk 名字的代碼搬到這裏
*/
class ApkNamePlugin implements Plugin<Project>{
@Override
void apply(Project project) {
project.extensions.create('apkname',ApkNameExtension)
project.android.applicationVariants.all { variant ->
variant.outputs.all { output->
//找到工程的 Android
def androidExtensions = project.extensions.findByName("android")
//得到versionName
def versionName = androidExtensions.defaultConfig.versionName
def outputFile = output.outputFile
def fileName
def apkName = project.extensions.apkname.apkName == "" ? project.name : project.extensions.apkname.apkName
if (outputFile!=null&&outputFile.name.endsWith('.apk')){
if (variant.buildType.name.equals('release')){
fileName = "${apkName}${versionName}.apk"
}else if (variant.buildType.name.equals('debug')){
fileName = "${apkName}_debug.apk"
}
outputFileName =fileName
}
}
}
}
}
ApkNameExtension.groovy 文件是自定義的 一些屬性 可以用來傳遞參數
package com.zjhcsoft.apknameplugin;
/**
* @author by nate_fu on 2019/3/6.
* @version vision 1.0
* @Email: [email protected]
* @description:
*/
class ApkNameExtension {
String apkName="";
}
在這裏我們只定義了一個apkName 我們在工程中使用這個插件的時候 就可以吧工程的apk 包名傳遞過來。
apkname{
apkName="test_apk"
}
在工程的build.gradle 中使用這個屬性
插件的 build.gradle 我們需要配置一些信息 包括apply groovy 添加 gradle 依賴 等
apply plugin: 'groovy'
apply plugin: 'maven'
// maven 本地倉庫路徑
def MAVEN_LOCAL_PATH = uri('../../local_repo')
def ARTIFACT_ID = 'apknameplugin'
def VERSION_NAME = '1.0.0'
def GROUP_ID = 'com.zjhcsoft.fyh'
//加入依賴
dependencies {
compile gradleApi()
compile localGroovy()
}
uploadArchives{
repositories {
mavenDeployer {
repository(url: MAVEN_LOCAL_PATH)
pom.project{
groupId GROUP_ID
artifactId ARTIFACT_ID
version VERSION_NAME
}
}
}
}
使用 gradle 的uploadArchives命令 我們添加的 URL 是本地的maven 倉 相對地址
def ARTIFACT_ID = 'apknameplugin'
def VERSION_NAME = '1.0.0'
def GROUP_ID = 'com.zjhcsoft.fyh'
定義這個插件的三個標記 用於在倉庫中找到這個插件
之後我們可以點擊右側的 uploadArchives 命令上傳到本地 倉庫
然後我們在文件夾下就找到了我們倉庫中的插件
最後是我們將上傳到本地倉庫的插件在 我們的工程中使用
在工程的根目錄下的 build.gradle中引入本地maven 倉庫
repositories {
//引入本地maven 倉庫
maven{
url uri('../local_repo')
name 'local-repo'
}
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
再 添加 插件的依賴
dependencies {
classpath 'com.zjhcsoft.fyh:apknameplugin:1.0.0'
}
然後再在我們module 的 build.gradle 中 apply 我們的插件
apply plugin: 'com.zjhcsoft.apkname'
插件的名字 需要注意使用的就是我們之前創建的 resources 文件夾下 的 properties 文件的名字。