安卓中gradle的设置

在Android Studio中设置从本地Gradle目录加载,而不是从网络下载

要在Android Studio中设置从本地Gradle目录加载,而不是从网络下载,你可以按照以下步骤进行操作:
找到你的Gradle安装目录:
假设你已经下载并安装了Gradle 8.6。确保你知道Gradle的安装路径。例如,假设路径是 D:\gradle-8.6。
修改gradle-wrapper.properties文件:
打开你的项目,切换到Project视图,找到 gradle/wrapper/gradle-wrapper.properties 文件。
修改 distributionUrl 这一行的内容,指向你本地安装的Gradle版本,而不是网络上的URL。例如:
distributionUrl=file:///D:/gradle-8.6-all.zip
注意,这里使用了 file:/// 协议前缀来引用本地文件路径。需要确保路径是正确的,并且路径中的斜杠方向在URL中是正确的。
配置Gradle的用户主目录(可选):
如果你希望进一步确保Android Studio从特定的本地目录加载Gradle,你可以在Android Studio的设置中指定Gradle的用户主目录。你可以这样做:
打开Android Studio,进入 File > Settings > Build, Execution, Deployment > Gradle。
在“Gradle user home”字段中,输入你的Gradle安装目录,或者其他你希望保存Gradle版本的地方。
同步项目:
修改完毕后,点击右上角的“Sync Now”按钮,或者从菜单中选择 File > Sync Project with Gradle Files,以让Android Studio使用新的设置。
通过这些步骤,你可以确保Android Studio从你指定的本地路径加载Gradle,而不是从网络下载。请注意,确保你本地安装的Gradle版本与项目兼容,且gradle-wrapper.properties文件中的路径是准确的。

在gradle-wrapper.properties文件中,zipStoreBase和zipStorePath是用来配置Gradle Wrapper下载的Gradle发行版压缩文件存储位置的两个属性。以下是它们的具体作用:

zipStoreBase:
这个属性指定了存储Gradle压缩包(即下载的.zip文件)的基础目录。GRADLE_USER_HOME是一个环境变量,通常指向用户的Gradle配置目录(例如,在Windows上可能是C:\Users\用户名.gradle)。
如果设为GRADLE_USER_HOME,压缩包会存储在用户的Gradle主目录下,而不是项目目录中。
zipStorePath:
这个属性定义了相对于zipStoreBase指定的目录的子路径,用于进一步指定压缩包的存储位置。
wrapper/dists表示在GRADLE_USER_HOME目录下的wrapper/dists子目录中存储压缩包。

结合这两个属性,Gradle Wrapper会在用户主目录的.gradle/wrapper/dists路径下存储下载的Gradle发行版压缩文件。这样做的好处包括:

统一存储:所有的Gradle版本压缩包被集中存储在一个地方,有助于管理和复用。
减少重复下载:一旦下载,压缩包会在本地缓存,避免了每次构建都需要从互联网下载相同的Gradle版本。
项目独立:即使你有多个项目,它们可以共享相同的Gradle版本,因为压缩包存储在用户主目录下,而不是每个项目目录。

这项配置确保了在项目构建时,Gradle Wrapper会从这个指定的路径加载或下载Gradle的压缩包,而不是依赖于系统安装的Gradle版本,从而保证在不同环境中的构建的一致性。

GRADLE_USER_HOME和GRADLE_HOME区别

GRADLE_USER_HOME 和 GRADLE_HOME 是两个不同的环境变量,它们在Gradle的使用和配置中有不同的作用:
GRADLE_USER_HOME
定义:GRADLE_USER_HOME是用户级别的Gradle配置目录,默认值通常是用户的主目录下的.gradle文件夹(例如,~/.gradle在Unix-like系统上,或C:\Users\用户名.gradle在Windows上)。
用途:
用于存储用户特定的Gradle配置文件(如gradle.properties、init.d目录中的初始化脚本等)。
Gradle的缓存(包括下载的依赖、插件、Gradle Wrapper下载的Gradle发行版等)会存放在这里。
可以包含用户自定义的Gradle设置和全局配置。
配置示例:
要更改此路径,你可以设置GRADLE_USER_HOME环境变量。例如,在Unix-like系统上,可以在.bashrc或类似文件中添加:

