Android Gradle构建流程

gradle打包流程(一)--- 整体把控 前言: Android构建系统编译应用资源和源代码,然后将它们打包成可测试、部署、签署和分发的APK或Android App Bundle。 我们使用Android Studio开发的时候,使用gradle构建工具包来自动执行和管理构建流程,同时也可以 灵活地自定义构建配置。 Gradle和Android插件是独立于Android Studio运行的,所以我们除了可以在Android Studio上构建Android应用外,还可以通过命令行构建Android应用。 构建流程图: 编译 阅读详情

概述

对于刚接触java语言的人来说,程序的入口那就是main()函数了,这也是大家都懂的,但对于gradle而言,我们却不知道他是从何开始执行的,因为我们没有发现他的main()函数在哪里,这里有一点需要明白,groovy是脚本语言,我们在groovy中编写一段代码,不需要写类,他就可以直接运行起来,其实,groovy在编译的时候也是会先将我们所写的代码块编译成java的类,然后在运行起来的,实际上gradle是会将我们的代码编译成class文件然后在main()函数中运行起来,只不过这个过程全部封装了起来,我们没看到而已。

Gradle 项目结构

gradle是用来构建项目的,可以用来组织android各个module的,要想对gradle有一个比较清晰的了解,得先熟悉gradle中的几个对象:

  • 1、Gradle对象;

  • 2、Settings对象;

  • 3、Project对象;

一个工程只有一个gradle对象,一个settings.gradle对应一个Settings对象,多个Project对象,每次修改了.gradle文件时,都会有Sync Now这样的字样要求我们同步工程,点击后其实gradle就会先创建出一个Gradle对象,这个对象会先去读取settings.gradle文件,构建Settings对象,在有了Settings对象后,根据里面的内容就可以构建出Project对象,Project对象的构建个数与Settings中配置个数有关。

说了这么多之后,可能会有有些迷糊,下面我们就在实际的工程中来看下它的执行流程,毕竟代码才能让我们更直观的了解,首先来看下工程的一个目录结构:

在这里插入图片描述

Gradle 构建生命周期

Gradle build的生命周期主要分为三大部分:初始化阶段,配置阶段和执行阶段,可参考官方文档:Gradle Build Lifecycle

初始化阶段(Initialization)

Gradle支持单工程或者多工程构建,初始化阶段的任务是确定有多少工程需要构建,创建整个项目的层次结构,并且为每一个项目创建一个Project实例对象。

如果是多工程构建,一般都会在根工程目录下声明一个settings.gradle脚本,在脚本中include所有需要参与构建的子工程,通过解析settings.gradle脚本,读取include信息,确定有多少个Project需要构建。

配置阶段(Configuration)

配置阶段的主要任务是生成整个构建过程的有向无环图

确定了所有需要参与构建的工程后,通过读取解析各个工程对应的build.gradle脚本,构造Task任务,并根据Task的依赖关系,生成一个基于Task的有向无环图TaskExecutionGraph

执行阶段(Execution)

通过读取配置阶段生成有向无环图TaskExecutionGraph,按顺序依此执行各个Task,像流水线一样,一步一步构建整个工程,这也是构建过程中最耗时的阶段。

以下图片来自网络,可以看到,整个 Gradle 生命周期的流程包含如下部分。
在这里插入图片描述

构建代码

这里主要看的就是这些.gradle文件,首先来看settings.gradle这个文件,在这个文件里添加了一些代码,主要是用来监听gradle执行到哪了:

include ':app', ':netlib'
gradle.addBuildListener(new BuildListener() {
    //Called when the build is started
    //看文档注释说这里一开始构建就会执行,但就是没看见的打印的log
    @Override
    void buildStarted(Gradle gradle) {
        println "gradle start ======================================== "
    }
    //Called when the build settings have been loaded and evaluated. The settings object
    // is fully configured and is ready to use to load the build projects
    //Settings对象加载和评估完成后执行这里,执行完这里即将开始构建Project对象
    @Override
    void settingsEvaluated(Settings settings) {
        println "setting evaluated = "+settings.rootProject.children
    }
 
    //Called when the projects for the build have been created from the settings.
    // None of the projects have been evaluated
    //当所有的Project对象构建完后会执行到这里,执行到这里时,Project还没有评估
    @Override
    void projectsLoaded(Gradle gradle) {
        gradle.allprojects { project ->
            println "project name = "+project.name
        }
        println "projects load"
    }
    //Called when all projects for the build have been evaluated. The project objects
    // are fully configured and are ready to use to populate the task graph
    //在所有的Project对象构建完并且已经评估后会执行到这里,之后就开始执行Project中的任务了
    @Override
    void projectsEvaluated(Gradle gradle) {
        println "projects valuated"
    }
    //Called when the build is completed. All selected tasks have been executed.
    //所有的Project(包括任务)构建完后执行这里
    @Override
    void buildFinished(BuildResult result) {
        println "build result = "+result
    }
})
gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
    //This method is called immediately before a project is evaluated.
    //Project开始评估执行这里
    @Override
    void beforeEvaluate(Project project) {
        println "before evaluated = "+project.name
    }
    // This method is called when a project has been evaluated, and before
    // the evaluated project is made available to other projects.
    // Project评估完执行这里,评估成功后就开始评估下一个Project
    @Override
    void afterEvaluate(Project project, ProjectState state) {
        println "after valuated = "+project.name
    }
})

看了settings.gradle后,接下来就来看下rootProject的build.gradle的配置,就是和settings.gradle在同一目录下的那个:

buildscript {
    //这里的配置主要是为了构建gradle
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'
 
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
 
allprojects {
    //这里是为每一个project提供相同的配置
    println "common config project name = "+project.name
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}

总结

这里在总结下gradle的大体流程:

1、开始build的时,会创建一个Gradle对象,这个对象是唯一的,全局共享;

2、Gradle对象创建完后,接下来就是去怎么组合整个工程了,为了知道需要组合那些project,这时就需要去读取settings.gradle文件了,这时就会创建一个Settings对象,这个对象中就会包含组合工程所需的各个project,以及各个project的地址(其实就是在那个文件夹下),这个地址我们是可以修改的,具体怎么修改,下一遍再说;

3、在读取settings.gradle文件的同时,也是会创建相应的project,只不过这个project没有被评估(我的理解就是没被初始化),剩下的就是对每个project进行评估,最后在对整个工程进行评估,在这些都做完之后,接下来就是执行每个project的task了,等到所有任务都执行完了,整个工程也就build完了,也就可以运行起来了。
————————————————
版权声明:本文为优快云博主「tangedegushi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/tangedegushi/article/details/82800228

【Android笔记】Android APK编译打包流程 本文将介绍Android从一个项目打包成APK的过程,其中涉及AndroidJava和Kotlin文件、资源文件、清单文件、依赖jar包和so库等在打包过程中处理。 阅读详情

相关推荐

Android Gradle构建流程浅析

概述 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。它通过组织执行一系列的Task来完成自动化的构建,减少构建项目时的复杂度,而Android Studio也使用Gradle作为基础的构建工具。 Gradle 项目结构分析 在了解Gradle build的生命周期之前,先简单说一下Gradle

善良可爱小盒子 803

Android之Gradle自动化打包实战

解放双手,双击桌面快捷方式生成apk包,基于Gradle、bat文件让开发人员告别打包烦扰!前不久有一个Unity3D研发的小仙女在羽毛球场问我关于Android Studio打apk的一些事情,她说他们运营和测试隔三差五的就坐着她旁边要她重复性的打包(估计是那群痴汉打着工作的幌子实际上干着撩妹的活惹火了这位认真敬业的小姐姐),那么有没有省力一点的办法快速打包?一直以来,对于某些频繁进行打包工作的业务部开发人员来说,打包工作不仅繁琐冗余而且费时费力。

金戈鐡馬 3870

Android Gradle 打包全攻略:从懵到有谱

《安卓APK构建指南》用工厂组装汽车的比喻,生动讲解了从Gradle工程生成签名APK的全流程。关键步骤包括:正确解压合并工程目录、配置签名文件绝对路径、设置SDK路径、匹配Gradle 5.6.4版本、生成wrapper脚本后执行构建。特别提醒注意签名路径必须用绝对路径、SDK要用官方版本、Gradle版本需严格匹配。流程遵循"归档合并-路径配置-版本匹配-生成wrapper-执行构建"的顺序,最终APK输出在build/outputs/apk目录下。口诀总结要点:路径要对、工具要正、

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 275

Gradle入门(二)尝试理解gralde编译项目

grade 就是一种构建脚本,它将一系列的检查、编译流程和打包流程串联在一起了,我们只需要点一下运行,要不编译运行成功,要不就直接失败。

luoye的搬砖生活 2279

自定义 Android Gradle 插件:简化构建流程的利器

首先,我们需要创建一个自定义 Gradle 插件的项目。打开 Android Studio,并创建一个新的 Java 项目。在项目的根目录下创建一个新的 module,命名为。在module 的文件中添加以下代码:jcenter()在module 的src/main目录下创建一个新的目录,命名为groovy。在groovy目录下创建一个新的 Java 类,作为我们自定义插件的入口点。例如,命名为。在类中实现自定义插件的逻辑。以下是一个简单示例:doLast {在module 的。

CodeShiftZ的博客 196

基于STM32的简易电压、频率、占空比测量仪

任务详解:我们需要实现三个功能: 第一个是测频率的功能,输入信号为频率为1kHz~10kHz的三种波形(方波、三角波、正弦波),这也是我们最常见的三种波形。幅度是不需要测量的,所以先不关心幅度。 第二个是电压报警功能,当输入信号的幅度超过15V时,我们需要报警(这里我用了一个红色LED当报警器,有条件的还可以加个蜂鸣器)并且把此时的信号幅度显示在OLED屏幕上。 第三个是通信方式的要求,需要有串口通信功能。 第四个是计算占空比的任务,这个任务的输入是幅度为1V~10V、频率为20Hz ~1kHz的方波,需要

weixin_43469377的博客 7251

Gradle构建流程-Android

这是Task真正被执行阶段,Gradle会根据依赖关系决定task执行流程,Task是Gradle项目构建的最小单元,Gradle将一个个Task串联起来完成具体的构建任务,每个Task都属于一个Project。由于多项目配置中,可能存在大量无需配置的项目,如果需要配置所有项目后才执行任务则会浪费大量的时间。按需配置项目时,Gradle只配置与最终任务相关联的项目,以缩短构建时间。,一个项目的配置可能会依赖其他项目,所以在执行任务之前,需要配置所有的项目。来启用或者关闭按需配置,默认是关闭的。

2401_89191535的博客 936

【Ambari-Metrics监控】Grafana+Infinity快速构建DEMO-实战教学

摘要:本文介绍了如何通过Infinity插件在Grafana中监控Ambari-Metrics(AMS)的CPU核数指标。内容包括配置AMS REST API数据源、创建Dashboard面板、设置JSON解析规则,将时间戳和数值映射为时序数据。最终实现单个节点CPU核数曲线的可视化展示,该方法可扩展至其他AMS指标监控。文章提供了完整的配置示例和API调用验证方法,适用于Grafana 9.x及以上版本对接Ambari集群监控场景。

TTBIGDATA的博客 1351

安卓页面设计规范,Gradle构建流程-Android,从零开始学Android编程

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。一起互勉~本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录。

2301_82257317的博客 1020

W5500+STM32F103C8T6进行TCP通信(modbus)

一路生花一、w5500资料二、modbus通信三、从机代码四、总结五、参考 一、w5500资料 w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程 https://www.aliyundrive.com/s/enPnnZgNtpE 二、modbus通信 Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议 这里是Modbus TCP数据帧 公共功能码定义 三、从机代码

junseven164的博客 5777

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

android之Gradle构建项目流程

对于android开发,java语言那肯定都是很熟悉了,但对于android项目的构建应该就不是那么的了解了,android项目的构建是通过gradle,而gradle所使用的语言确实groovy,这对于很多人来说可能就不是那么的了解,groovy是基于java语言,并且也是支持java语言的,所以我们在gradle中使用java语言也是可以编译通过的。 对于刚接触java语言的人来说,程序的入...

tangedegushi的博客 3308

2026年大数据开发工程师常见面试选择题

大数据面试高频考点解析 摘要:本文汇总了30道大数据开发面试高频题目,涵盖Hadoop生态、Spark、Flink、Kafka等核心组件。重点包括:1)HDFS架构与特性(5V特征、副本机制);2)MapReduce/Spark原理(Shuffle过程、RDD抽象);3)实时计算(Kafka消费组、Flink Watermark);4)数据仓库设计(分层模型、性能优化)。特别强调数据倾斜、小文件问题等实战场景的解决方案,以及从日志、资源等多维度排查任务异常的方法。掌握这些基础原理和典型问题应对策略,是应对大

