Gradle和Aritifactory,实现上传Apk并发送消息到钉钉

Gradle和Aritifactory

本文链接:https://blog.csdn.net/feather_wch/article/details/131746580

文章目录

Gradle基本介绍

1、Gradle是一种语言吗?

  1. 不是
  2. 而是一种构建自动化工具,用于多语言软件开发。
  3. 可以控制编译、打包、测试、部署和发布等任务。

2、gradle支持的语言有哪些?

  1. Java
  2. Kotlin
  3. Groovy
  4. Scala
  5. C/C++
  6. JavaScript²。

3、Gradle的构建脚本是用Groovy编程语言编写的。

4、Groovy是一种基于JVM的动态语言。

5、Gradle的整个API也是用Groovy语言设计的。

6、Gradl提供了一个基于Groovy语言的领域特定语言(DSL),支持两种DSL

  1. Groovy DSL => build.gradle
  2. Kotlin DSL => build.gradle.kts

7、DSL(领域特定语言)是什么?

  1. 一种针对特定领域或问题的语言,而不是通用的编程语言。
  2. Gradle的DSL是用来描述构建过程和项目结构的语言。

Gradle插件开发流程

  1. 开发
  2. 打包
  3. 上传
  4. 测试
  5. 发布
  6. -> 开发(1)

本地仓库

本地仓库构建两种方法:

  1. nexus-只支持java
  2. artifactory-支持java、php、docker等等

artifactory

目的:

  1. 本地组件提交到本地仓库
  2. 服务端拉到本地仓库

搭建

要在 windows 上搭建 jfrog artifactory,可以参考以下的资源:

实际步骤

  1. 下载压缩包artifactory_pro_and_crack,并且解压缩,包含内容:artifactory-injector-1.1.jar和jfrog-artifactory-pro-6.6.0.zip
  2. 配置好JAVA环境
  3. 破解1:输入 java -jar .\artifactory-injector-1.1.jar
  4. 破解2:选择2
  5. 破解3:输入aritifactory路径,需要下面有文件夹webapps,如 xxx\artifactory_pro_and_crack\jfrog-artifactory-pro-6.6.0\artifactory-pro-6.6.0
  6. 破解4:选择1,保存得到的密钥字符串
  7. 运行artifactory-pro-6.6.0\bin目录下的 artifactory.bat
  8. 浏览器输入:localhost:8081
  9. 点击上方提示文字:输入key
  10. 账户名:admin 密码:password

添加仓库

远程仓库

  1. 选择Remote
  2. 右侧,+New
  3. 创建Maven仓库:代理google仓库
  4. 创建成功

本地仓库

  1. 选择Local
  2. 创建maven仓库:名称为android_local
  3. 测试:上传插件gradle-8.0-bin.zip

修改默认文件大小

  1. Admin->General Configuration
  2. File Upload Max Size 修改为 1000MB
  3. save

设置分组

  1. 原因:原来要设置远程和本地几个仓库,很麻烦,直接分一组
  2. Admin->Virtual
  3. New->取名为"android-group"
  4. 选择需要加进去的Repository
  5. Save&Finish

使用本地仓库

gradle插件

gradle-wrapper.properties

https://services.gradle.org/distributions/gradle-8.0-bin.zip

修改为:

http://localhost:8081/artifactory/andorid_local/gradle-8.0-bin.zip
仓库引入
    repositories {
        maven { url 'http://localhost:8081/artifactory/andorid_group/' }
    }

插件buildSrc开发步骤

xxxPlugin

核心代码

1、创建名为releaseHelper的任务,并且建立Extension配置项和Task的关联

java 复制代码
project.getExtensions().create("releaseHelper", Extension.class, project);

2、创建任务一:App发布到蒲公英平台

java 复制代码
 // Create PgyUpload task
PgyerUploadTask pgyUploadTask = project.getTasks().
            create("pgyUploadFor" + variantName, PgyerUploadTask.class);
pgyUploadTask.init(variant, project);

3、创建任务二:发送App发布消息到钉钉

