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

相关推荐
雨白5 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹6 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空8 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭8 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日9 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安9 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑9 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟14 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡15 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0015 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体