bash
export GRADLE_USER_HOME=/path/to/custom/gradle/home

GRADLE_HOME
定义:GRADLE_HOME是指Gradle的安装目录,即你安装Gradle的位置,而不是用户配置的文件夹。
用途:
传统上用于系统级别的Gradle安装路径,便于在命令行或脚本中引用Gradle的可执行文件和其他资源。
在现代的Gradle使用中,GRADLE_HOME的使用已经不那么常见,因为Gradle Wrapper和独立的Gradle安装降低了对这个变量的依赖。
配置示例:
在Unix-like系统上,可以通过以下方式设置:

bash
export GRADLE_HOME=/path/to/gradle

然后,如果需要,你可以将$GRADLE_HOME/bin添加到PATH环境变量中以便直接使用gradle命令。

区别总结
GRADLE_USER_HOME 主要与用户的Gradle配置、缓存和数据相关,影响的是Gradle的运行时环境和用户级别的设置。
GRADLE_HOME 则与Gradle的安装位置相关,过去用于系统安装的Gradle版本的引用,但现在在很多情况下可以不设置,因为Gradle Wrapper会自动处理Gradle的版本管理。

在现代的Gradle使用中,GRADLE_USER_HOME更为重要,因为它影响到每个用户的Gradle行为和配置,而GRADLE_HOME对于大多数使用场景来说已经不再是必需的。

.gradle\wrapper\dists\gradle-8.7-all下面有很多随机字符组成的文件夹,为什么每次都是一个版本,却放到不同文件中,这不是重复下载码

在.gradle\wrapper\dists\gradle-8.7-all目录下看到多个随机字符组成的文件夹(例如,gradle-8.7-all\7ykxq50lst7lb7wx1nijpicxn),这是因为Gradle Wrapper的设计方式导致的。这些文件夹的命名基于下载的Gradle发行版压缩文件的MD5校验和的base36编码。以下是这种设计的几个原因和特点:

原因和特点:
缓存和版本管理:
Gradle Wrapper会下载指定版本的Gradle压缩包,并将其缓存到用户的.gradle目录下。这个文件夹名(如7ykxq50lst7lb7wx1nijpicxn)是根据gradle-wrapper.properties中指定的distributionUrl的MD5散列生成的,这样可以保证不同项目使用相同版本的Gradle但可能从不同的URL下载时,文件不会混淆。
防止文件覆盖和冲突:
即使是相同的Gradle版本,如果下载源的URL有一点点改变(例如,镜像服务器的URL不同),MD5散列也会改变,从而产生不同的文件夹名。这确保了不同下载源的同一版本不会相互覆盖,同时也兼容了可能的校验和验证机制。
安全性考虑:
使用散列生成的文件夹名可以增加安全性,避免恶意软件通过简单的URL猜测攻击系统。
避免重复下载:
虽然看起来像是重复下载,但实际上每个文件夹代表的是从特定URL下载的一次操作。Gradle会检查这些文件夹的内容(包括校验和)来确定是否需要重新下载,还是可以直接使用已有的缓存。

解决重复下载的问题:
缓存校验和:如果你注意到有多个文件夹代表同一个版本,可以检查这些文件夹下的内容(特别是gradle-wrapper.properties中的distributionUrl),确保没有重复下载。如果确实有重复,可以手动删除多余的文件夹,只要确保保留的是你项目需要的那个版本。
配置gradle-wrapper.properties:确保每个项目使用的distributionUrl一致,避免因为URL不同而导致的重复下载。
清理缓存:Gradle有一个自动清理机制,但你也可以手动清理.gradle目录下的旧缓存,特别是当你确认某些版本或URL不再使用。

虽然这种设计可能会让人觉得是重复下载,但它实际上是在管理不同来源、不同下载时间的同一个Gradle版本的缓存。通过这种方式,Gradle确保了构建的一致性和安全性。

gradle-8.6\init.d\init.gradle

