当前位置: 首页 > news >正文

Gradle 入门说难也不难,说简单吧也不简单~

在学习过程中最痛苦的事,并不是认为自己坚持不下去学不会,而是对某块知识点的碎片信息学习了很多,仍然无法窥其门径,处于懵懂状态。

就拿Gradle来说,我之前就是这种状态,不管怎么去查阅文档和视频,一直有些知识点搞不懂,但是自己起手完成过一个需求后,才发现Gradle 也不是那么难学懂嘛,虽然中间也踩了不少的坑。

中间遇到的问题有:

  • 如何创建 private、public 两个 build variants(构建变体)?
  • 如何配置 public 版本在 private 版本之前构建(因为 private 版本依赖 public 版本生成的 apk)?
  • public 版本构建完成后,如何自动复制其生成的 apk 到 private 版本的 assets 目录下?

解决方案:

  • 关于构建变体,其实就是一次编译,输出多个版本的 apk,具体内容请参考官方文档中文版《配置构建变体》
  • 两个构建变体,说明对应两个 assemble task,那么只要获获取到这两个 task 对象,然后设置其依赖关系即可
  • Gradle 文件支持 groovy 编写,groovy 又是基于 java 的,所以即使不熟悉 groovy 的语法,也可以用 java 写出来。不过对于复制这种操作,Gradle 有现成的 API

编写流程

方案很清晰:assemblePublicApp -> deleteOldPublicApp -> signNewPublicApp -> copyNewPublicApp -> assemblePrivateApp

但是代码怎么写呢?我一时间感到无从下手。比如如何获取两个构建变体对应的 assemble task?如何创建一个 copy task?又如何在执行 copy task 之前先执行 delete task(删除 assets 目录下的旧 apk) 以及 sign task(签名 public apk)?

我一顿 google 搜索之后解决了这些问题,不过也踩了一个坑,就是自定义 task 内的代码执行时机不对。比如 deleteOldPublicApk task 中的日志,总是在执行 gradle assemble 命令之后立即输出,而不是在 assemblePublicApp task 之后输出:

File -> Demo/app/build.gradle

android {
    ...
}

task deleteOldPublicApk(type: Delete) {
    println("-----------> delete the old pubic apk begin") // 注意:这么写代码会在配置阶段立即执行
    delete 'src/privateApp/assets/Public.apk' // delete 方法继承自 Delete task,所以是一个 Action,在执行阶段才会被执行
    println("-----------> delete the old pubic apk end") // 注意:这么写代码会在配置阶段立即执行
}

task signNewPublicApp() {
    doFirst {
        println 'sign the new public app' // 写在 doFirst 或者 doLast 中,才会在执行阶段被执行,具体见下文
    }
}

task copyNewPublicApp() {
    doLast {
        println 'copy the new public app'
    }
}

afterEvaluate {
    def assemblePublic = tasks.getByName('assemblePublicAppRelease')
    deleteOldPublicApk.dependsOn(assemblePublic)

    copyNewPublicApp.dependsOn(deleteOldPublicApk, signNewPublicApp)

    def assemblePrivate = tasks.getByName('assemblePrivateApp')
    assemblePrivate.dependsOn(copyNewPublicApp)
}

dependencies {
    ...
}

如上所示的 deleteOldPublicApk task,只要在 terminal 中 输入 gradlew assemble 必然会首先打印:

-----------> delete the old pubic apk begin
-----------> delete the old pubic apk end

相信很多不熟悉 Gradle 的人都会犯这样的错误,stackoverflow 上有人也发出了同样的疑问 Why is my Gradle task always running?

后来我阅读了 Gradle 的官方文档 《Build Lifecycle》,恍然大悟,应该这么写:

task deleteOldPublicApk(type: Delete) {
    doFirst {
        println("-----------> delete the old pubic apk begin")
    }
    delete 'src/privateApp/assets/Public.apk'
    doLast {
        println("-----------> delete the old pubic apk old")
    }
}

于是在我自己弄得以后,整理了一个《Gradle 入门到精通》学习笔记,根据自己学习中所做的一些笔录来整的,主要也是方便后续好复习翻阅,省掉在去网上查找的时间,以免在度踩坑,如果大家有需要的可以直接通过点击此处↓↓↓进行参考学习!!!

有需要的可以复制下方链接,传送直达!!!
https://qr21.cn/CaZQLo?BIZ=ECOMMERCE

Gradle基础

深度探索 Gradle 自动化构建技术

深入理解Gradle框架

Android Gradle Plugin 源码解析

相关文章:

  • 层次聚类分析及代码实现
  • 学生选课系统 前后端分离 vue springboot
  • 网络安全比赛A模块任务书
  • IP报文在阿里云上的神奇之旅:同地域内云上通信
  • 基于网络安全的Docker逃逸
  • Android——一个简单的音乐APP(二)
  • 在Eclipse 中使用 Maven 创建雅加达 EE 应用程序
  • 112-JavaSE基础进阶:XML的创建、文档约束、文件的解析技术-Dom4J、解析案例、文件的数据检索技术-XPath
  • 计算机网络 第3 章 数据链路层
  • 如何让不给听得ge乖乖听话?python教你如何做...
  • C# Winform跨线程更新UI控件的方法
  • Linux学习 -- shell工具的复习(cut/sed/awk/sort)
  • C语言百日刷题第四天
  • C生万物 | 初识C语言【1024,从0开始】
  • 计算机网络-物理层(数据交换方式(电报交换,报文交换,分组交换),数据报,虚电路,传输介质,物理层设备(中继器,集线器))
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • ➹使用webpack配置多页面应用(MPA)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • centos安装java运行环境jdk+tomcat
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Idea+maven+scala构建包并在spark on yarn 运行
  • ng6--错误信息小结(持续更新)
  • nginx 配置多 域名 + 多 https
  • Odoo domain写法及运用
  • Spring Boot MyBatis配置多种数据库
  • Travix是如何部署应用程序到Kubernetes上的
  • 初识 beanstalkd
  • 记一次和乔布斯合作最难忘的经历
  • 记一次用 NodeJs 实现模拟登录的思路
  • 技术胖1-4季视频复习— (看视频笔记)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 设计模式 开闭原则
  • 使用 @font-face
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 线上 python http server profile 实践
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #Java第九次作业--输入输出流和文件操作
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $.ajax()参数及用法
  • (3)(3.5) 遥测无线电区域条例
  • (C++17) std算法之执行策略 execution
  • (k8s中)docker netty OOM问题记录
  • (搬运以学习)flask 上下文的实现
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (九十四)函数和二维数组
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .md即markdown文件的基本常用编写语法
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 调用php,php 调用.net com组件 --
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)