java 复制代码
// Create SendMsgToDingTalkTask task
SendMsgToDingTalkTask sendMsgToDingTalkTask = project.getTasks().
    create("sendMsgToDingTalkFor" + variantName, SendMsgToDingTalkTask.class);
sendMsgToDingTalkTask.init(variant, project);

4、构建assembleRelease和两个task之间的依赖关系

java 复制代码
// assembleRelease依赖于clean
variant.getAssembleProvider().get().dependsOn(project.getTasks().findByName("clean"));
// 蒲公英上传依赖于assembleRelease
pgyUploadTask.dependsOn(variant.getAssembleProvider().get());
// 钉钉消息依赖于蒲公英上传
sendMsgToDingTalkTask.dependsOn(pgyUploadTask);

PgyerUploadTask

java 复制代码
    @TaskAction
    public void uploadToPgy() {
// 1、拿到app的build.gradle中android标签下内容
        AppExtension appExtension = (AppExtension) targetProject.getExtensions().findByName("android");
        for (BaseVariantOutput it : variant.getOutputs()) {
// 2、拿到输出文件
            File apkFile = it.getOutputFile();
// 3、展示app相关信息
            Extension extension = Extension.getConfig(targetProject);
            System.out.println("#######################################################################");
            System.out.println("# applicationId :" + variant.getMergedFlavor().getApplicationId());
            System.out.println("# uploadFileName:" + apkFile.getAbsoluteFile());
            System.out.println("# versionName   :" + appExtension.getDefaultConfig().getVersionName());
            System.out.println("# versionCode   :" + appExtension.getDefaultConfig().getVersionCode());
            System.out.println("# appName       :" + extension.appName);
            System.out.println("# changeLog     :" + extension.changeLog);
            System.out.println("#######################################################################");
// 4、Retrofit上传
            try {
                // 1. Get FIR upload info includes icon and apk uploading;
                Response<ResponseBody> appsResponse = RetrofitUtil.
                        getRetrofit("https://www.pgyer.com/apiv2/").
                        create(PgyerUploadInterface.class).
                        uploadFile(RetrofitUtil.getTextBody(extension.pgyApiKey),
                                RetrofitUtil.getFilePart("application/vnd.android.package-archive", apkFile),
                                RetrofitUtil.getTextBody("2"),
                                RetrofitUtil.getTextBody("123456"),
                                RetrofitUtil.getTextBody("test"),
                                RetrofitUtil.getTextBody("XiangxueGradle"),
                                RetrofitUtil.getTextBody("2")).
                        execute();
                System.out.println("\n1. AppsResponse:" + new Gson().toJson(appsResponse.body().string()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

SendMsgToDingTalkTask

发送消息到钉钉

java 复制代码
    @TaskAction
    public void SendMessageToDingTalk() {
        Extension extension = Extension.getConfig(targetProject);
        DingMsg dingMsg = new DingMsg();
        dingMsg.actionCard.title = extension.msgTitle;
        dingMsg.actionCard.text = extension.msgContent;
        dingMsg.actionCard.singleTitle = extension.singleButtonTitle;
        dingMsg.actionCard.singleURL = extension.singleButtonUrl;
        try {
            Response<ResponseBody> response = RetrofitUtil.
                    getRetrofit("https://oapi.dingtalk.com/").
                    create(DingTalkInterface.class).
                    sendMsgToDingTalk(extension.apiToken, dingMsg).
                    execute();
            System.out.println("DingTalkMsgResponse:" + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

未来展望

1、支持多渠道、多维度打包

2、支持上传Jenkins

相关推荐
小比卡丘2 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭3 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss4 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
代码敲上天.5 小时前
数据库语句优化
android·数据库·adb
GEEKVIP7 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model20059 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏6899 小时前
Android广播
android·java·开发语言
与衫10 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
500了16 小时前
Kotlin基本知识
android·开发语言·kotlin
人工智能的苟富贵17 小时前
Android Debug Bridge(ADB)完全指南
android·adb