在Gradle中,init.d目录(通常位于GRADLE_USER_HOME/init.d或项目的根目录下)用于存放初始化脚本,这些脚本会在Gradle构建开始前执行。init.gradle是其中的一个初始化脚本文件,它允许你全局性地配置Gradle的行为,影响所有使用该初始化脚本的构建。

关于gradle-8.6\init.d\init.gradle
如果你在gradle-8.6目录下看到了init.d\init.gradle,这里有几点需要注意:

位置:
init.d目录应该在GRADLE_USER_HOME中,而不是在Gradle安装目录下。然而,如果你特意在gradle-8.6目录下创建了这个结构,那可能是因为你想为某个特定版本的Gradle设置特定配置。
作用:
这个init.gradle文件会在所有构建开始之前执行。你可以在这里设置全局变量、添加自定义任务、配置插件、或者修改Gradle的行为。
内容示例:
这个文件可以包含任何有效的Gradle脚本代码。例如,你可以在这里定义全局的仓库位置:

gradle
allprojects {
repositories {
mavenCentral()
maven { url 'https://your-custom-repo.com/maven2' }
}
}

或者设置一些全局属性:

gradle
gradle.projectsEvaluated {
allprojects {
ext.myProperty = 'someValue'
}
}

特定版本的配置:
如果你是为了特定版本的Gradle(这里是8.6)配置这个init.gradle,请确保其他使用这个Gradle版本的构建能够访问到这个脚本。
注意事项:
在gradle-8.6目录下设置init.d和init.gradle是非标准的做法。通常,用户级别的初始化脚本应放在GRADLE_USER_HOME/init.d中,这样所有Gradle版本都能访问到。
如果你确实有理由在特定版本的目录下配置初始化脚本,请确保你的构建环境能正确识别并使用这个脚本。
执行顺序:
初始化脚本的执行顺序是基于文件名的字母顺序。如果你有多个初始化脚本,确保它们按你的预期顺序排列。

在使用init.gradle之前,请确保你理解它的全局影响,因为它会影响所有在这个环境下运行的Gradle构建。

GRADLE_USER_HOME/init.d中init.gradle文件

GRADLE_USER_HOME/init.d目录下的init.gradle文件是一个强大的工具,可以用于配置所有Gradle构建的全局行为。这个文件会在所有Gradle构建开始之前执行,因此可以用来设置全局配置、添加自定义任务、管理插件等。

init.gradle文件的用途
全局仓库配置:
可以在这里设置所有项目都能访问的中央或自定义的Maven、Ivy仓库。

gradle
allprojects {
repositories {
mavenCentral()
maven { url 'https://your-custom-repo.com/maven2' }
}
}

全局属性设置:
为所有项目设置全局变量或属性。

gradle
allprojects {
ext {
myGlobalProperty = 'someValue'
}
}

自定义任务:
定义一些在每个构建中都可用的任务。

gradle
allprojects {
task helloWorld {
doLast {
println 'Hello from init script!'
}
}
}

插件管理:
应用或配置在所有项目中使用的插件。

gradle
allprojects {
apply plugin: 'java'
}

修改构建行为:
调整Gradle的默认行为,比如构建监听器、日志级别等。

gradle
gradle.buildFinished {
println "Build finished ${buildResult.failure ? 'with failures' : 'successfully'}"
}

使用注意事项
文件名:init.gradle是常见的命名,但任何.gradle文件在init.d目录下都会被执行。文件名的字母顺序决定了执行顺序。
权限:确保只有你或有权限的用户可以修改这个文件,因为它会影响所有使用这个Gradle用户目录的构建。
版本兼容性:初始化脚本可能会依赖于Gradle的特定版本特性,因此在升级Gradle版本时需要测试这些脚本。
调试:由于这些脚本影响全局构建行为,可能需要一些调试来确保它们按预期工作。可以用--info或--debug参数运行Gradle来获取更多日志信息。

实践中的应用
在GRADLE_USER_HOME/init.d/init.gradle中,你可以放置一些常用的配置,这样无论你启动哪个项目,初始化脚本都会先执行,确保了跨项目的一致性和效率。记住,这个文件的影响是全局的,所以在修改时要特别小心,确保不会无意中影响到不相关的项目。

