Android Gradle 学习笔记(一)概述

news2024/11/15 15:54:28

文章目录

  • 1. JVM构建工具的发展
    • 1.1 背景
    • 1.2 Ant - Java 早期构建工具
    • 1.3 Maven - Ant 的升级版
    • 1.3 Gant - IDEA 官方的构建工具
    • 1.4 Gradle - JVM集大成构建工具
  • 2. 为什么学习 Gradle?
  • 3. 学习提纲
  • 参考

1. JVM构建工具的发展

1.1 背景

我们平时在 IDE 上写了很多代码,然后直接 Shift+F10 让它运行在了平台环境(Android、Windows、iOS)上。这是因为 IDE 内置了编译、打包的能力,能够将代码编译成对应平台能够直接识别和运行的二进制文件

所以我们并不用关心 IDE 底层到底是如何编译代码的,只关心代码能不能在平台上按预期跑,有没有Bug,把注意力集中在应用层的代码逻辑实现上。

但假如你写的代码要放在用户的手机上用,你总不能让用户的手机连着你的电脑吧?亦或是你做了一个很吊的功能,别人想用这个功能,你乐意接受,但却不想将源码暴露出来,这该如何是好呢?

答案是:将代码以某种形式(二进制文件)上传到服务器上,用户下载后可以安装到手机上运行;别人也可以引用这个代码能力,同时查看不到所有的源码

比如我们所熟知的 .dex(Andorid)、.class(Java)、.pyc(python)都是经转化后能够被特定平台所识别的二进制文件。

我们一般把:

  • 代码转化成二进制文件的行为称作: 编译(Compile)
  • 将这些二进制文件优化成能被特定平台使用的文件的行为称作:打包(Package)
  • 将这些文件上传到服务器的行为称作:发布 / 部署(Publish)

虽然用了短短几个词进行概括,但在底层则是做了一系列的事情,例如 代码编译依赖管理签名资源编译混淆对齐等等操作。每些操作都需要依赖独特的工具,很明显,我们这些上层开发肯定是不会参与到这一流程中的,而是交给一套脚本工具,让脚本工具去集成 / 组合这些操作,然后按照顺序执行命令,实现自动化一条龙服务。我们平时写完代码后,点击“运行”其实就是让这套脚本工具开始运作。

如下图所示,从应用代码到生成 Apk 需要经历多个步骤,为了减少人工成本,需要自动化地去顺序执行这些操作,这就是构建脚本存在的意义
在这里插入图片描述

在我们的 Java 领域上,有这些脚本工具和配套工具:

  • Ant
  • Maven
  • Gant
  • Gradle

下面一一来介绍它们。

1.2 Ant - Java 早期构建工具

Ant 是由 Apache 公司开发的用于 Java 编译、测试、部署的自动化工具。 其脚本语言是 XML

它内置了 javacjava、创建 / 复制目录等功能,所以可以直接编译我们的 Java 代码生成实际项目。

每个脚本工具都会有一个默认的构建代码的文件,对于 Ant 来说,叫做:build.xml,它长这个样子:

<?xml version="1.0" ?> 
<project name="Hello World" default="execute">

	<target name="init">
		<mkdir dir="build/classes"/>
		<mkdir dir="dist"/>
	</target>
	<target name="compile" depends="init">
		<javac srcdir="src" destdir="build/classes"/>
	</target>
	
	<target name="compress" depends="compile">
	        <jar destfile="dist/HelloWorld.jar" basedir="build/classes"  />
	</target>

	<target name="execute" depends="compile">
		<java classname="HelloWorld" classpath="build/classes"/>
	</target>

</project>

它有几个标签,介绍其中几个重要的标签:

  • <project> :生成文件的根元素,表示一个工程
  • <target> : project的子元素,表示一个任务; 一个project中可以定义多个target元素,表示多个任务
  • <jar>:打包成 jar 包, destifile 为打包之后的名称, basedir 则为需要打包的 java 文件目录
  • <java>:运行 java 类, classname 指定运行类的名称, classpath 指定运行类所在的目录

