Android Gradle 构建环境

2024-06-21 15:32
文章标签 android 构建 环境 gradle

本文主要是介绍Android Gradle 构建环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:

Chapter 12. The Build Environment:https://docs.gradle.org/current/userguide/build_environment.html


百度百科:gradle

GradleAndroid Studio 默认的项目自动化构建工具。当工程越来越大时,需要编译的时间也越来越长,对其进行进一步的设置能够帮助加速编译


主要内容

  1. gradle.properties 浅析
  2. build_environment.html 浅析
  3. 通过代理(proxy)访问 web
  4. 什么是解耦工程(decoupled project
  5. 小小总结
  6. 链接

gradle.properties 浅析

gradle.properties 位于工程目录下,是项目级别的 Gradle 设置(Project-wide Gradle settings

# Project-wide Gradle settings.# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

它主要讲了 4 点内容

  • 对于 Android Studio 用户而言,通过 IDE 设置的 Gradle 配置将会重载这里的配置,即 IDE 配置级别高于 gradle.properties 文件配置
  • 更多的关于如何配置构建环境(build environment),参考网址 http://www.gradle.org/docs/current/userguide/build_environment.html
  • 指定用于守护进程(daemon process)的 JVM 参数,该设置特别有助于调整内存设定,然后在下面列出一个设置:

    `org.gradle.jvmargs=-Xmx1536m`
    
  • 如果配置下面选项,Gradle 将以平行模式(incubating parallel mode)运行:

    org.gradle.parallel=true
    

    并特别说明此选项仅适用于解耦工程(decoupled projects),参数网址 http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects


build_environment.html 浅析

在上一小节中,关于构建环境给出了参考网址 build_environment.html,下面就进入该网址看看有哪些可以帮助进行配置

参考:Gradle User Guide

该网址是 Gradle 用户指南(Gradle User Guide)第 12 章 - The Build Environment

主要内容有 3 点:

  • 通过 gradle.properties 配置构建环境
  • Gradle 属性和系统属性
  • 通过代理(proxy)访问 web

通过 gradle.properties 配置构建环境

参考:Environment variables

Gradle 配置可通过 gradle.properties 文件进行,将该文件版本化有助于整个开发组在同一个开发环境下工作

可在多个环境下配置 gradle.properties 文件(就是说在多个位置下放置 gradle.properties 文件均有效),其按如下顺序执行(当某个 Gradle 选项被多个位置的 gradle.properties 文件设置时,按下面顺序的最后一个生效):

  • 来自于项目目录下的 gradle.properties 文件(in project build dir
  • 来自于 gradle user home 目录下的 gradle properties 文件(in gradle user home
  • 来自于系统属性。比如,when -Dsome.property is set on the command line

Note:GRADLE_USER_HOME 默认指 USER_HOME/.gradle,我在 Windows 环境下就是 C:\Users\zj\.gradle

下面介绍几个自认为有用的属性:

  1. org.gradle.daemon:当设为 true 时, Gradle 守护进程被用于运行构建项目。对于 local developer builds 而言这是最好的属性(看起来文档推荐使用这个
  2. org.gradle.java.home:指定 Java 路径。可以设为 jdk 路径或者 jre 路径,不过使用 jdk 路径更安全。未进行设定时会使用默认设置
  3. org.gradle.jvmargs:指定用于守护进程的 jvmargs 参数,该参数对于调整内存设置特别有用。如果内存足够大的话,可以多分配一些内存用于构建,上一小节中 gradle.properties 默认设为:

    `org.gradle.jvmargs=-Xmx1536m`
    

    还可设置为:

    org.gradle.jvmargs=-Xmx2048m
    

    我将其设置为:

    org.gradle.jvmargs=-Xmx4096m
    
  4. org.gradle.configureondemand:在多项目工程中能够加速编译

    Enables new incubating mode that makes Gradle selective when configuring projects.
    Only relevant projects are configured which results in faster builds for large multi-projects
    
  5. org.gradle.parallel:配置此选项,Gradle 将以并行模式运行(in incubating parallel mode)。看起来运行时间会更短,不过 gradle.properties 文件中指明该选项仅适用于解耦工程(decoupled projects

Forked Java processes

本小节简单讲解了一下推荐使用 Gradle 守护进程的原因,就是上面讲到的许多设置(比如 Java 版本,最大的堆大小)仅当一个新的 JVM 被启动时才被指定,这意味着当存在不同的 gradle.properties 文件(这里不清楚是说上面提到的不同的地方的 gradle.properties 文件还是不同工程的 gradle.properties文件),必须启动一个新的 JVM 进程,而如果运行在守护进程中,JVM 仅需启动一次即可(这里用到了 with correct parameters,不理解什么是 correct paramters),详细原因可参考 Chapter 7. The Gradle Daemon

Gradle 属性和系统属性

文中提到 Gradle 提供了多种方法来为工程构建增加属性,比如-D / -P 命令行选项等等

个人感觉比较有用的一项是通过属性文件(properties file)来增加属性。就是将 gradle.properties 文件放置在 Gradle user home 目录下(defined by the “GRADLE_USER_HOME” environment variable, which if not set defaults to USER_HOME/.gradle),或者你的项目目录下。其中,对于多项目工程,可将其放置在所有子项目目录下。并且上一小节提到了,在 Gradle user home 目录下的 gradle.properties 文件的优先级高于项目目录下。


通过代理(proxy)访问 web

可以通过 gradle.properties 文件配置 HTTP 或者 HTTPs 代理,此文件可放置在项目目录下或者 Gradle home 目录下

它给了两个示例:

  • HTTP 代理:

    systemProp.http.proxyHost=www.somehost.org
    systemProp.http.proxyPort=8080
    systemProp.http.proxyUser=userid
    systemProp.http.proxyPassword=password
    systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost
    
  • HTTPs 代理:

    systemProp.https.proxyHost=www.somehost.org
    systemProp.https.proxyPort=8080
    systemProp.https.proxyUser=userid
    systemProp.https.proxyPassword=password
    systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost
    

其实还是没太理解为什么要设置代理,在网上也找了一些文章,大概就说 Gradle 每次构建都要联网(外网),设置代理能够防止出现 Gradle Sync Failed 现象,但是我好像没有这个问题(当然已经连了外网了,只是没设代理)

另外,同样可以在 IDE 上进行设置,点击菜单栏 File -> Settings -> Appearance & Behavior -> System Settings > HTTP Proxy

Note:在一个组内共同开发时,有时别人设置了代理,可能会导致项目无法编译,可以注释掉试一下


什么是解耦工程(decoupled project

参考:

decoupled_projects

优化gradle编译速度实践

Two projects are said to be decoupled if they do not directly access each other's project model. 
Decoupled projects may only interact in terms of declared dependencies:project dependencies (Section 25.4.3, “Project dependencies”) and/or task dependencies (Section 16.5, “Task dependencies”)

解耦应该是指两个工程之间至多仅存在项目依赖或者 task 依赖


小小总结

按照上面的说法,现在进行一个小小的总结,可以在 Gralde home 目录下放置一个 gradle.properties 文件,修改如下:

# Project-wide Gradle settings.# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# org.gradle.jvmargs=-Xmx1536m# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4096m
org.gradle.configureondemand=true
org.gradle.parallel=true

链接

看到一篇不错的博文,收藏一下:

Android Studio Gradle优化方法(一般人我不告诉他)

这篇关于Android Gradle 构建环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081603

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结