全局属性设置

设置全局属性在Gradle中可以通过几种方式进行,主要取决于你希望这些属性应用的范围(比如全局对所有项目、对一个特定项目、或在一个特定的构建脚本中)。以下是几种设置全局属性的方法:

  1. 使用GRADLE_USER_HOME/init.d/init.gradle
    这是在整个用户环境中设置全局属性的最有效方式,因为这些脚本会在任何Gradle构建执行之前运行。
gradle
// GRADLE_USER_HOME/init.d/init.gradle
allprojects {
ext {
// 这里设置的属性将对所有项目都有效
globalProperty = 'globalValue'
anotherGlobalProperty = System.getProperty('user.home')
}
}
  1. 在项目级别的build.gradle中
    如果属性只需要对一个特定项目有效,可以在项目的build.gradle中进行设置。这种方式设置的属性对项目及其子项目有效。
gradle
// 在项目根目录的 build.gradle 中
allprojects {
ext {
projectWideProperty = 'projectValue'
}
}
  1. 在gradle.properties文件中
    可以使用gradle.properties文件来设置全局或项目级别的属性。全局的gradle.properties通常位于GRADLE_USER_HOME目录下,而项目级的则位于项目根目录。

全局gradle.properties(GRADLE_USER_HOME):
globalProperty=globalValue
项目级gradle.properties(项目根目录):
projectProperty=projectValue

  1. 通过环境变量设置
    你也可以通过环境变量来设置属性,这些属性在构建时会被Gradle读取。

在Unix-like系统中:

bash
export GRADLE_OPTS="-DmyEnvProperty=myValue"

在Windows中:

set GRADLE_OPTS=-DmyEnvProperty=myValue

使用这些属性
一旦设置了这些属性,你可以在任何Gradle脚本中使用它们:

gradle
println project.ext.globalProperty
println project.ext.projectWideProperty
println System.properties['myEnvProperty']

注意事项
范围:确保你理解属性的作用域。init.gradle中的属性是全局的,而build.gradle中的属性可能只对当前项目有效。
优先级:如果同一个属性的设置在多个地方出现,优先级一般如下:环境变量 > gradle.properties > init.gradle > build.gradle。
动态属性:有时你可能需要基于某些条件动态设置属性,这可以通过在脚本中使用条件语句实现。

通过这些方法,你可以灵活地管理你的Gradle构建中的属性,确保配置的可重用性和一致性。

分析init.grandle中代码

这段代码是在Gradle构建脚本中配置项目和构建脚本的依赖仓库。以下是对这段代码的解析:

项目依赖仓库配置
本地Maven仓库:

gradle
maven { url 'file:///D:\\.m2\\repository' }

这个配置告诉Gradle从指定的本地目录中查找依赖。这个路径必须是绝对路径,且使用file:///协议。
本地Maven仓库(默认):

gradle
mavenLocal()

使用本地Maven仓库(通常是~/.m2/repository),这是在项目构建时寻找依赖的第一站。
阿里云私服:

gradle
maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public/" }

配置阿里云的Maven仓库作为依赖源。注意,这里将URL改为了https以避免潜在的安全警告。
Maven中央仓库:

gradle
mavenCentral()

最后尝试从Maven中央仓库获取依赖。这是最广泛使用的公共Java库仓库。

构建脚本依赖仓库配置
构建脚本的仓库:

gradle
buildscript {
repositories {
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public/" }
maven { name "M2"; url 'https://plugins.gradle.org/m2/' }
}
}

这里为构建脚本本身配置了两个仓库:
阿里云的Maven仓库,用于构建脚本可能需要的依赖或插件。
Gradle插件仓库,用于获取Gradle插件。

注意事项
顺序:仓库的顺序决定了依赖查找的优先级。Gradle会按列出的顺序尝试从仓库中获取依赖。
安全性:使用https而不是http来获取依赖,确保传输过程中的安全性。
本地仓库:配置本地仓库路径时,确保路径正确且可访问。如果路径错误,可能会导致依赖解析失败。
私服和公共仓库:使用私服(如阿里云)可以加速国内访问速度,但需要确保这些私服的稳定性和更新频率。