Ant 是十分著名的 Java 自动化脚本工具,它的出现是为了解决早期的 Linux 的脚本工具 Make 的痛点,自发布以来,深受广大 Java 开发的青睐。但是 Ant 也有一些局限性和缺点,比如:

  • Ant 很难管理依赖,一般都要配合 Ivy (一种管理项目依赖的工具) 使用;
  • Ant 无法获取运行时的信息;
  • XML 作为脚本语言有一定的局限性,例如构建逻辑复杂时, XML 的代码将会很长,维护成本较大;
  • Ant 并没有为 Java 的自动化构建提供一个标准流程,其默认脚本文件一无所有,非常的灵活,需要开发者手动定制每个阶段的构建,这会导致大伙不清楚怎么样写脚本才是标准的,为此而苦恼。

1.3 Maven - Ant 的升级版

Maven 继承了 Ant 的项目构建功能,同样使用 XML 作为脚本语言,但它解决了很多 Ant 的痛点,例如:

  1. 它解决 Ant 过于灵活(开发需要从头到尾编写一份) 的问题,提供的默认脚本文件 pom.xml 里面帮我们定好了一套构建流程,我们在其给定好的标签里发挥就行。使得开发者不必在为“什么才是标准的构建流程代码”而苦恼了。
<project>
  <!-- Maven 2.X 版本的 pom文件 ,model的版本总是 4.0.0 -->
  <modelVersion>4.0.0</modelVersion>
  
  <!-- 本项目的坐标,表示项目标识的一组值信息 -->
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>

  <!-- 库依赖 -->
  <dependencies>
    <dependency>
    
      <!-- 依赖库的坐标信息 -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      
      <!-- 此依赖项仅用于运行和编译测试 -->
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
  1. 它解决了 Ant 需要依赖 Ivy 工具的问题。 Maven 提供公共的中央仓库,即脚本工具自身提供依赖管理能力。
    Maven从一个或多个代码仓库(例如Maven 2 Central Repository)动态地下载 Java 库与 Maven 插件,并将其存储在本地缓存区中

1.3 Gant - IDEA 官方的构建工具

Gant 也是一个基于 Ant 的构建工具,但这一次它不再使用 XML 做为脚本语言,而是使用 Groovy 语言做为脚本语言。

IDEA 默认支持 Gant,它能识别 .gant 结尾的文件, build.gant 就是其默认构建脚本文件,等同于 build.xml。可以看下这个文件:

Ant.echo(message : 'running build.gant')
Ant.property(file : 'build.properties')
def antProperty = Ant.project.properties

target(hello : 'say hello target') {
    depends(init)
    echo(message : antProperty.'echo.msg')
}
 
setDefaultTarget(hello)

Gant 和 Ant 的关系,就像是 Retrofit 和 OkHttp 的关系那样,通过使用 Groovy 语言来调用 Ant 的能力。不过 Groovy 语言相较于 XML 能够在写出复杂逻辑的构建代码时,提供不错的可读性,很多场景完全可以使用 Gant 来替代 Ant。

1.4 Gradle - JVM集大成构建工具

在这里插入图片描述
终于来到我们的主角:Gradle,它拥有上述几个脚本工具所具有的优点:

  • 使用 Groovy 作为脚本语言,在编写复杂构建逻辑时,能保持优良的可读性和重用性,并且很灵活,不像 XML 那样受限于只能描述数据而非流程的特性;
  • Gradle 是 Android 官方的构建工具,如今还能支持使用 Kotlin 来编写,对 Android 开发者来说非常之友好;
  • 强大的依赖管理,它能将依赖的库下载到电脑缓存中,被项目引用。即使跨平台跨机器,也能生成相同的库;
  • Gradle Wrapper 可以帮我们下载和管理 Gradle 版本,因为 Gradle 有多个版本,不同项目可能使用的是不同版本的Gradle,这个时候为了能够运行别人的项目,可以通过 Gradle Wrapper 来了解别人的构建版本,然后通过下载或修改使之能够运行在我们的电脑上;

它的默认脚本工具是 build.gradle,长这样:

plugins {
    id 'com.android.application'
}
android {
    defaultConfig {
        applicationId "com.example.gradle_demo"
        minSdk 21
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
                targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.1'
}

总之,Gradle 已经成为 JVM 上首选构建工具,作为一名 Android 程序员,我们甚至不用学习 Groovy,而是直接使用 Kotlin 来学习就好了。

2. 为什么学习 Gradle?

若要成为一名优秀的 Android 开发者,不仅要对应用层、Framework层有深刻的理解,还需掌握 Gradle,深入打包、发布流程。

Gradle 是 Android 开发息息相关的一门技术,由于 IDE 高度集成了 Gradle,大部分人平时基本和 Gradle 打不上交道,很多应用层开发者对这方面的认知较为浅薄,知识点零散。

通过学习 Gradle,除了了解编译、打包的知识,我们还能够进阶:因为很多 Android 技术都会涉及到 Gradle, 例如 自动化热修复组件化系统构建等,如果不会 Gradle,那势必也学不好这些技术。

3. 学习提纲

这里我根据整理来的知识,罗列一下学习清单:
在这里插入图片描述

主要不求过于深入,但求覆盖所有基础知识点。

参考

Gradle - Wiki
如何通俗理解 Gradle? - 知乎
Gradle核心思想(一)为什么现在要用Gradle?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+Element-plus el-select 下拉表格组件(el-select+el-table结合)

一、最终效果 二、代码示例 <t-select-table:table"table":columns"table.columns":max-height"400":keywords"{ label: name, value: id }"radioChange"radioChange" ></t-select-table>三、参数配置 1. 配置…

如何开始用Python编程

前言 你想开始学习如何编程吗&#xff1f;计算机编程令人望而生畏&#xff0c;你可能认为需要通过上课来学习。虽然对于某些语言来说可能是这样&#xff0c;但是有很多编程语言只需一到两天的时间就可以掌握基础知识。Python[1] 就是这样的一种语言。你在几分钟内就可以正常运…

【操作系统基础】实践部分

本文参考MOOC哈工大操作系统课程与课件 主要基于Linux 0.11系统展开 ”Author&#xff1a;Mayiming“ 实践部分依赖虚拟环境展开&#xff0c;请访问网址 https://www.lanqiao.cn/courses/115 本文就试验一、二、三进行梳理 一、熟悉试验环境 试验环境使用了oslab、bochs、gcc…

使用图片制作3D背景

1.创建一个新的摄像机&#xff0c;命名为BackgroundCamera。 2.新建GUITexture&#xff0c;命名为BackgroundImage。 3.在BackgroundImage的Inspector面板中点击Layer下拉窗口&#xff0c;选择“AddLayer”。 4.在打开的面板中的UserLayer8&#xff0c;添加一个新的层名称为…

dubbo原理

目录 dubbo原理 1、RPC原理 2、netty通信原理 3、dubbo原理 1、dubbo原理 -框架设计 2、dubbo原理 -启动解析、加载配置信息 3、dubbo原理 -服务暴露 4、dubbo原理 -服务引用 5、dubbo原理 -服务调用 dubbo原理 1、RPC原理 一次完整的RPC调用流程&#xff08;同步调…

软件测试培训之写给要学习自动化测试的同学的建议

基于我的经验&#xff0c;给你6条实用建议 1、先学习编程语言&#xff0c;然后再接触自动化工具。 语言选择上Java或者Python都是可以的&#xff0c;可以先从Python入手&#xff0c;之后再开始Java。在学习语言的过程中&#xff0c;一定要忘掉你是做测试的&#xff0c;把自己…

leetcode 698. 划分为k个相等的子集-状态压缩+记忆搜索的一步步实现

题目 给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a; 有可能将其分成 4 个子集&#xff08;5&…

利用OpenCV的函数LUT()对矩阵的数据进行查表映射

利用OpenCV的函数LUT()对矩阵的数据进行查表映射 LUT是Look Up Table 的缩写&#xff0c;意为查表映射。 OpenCV的函数LUT()能实现图像灰度值或者说矩阵元素值的查表映射功能。 函数LUT()的C原型如下&#xff1a; void cv::LUT(InputArray src,InputArray lut,OutputArray …

XStream常用注解学习

XStream中文教程&#xff1a;https://www.wenjiangs.com/doc/iyx6stww 参考博客&#xff1a;https://www.jb51.net/article/201309.htm 用在xml中&#xff0c;常用注解&#xff1a; XStreamAliasType(value“要修改成的全限定名”): 包名修改 XStreamAlias(“user”) : 修改类,…

力扣hot100——第5天:22括号生成、23合并K个升序链表、31下一个排列

文章目录1.22括号生成1.1.题目1.2.题解2.23合并K个升序链表2.1.题目2.2.解答3.31下一个排列3.1.题目3.2.解答1.22括号生成 参考&#xff1a;力扣题目链接&#xff1b;题解1&#xff0c;题解2 1.1.题目 1.2.题解 这道题目是使用递归的方法来求解&#xff0c;因为要求解所有的…

这个macOS神器,让爱怀旧的人直呼:“爷青回!”

写在前面 Hello&#xff0c;大家好&#xff0c;我们又见面了。 停止更新了两周多&#xff0c;本来打算荒废这个CSDN的&#xff0c;但对写文章的热爱又逼着我继续写…… 这次我们要推荐一个macOS神器&#xff0c;叫“Aqua Menu Bar”。 以后永远不写水文了&#xff0c;告别CS…

AJAX异步请求解决跨域问题的三种方式

一 什么是跨域 出于浏览器的同源策略限制。同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的…

移动应用测试场景的五个重点

移动应用程序测试在移动开发生命周期中至关重要。开发人员和应用程序测试人员在上线之前应该考虑不同的移动应用程序测试场景。考虑到每天发布的应用程序数量&#xff0c;这一点尤为重要。根据 Statista 的数据&#xff0c;2020 年全球移动应用下载量已增至 2180 亿次。这导致了…

通过.sh文件快捷部署jar包到服务器上

参考博客&#xff1a;https://blog.csdn.net/qq_43382350/article/details/125008727 直接写一个脚本文件&#xff0c;每次运行这个文件就可以通过.sh文件快捷部署jar包到服务器上。 在合适的文件夹下创建脚本文件 vim start.sh 内容如下(三个jar包分别放置在a1、a2、a3文件夹…

SAR雷达系统反设计及典型目标建模与仿真实现研究——目标生成与检测(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

白话强化学习(理论+代码)

文章目录前言强化学习概述案例alphaGo无人驾驶why强化学习特点基本理论部分基本概念马尔可夫模型马尔可夫链案例马尔科夫决策过程累计回报概念及其求取流程案例算法目的Q-Leaning真实值与预测值案例离线学习Sarsa选择动作函数代码DQN流程预估“表”与实际“表”编码坑点环境修改…

你的业务代码中Spring声明式事务处理正确了吗?

Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API(JPA) 等事务 API&#xff0c;实现了一致的编程模型&#xff0c;而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式&#xff0c;配合 Spring Boot 的自动配置&#xff0c;大多数 S…

试剂的制备丨艾美捷逆转录病毒定量试剂盒方案

QuickTiter逆转录病毒定量试剂盒提供了一种测定逆转录病毒滴度的快速方法。该测定法测量逆转录病毒的病毒核酸含量&#xff0c;可以在纯化病毒之前或之后进行。 Cell Biolabs艾美捷QuickTiter™ 逆转录病毒定量试剂盒不涉及细胞感染&#xff1b;相反&#xff0c;它专门测量纯化…

Linux | 可重入函数 | volatile | SIGCHLD信号

文章目录可重入函数volatilevolatile和const同时修饰变量SIGCHLD信号可重入函数 当一个函数可以被两个流调用&#xff0c;我们称该函数具有重入特征 如果一个函数被重入后可能导致内存泄漏的问题&#xff0c;我们称该函数为不可重入函数&#xff0c;反之&#xff0c;一个函数…

BER转Q

BER转Q Q(2^0.5)*erfcinv(2*BER) Q_dB20*log10(Q) 1、为什么要这样转&#xff1a; 暂时我也不知道&#xff0c;知道了再来补 2、关于erfcinv&#xff1a; yerf(x) 误差函数 yerfc(x) 互补误差函数 yerfinv(x) 逆误差函数(误差函数的反函数) yerfcinv(x) 逆互补误差函数(互补误差…