APK重命名gradle插件

2019-08-14 17:07:09 浏览数 (1)

Android打包流程的结果是一个apk文件,而apk的命名默认使用的是(module-name) (build-varints) (build-type).apk,是不是经常能见到app-debug.apk,这是因为使用AS新建一个项目时,默认module名是app,然后直接使用as的run工具,其实执行的assembleDebug命令再加安装。这就是app-debug.apk的由来。 本文将介绍一个如何给APK重新命名的插件,指定名称,不再局限于module名的限制。本文使用开发Gradle插件并上传至本地maven库中的生成插件模板进行开发。

使用模板创建插件

代码语言:javascript复制
$ sh plugintemplate.sh ApkRenamePlugin ApkRenamePlugin

生成ApkRenamePlugin目录后,使用AS打开。

编写插件代码

这里创建了一个扩展类,有一个可以在build.gradle文件中自定义app名称,如果不配置,那么默认还是使用module名。这边用的是appname versionname versioncode.apk的命名规则,这里可以根据自己的需求进行修改,或者将其放到扩展参数里,留给用户在build.gradle中设置。

  1. 在src/main/groovy目录下创建包名,将ApkRenamePlugin移至包下;
  2. 修改resources/gradle-plugins/xxx.properties中,给你的plugin取名,这里xxxx就是gradle文件中apply的内容。
  3. 完善代码,重命名逻辑
代码语言:javascript复制
class ApkRenamePlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {

        //配置参数以apkrename{}进行配置
        ApkRenamePluginExtension apkRenameExtensions = project.extensions.create("apkrename", ApkRenamePluginExtension)

        configureApkRename(project, project.android.applicationVariants, apkRenameExtensions)


    }

    private void configureApkRename(Project project, DomainObjectCollection<Variant> variants, ApkRenamePluginExtension apkRenamePluginExtension) {

        def projectName = project.name

        project.afterEvaluate {

            variants.all { variant ->

                //拿到build.gradle中android{}内容
                def androidExtensions = project.extensions.findByName("android")

                //得到versionName和versionCode
                def versionName = androidExtensions.defaultConfig.versionName
                def versionCode = androidExtensions.defaultConfig.versionCode

                variant.outputs.each { output ->
                    if (output != null && output.outputFile.name.endsWith(".apk")) {

                        //原apk命名
                        def originApkName = output.outputFile.name
                        def apkNameSuffix = originApkName.substring(projectName.length())

                        //新的apk名称
                        def apkName = apkRenamePluginExtension.apkName == "" ? projectName : apkRenamePluginExtension.apkName
                        //创建新的文件
                        def apkFile = new File(output.outputFile.parent, "${apkName}-${versionName}-${versionCode}${apkNameSuffix}")
                        //重命名
                        output.outputFile = apkFile
                    }
                }
            }
        }
    }

}

其中ApkRenamePluginExtensions定义如下:

代码语言:javascript复制
class ApkRenamePluginExtension {
    String apkName=""
}
  1. 修改build.gradle中的group、artifactId和version;
  2. 执行publistToMavenLocal任务,将插件提交至本地maven库

应用插件

创建一个app项目,在其build.gradle中加入如下代码:

代码语言:javascript复制
buildscript {
    repositories {
        jcenter()
        mavenLocal()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
        classpath 'com.xingfeng.plugin:ApkRenamePlugin:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.xingfeng.apkrename'

apkrename {
    apkName="RenameTest"
}

执行assembleDebug后,打出来的包名是:

代码语言:javascript复制
RenameTest-1.0-1-debug.apk

代码

关于代码请查看git地址:https://github.com/wangli135/ApkRenamePlugin 其中也有生成插件的脚本。

0 人点赞