报错信息
如果使用非HTTPS的仓库URL,Gradle可能会因为安全策略而拒绝连接。你的注释中提到的用HTTP的阿里云仓库配置确实会报错,解决方案是如你所述,将URL协议改为HTTPS。

这个配置使得你的项目在构建时可以从多种来源获取依赖,提高了构建的灵活性和效率。

如果项目gradle/wrapper/gradle-wrapper.properties中有下载网址的代码,init.gradle文件中也配置了下载网址的代码,下载gradle时,先从哪个文件优先下载?

gradle/wrapper/gradle-wrapper.properties中

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://mirrors.aliyun.com/gradle/distributions/v8.4.0/gradle-8.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

init.gradle文件中

maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public/" }

在gradle/wrapper/gradle-wrapper.properties文件中,distributionUrl属性指定了下载Gradle发行版的URL。当你启动一个使用Gradle Wrapper的项目构建时,Gradle会根据这个URL来下载Gradle发行版。以下是关于优先级和下载过程的解释:

优先级和下载过程:
本地缓存检查:
首先,Gradle会检查本地缓存(在GRADLE_USER_HOME/wrapper/dists路径下)是否已经有这个特定的Gradle版本。如果存在且符合distributionUrl的版本和URL,它将直接使用缓存的版本,不进行下载。
URL指定的下载:
如果本地没有找到匹配的缓存文件,或者缓存的版本与distributionUrl中指定的不匹配,Gradle会根据distributionUrl中的URL进行下载。在你的例子中,URL是https://mirrors.aliyun.com/gradle/distributions/v8.4.0/gradle-8.4-all.zip。
没有优先级文件:
这里没有涉及到多个distributionUrl的情况,所以不存在优先级问题。单一的distributionUrl是直接的下载源。

因此,在你提供的配置下,Gradle首先会检查本地缓存是否已经有gradle-8.4-all.zip。如果没有,则会从https://mirrors.aliyun.com/gradle/distributions/v8.4.0/gradle-8.4-all.zip下载这个文件。

需要澄清的是,gradle-wrapper.properties中的配置和init.gradle文件中的配置作用不同:

gradle-wrapper.properties 中的distributionUrl专门用于指定下载Gradle发行版的URL。这不涉及依赖库或插件的下载,而是决定使用哪个版本的Gradle来进行构建。
init.gradle(通常在GRADLE_USER_HOME/init.d目录下)中的配置则主要用于全局设置,比如定义依赖仓库、插件、自定义任务等。这些配置会影响所有在该环境下进行的Gradle构建,但在下载Gradle发行版方面没有直接影响。

下载Gradle发行版:
下载Gradle发行版时,只会使用gradle-wrapper.properties中指定的distributionUrl。因此,init.gradle中的任何仓库配置对这一过程没有影响。
依赖库和插件的下载:
init.gradle中的maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public/" }配置会影响依赖库和插件的下载。当构建过程中需要下载依赖或插件时,Gradle会按照init.gradle中配置的仓库顺序(以及项目中可能的其他仓库配置)去查找这些依赖或插件。但这不会影响到Gradle发行版的下载。

总结:
Gradle不会从另一个文件优先下载Gradle发行版。gradle-wrapper.properties文件中的distributionUrl是唯一指定的下载源。
只有在本地缓存中没有找到匹配的文件时,Gradle才会根据distributionUrl从网络上下载。
如果你之前已经下载过这个版本的Gradle,并且它存储在GRADLE_USER_HOME/wrapper/dists目录下的对应文件夹中,Gradle会直接使用本地缓存的版本。

下载Gradle发行版时,优先级完全由gradle-wrapper.properties中的distributionUrl决定,init.gradle文件中的任何配置不会影响这个过程。
因此,在下载Gradle 8.4时,系统会根据gradle-wrapper.properties中的distributionUrl=https://mirrors.aliyun.com/gradle/distributions/v8.4.0/gradle-8.4-all.zip来进行,即使在init.gradle中配置了其他Maven仓库。

posted @   Arlan  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示