前言
公司现有渠道 SDK 接入需要使用两个工程,首先在粘合工程编写粘合代码测试完毕后需要手动将粘合代码打成一个 jar 包,然后移动该 jar 包以及相关资源到 SDK 工程,接着再手动打成 zip 包上传 oss,同时同步信息到 oms 后台,过程非常繁琐。于是我就开发了该插件用于解决该问题。
需求分析
目标为将两个工程合并成一个,执行一个 Task 就会自动执行以下操作:
- 抽取粘合代码并打成 jar 包,并拷贝到 build/pack 目录下。
- 迁移相关资源文件夹 res、libs、assets 及 sdk_script 文件到 build/pack 目录下。
- 根据 AndroidManifest.xml 自动生成 SDKManifest.xml。
- 根据 Gradle 配置信息生成 config.xml。
- 将上述资源打包成 zip 包。
- 上传 zip 包到 oss 后台,更新 oms 后台 sdk 版本及下载链接。
- 自动更新 versionCode,确保每次打包使用最新资源。
代码实现
首先根据上篇文章,自定义插件类 PackPlugin,先不急于实现逻辑,分析下是否需要配置信息,很明显需要,于是创建类 PackExtension,代码如下:
open class PackExtension { |
定义好了配置,那么就来实现功能,首先是第一步。自定义 Task 类 PackJarTask ,代码如下:
open class PackJarTask: Jar() { |
注意父类 Jar 类会实现打包,所有只需要在 init 代码块中配置好输入输出即可,第一步完成后那么来实现第二步。自定义 Task 类 PackMoveTask ,代码如下:
open class PackMoveTask : DefaultTask() { |
这一步就是简单的拷贝资源,第二步完成后那么来实现第三步。自定义 Task 类 PackManifest ,代码如下:
open class PackManifestTask : DefaultTask() { |
这一步稍稍复杂,首先借助了 XmlParser 解析 AndroidManifest.xml ,然后借助代码库 kotlin-xml-builder 以 DSL 的形式构建 SDKManifest.xml 。第三步完成了那么来实现第四步。自定义 Task 类 PackConfigTask ,代码如下:
open class PackConfigTask : DefaultTask() { |
这一步就是读取 PackExtension 中定义的配置信息,将其写入 config.xml 中,第四步完成了那么实现第五步,自定义 Task 类 PackZipTask ,代码如下:
open class PackZipTask : Zip() { |
这一步和第一步类似,父类 Zip 类会完成打包操作,只需在 init 代码块中配置好输入输出即可。第五步完成了那么实现第六步上传 oss 后台,并更新 oms 信息。自定义 Task 类 PackUploadTask。
open class PackUploadTask : DefaultTask() { |
这一步首先使用 PackExtension 配置的用户名和密码登录 oms 后台,并获取到 token,然后将上个 Task 生成的 zip 包上传到了 oss 后台,然后调用调用接口修复 oms 后台 sdk 信息(带上 token)。上传完成后就只剩下最后一步了更新版本号,自定义 Task 类 PackTask ,代码如下:
open class PackTask : DefaultTask() { |
这一步也就是读取 properties 文件,然后将其 versionCode 自增 1 写入。至此逻辑全部完成了,现在可以编写 PackPlugin 类了,代码如下:
class PackPlugin : Plugin<Project> { |
插件首先添加了 PackExtension 扩展,以及 PackJarTask、PackMoveTask、PackManiTask、PackConfigTask、PackZipTask、PackUploadTask、PackTask 这 7 个 Task,并使用 mustRunAfter 约束执行顺序,同时在打 jar 包时前需要执行下编译,因此使 PackJarTask 依赖 BuildTask。至此该插件就开发完成了,直接执行下 PackTask 就可以自动完成上述操作。
上传 Maven 仓库
在 build.gradle 中添加应用 maven 插件,然后配置以下信息:
uploadArchives { |
执行该 Task 就会把该插件上传到公司内部 Maven 仓库。