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: fuyonghui@zjhcsoft.com
* @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: fuyonghui@zjhcsoft.com
* @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 文件的名字。