不务正业的猿 450

Android APK 的构建流程以及Gradle多版本构建

APK 构建流程,Gradle多渠道构建apk

爱吃烧鸡大肘子的肉肉酱的博客 2271

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

微学AI的博客 1万+

Agentic AI为教育行业赋能,提示工程架构师解析应用潜力

然而,即便是最先进的 LLMs,在面对复杂、动态、需要持续规划和调整的教育场景时,也常常显得力不从心,它们更像是强大的“问答机器”,而非真正意义上的“学习伙伴”或“教学助手”。在教育场景中,传统的 AI 工具可能只能回答学生提出的特定问题,或者根据预设的规则推送一些学习材料。无论您是教育技术领域的开发者、产品经理,还是一线的教育工作者、教育管理者,抑或是对 AI 教育应用充满好奇的研究者,本文都将为您提供宝贵的 insights,助您把握 Agentic AI 时代教育创新的脉搏。

架构师的AI之路,分享AI应用开发架构的学习与实践。 466

【Android Gradle】安卓应用构建流程 ( 资源文件编译 )

一、资源文件编译、 二、AndroidManifest.xml 清单文件编译、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1362

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4023

【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )

一、安卓应用构建简介、 二、Java 源码编译、 三、AIDL 源码编译、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2199

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Android Gradle 插件】Gradle 构建工具简介 ② ( Android 项目构建打包流程 | 构建工具发展 -> 手动配置 -> Ant -> Maven -> Gradle )

一、Android 项目构建打包流程、 二、构建工具发展 ( 手动配置 -> Ant -> Maven -> Gradle )

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1297

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

AI如何优化Android Gradle构建流程

错误时,直接问AI"为什么找不到com.example.lib:1.0",它会检查仓库配置、网络状态,甚至提示该库是否已迁移到MavenCentral。总结下来,AI不是简单替代开发者,而是把Gradle官方文档、Stack Overflow经验和性能工具的数据结合起来,给出可落地的具体建议。对于需要持续运行的构建监控场景,一键部署功能让优化效果长期可见——我的性能看板网页自动更新每次构建的指标,这对团队协作特别有帮助。通过分析历史构建日志,AI发现我的项目频繁清理缓存导致重复编译。)和配置缓存目录路径。

MoonbeamRaven28的博客 884

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

给私有代码库一份完整文档:DeepWiki 本地部署实操

DeepWiki-Open 是一个开源项目,能对 GitHub、GitLab、Bitbucket 仓库自动生成可交互的 wiki。它支持接入 Ollama,代码分析和文档生成全部跑在你自己机器上,不花云 API 的钱,代码也不出你的机器。 ## 跑起来之后它替你做三件事 接手一个新仓库最烦的就是没有文档,这套系统上线后直接替你补齐: - 输入一个仓库地址,输出一份可导航的 wiki,章节自带

gitblog_00807的博客 184

【Android Gradle 插件】Android Studio 工程 Gradle 构建流程 ① ( 触发 Android Studio 工程构建 | Gradle 构建脚本执行顺序 )

最近将 Android Studio 更新到了版本 , 发现创建的 Android 工程中生成的 Gradle 脚本不一样了 , 在这里梳理下新版本的 Gradle 执行流程;

浪漫之圣 599

探索 Gradle4Android:优化你的 Android 构建流程

探索 Gradle4Android:优化你的 Android 构建流程 项目简介 是一个由开发者 WuXiaolong 创建的开源项目,旨在为 Android 开发者提供一套优化的 Gradle 构建配置和最佳实践。此项目的目标是帮助开发者提高构建速度,减少应用体积,并简化项目的维护工作。 技术分析 构建速度优化: 使用了缓存机制,避免重复下载依赖。 针对多模块项目进行并行编译,提高构建效率...

gitblog_00071的博客 324
上一篇: 1.数据类型
下一篇: Git配置文件config用户名和邮箱的设置和查看
黄毛火烧雪下
黄毛火烧雪下 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 7714粉丝 439原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值