一文搞清Gradle依赖
依赖类型 在 Android Gradle 构建中,依赖的管理主要依赖于 dependencies DSL 标签。这并非Android插件的特定特性,而是标准的Gradle API部分。 依赖类型有三种: 本地库模块依赖:implementation project(":mylibrary") 直接依赖于本地库工程的代码。 本地二进制依赖:implementation fileTree(dir: 'libs',实时翻译系统源码 include: ['*.jar']) 依赖工程中 module_name/libs/ 目录下的 Jar 文件。如需依赖多个本地二进制库,可配置为:implementation files('libs/foo.jar', 'libs/bar.jar')。 远程二进制依赖:implementation 'com.example.android:app-magic:.3'。完整的配置应包含 group: 'com.example.android', name: 'app-magic', version: '.3'。注意,避免使用如 .3+ 的非预期版本更新。 依赖配置 当前Gradle版本支持的依赖配置包括 implementation、api、compileOnly、runtimeOnly 和 annotationProcessor。已废弃的配置有 compile、provided、apk、providedCompile。配置还可以包括如 AndroidTestImplementation、debugApi 等。 常用配置包括 implementation、api 和 compileOnly,它们分别表示直接依赖、接口依赖和只在编译时使用的依赖。 查看依赖树 通过运行Gradle任务,可以查看项目的依赖树。例如,苹果cmstvapp源码使用 dependencies 任务。 解决依赖冲突 随着依赖的增加,依赖冲突在所难免。解决方法包括:定位冲突:通过错误信息,如 Program type already present com.example.MyClass,使用命令查找类的方式定位冲突的依赖。
排除依赖:在 dependencies 中排除特定依赖:transitive = true exclude group: 'com.taobao.android', module: 'accs_sdk_taobao'。
全局配置排除:设置 compile 的全局排除:exclude module: 'cglib'。
配置不传递依赖:使用 @jar 标识符忽略传递依赖:compile 'com.zhyea:ar4j:1.0@jar'。
强制使用版本:在存在依赖冲突时,使用 force 属性强制使用特定版本:compile('com.zhyea:ar4j:1.0') { force = true }。
打包时排除依赖:在打包任务中,使用 exclude 或 include 方法过滤或选择依赖。
结语 理解并正确配置依赖对于构建健壮的Android应用至关重要。使用Gradle的依赖管理功能,可以有效避免和解决依赖冲突,提高项目构建的效率和稳定性。Android-gradle plugin
agp,即Android-Gradle-Plugin的缩写,项目配置主要在根目录下的build.gradle文件中的dependencies中,配置classpath "com.android.tools.build:gradle:xxx"。在根目录的build.gradle文件中配置好agp后,就可以在任意module的build.gradle文件中apply Android提供的各种plugin。常见的有com.android.application和com.android.library。apply了com.android.application的module使用assemblexxx执行构建命令可打出来一个apk,而apply了com.android.library的module产物则是一个aar。apply java的module表示是个纯java的模块,打出的产物是个jar。
基于gradle构建的源码安装流程项目基本结构包括根目录下的settings.gradle,用来配置项目中的子模块,使用include来引入子模块。如果子模块不在项目目录内,则可以在include之后使用project(":xxx").projectDir = new File("...")来指定外部module的路径。项目根目录下还有一个build.gradle文件,用来配置整个项目的基本依赖,如插件依赖,aar依赖的maven仓库地址等。
根目录和每个module中都会有一个gradle.properties文件,用于配置一些key-value。构建脚本文件可以直接使用gradle.properties中的key-value配置,例如配置DEV_MODE=true,可在gradle文件中直接使用if ("true" == DEV_MODE) { xxx}。但需要注意的是,gradle.properties中配置的value会被当作字符串类型,即使写的是数字或true/false,也会被当作字符串处理。同时,配置的key-value被视为常量,不可修改,因此配置KEY的名字时,应使用全大写。
在项目根目录和每个module的gradle.properties文件中配置的key-value存在读范围问题和覆盖问题。子module可以读取本目录和父级目录下的gradle.properties中的key-value,但外部目录不能直接读取子目录下的gradle.properties文件。如果子目录下的gradle.properties文件中有相同的key值,则子目录中的value值将覆盖父级目录文件中的value值。在构建一个源码/aar切换的越狱查源码Andrid gradle项目时,可以通过在根目录的gradle.properties中配置全局参数,如构建用的Andrid SDK版本号、构建工具版本号和最低支持的系统版本号,而每个module的gradle.properties则可以为每个module配置其aar所需要的maven参数。
应用插件源码中,一般来说只有壳module的build.gradle中会apply application插件,用于打出一个apk供用户安装。应用插件的实现类为AppPlugin,继承自AbstractAppPlugin,最终调用basePluginApply方法,其中重点调用ThreadRecorder创建了三个线程任务。ThreadRecorder#record中的逻辑是通过create方法设置各种id,并使用block.call方法调用write方法,write方法中调用了ProcessProfileWRiter的writeRecord方法,将GradleBuildProfileSpan添加到span队列中,最后在ProcessProfileWriter的finish方法中将相关信息全部写到日志文件中。
BasePlugin中逻辑清晰,threadRecorder.record的逻辑就是调用最后一个lambda参数,包括configureProject、configureExtension和createTaskts。configureProject中创建了AndroidBuilder对象和初始化了DataBindingBuilder成员变量,配置了Java工程应该有的能力,如source、configureSourceSetDefaults、configureOutputDirectoryForSourceSet、createProcessResourcesTask、createCompileJavaTask、configureJavaDoc和configureTest等。指标源码 算法
configureBuildNeeded和configureBuildDependents方法分别配置了buildNeeded task和buildDependents task,确保build之后才能执行buildDependents。configureProject方法最后使用gradle.addBuildListener注册了构建监听器,在buildFinished回调中关闭所有进程。
configureExtension创建了buildTypeContainer、productFlavorContainer、signingConfigContainer和buildOutputs四个容器,构建了一个extension对象,并用这个extention创建了variantFactory,为变体配置了buildType、productFlavor、signingConfig和buildOutputs。createTasks方法分为两部分,createTasksBeforeEvaluate构建前的准备工作,createAndroidTasks为真正的构建task。createAndroidTasks方法中,为每个变体调用了createTasksForVariantData方法,判断变体类型后调用taskManager.createTasksForVariantScope(variantScope)为变体配置了众多task,如assembleXXX的相关task,实现多渠道的核心功能。
理解Android Studio中的Gradle
在探索Android Studio中的Gradle构建工具时,初学者可能会对它的功能和作用产生疑问。本文旨在帮助理解Gradle在Android开发中的重要角色以及一些关键概念。Gradle是Android Studio的默认构建工具,其核心功能包括管理依赖、打包、编译等,极大提高了开发效率。理解Gradle对于解决构建过程中的问题尤为重要。
Gradle介绍
Gradle是一个基于Apache Ant和Maven概念的项目自动化构建开源工具。它使用Groovy语言或Kotlin构建文件,提供了一种更灵活的方式来声明项目设置,相较于Maven中的XML配置,Groovy或Kotlin DSL更加简洁高效。
Gradle的核心特点在于它自身就是一门语言,支持丰富的插件生态系统,使得构建过程自动化且可定制。尽管Gradle并非Android专属,Android的构建功能主要是通过插件实现的。在Android开发中,Gradle提供了一种强大的方式来组织和管理依赖,简化构建流程。
Gradle相关文件
每次创建Android项目时,会自动生成一个gradle文件夹,其中包含wrapper文件。wrapper的作用是确保项目使用兼容的Gradle版本进行构建,解决版本兼容性问题。当构建项目时,wrapper会检查本地是否已安装所需的Gradle版本,若未安装,则自动下载并使用。
项目内部的build.gradle文件是关键配置文件,它定义了项目依赖、构建规则等。文件中包含apply plugin命令,用于引入Android Plugin DSL,这是Android项目构建的核心插件。dependencies块定义了项目依赖,repositories块则指示了依赖文件的来源,如google()、jcenter()仓库。
buildscript块和allprojects块分别用于声明Gradle构建工具本身和项目中其他模块的依赖,它们分别管理不同层面的依赖和配置,以实现层次化管理和灵活配置。
模块内的build.gradle文件
每个Android项目通常包含一个root build.gradle文件,用于配置整个项目的构建规则,以及一个或多个module build.gradle文件,分别配置不同模块的具体依赖和配置。apply plugin命令用于引入特定模块所需的构建插件,如'com.android.application'用于Android应用项目。
dependencies块定义了模块的依赖,使用implementation、testImplementation或androidTestImplementation来指定不同类型的依赖范围。模块内的build.gradle文件允许更细粒度的控制和配置,以适应特定需求。
本地配置文件
local.properties文件用于存储系统级别的配置,如SDK路径。gradle.properties文件则用于存储全局配置,如启用AndroidX等。
settings.gradle文件定义了项目中包含的模块列表,是构建过程的初始化配置。
Task
Task代表Gradle要执行的任务,如编译、打包等。每个Task的执行结果会被缓存,以避免重复执行相同操作,提高构建效率。通过命令行或Gradle GUI界面,可以执行特定的Task或构建整个项目。
总之,理解Gradle在Android开发中的作用和配置文件的使用是提高开发效率和解决构建问题的关键。掌握Gradle的核心概念和实践,将使Android项目构建过程更加顺畅和高效。
如何解决Android Gradle特别慢的问题
受限于国内网络环境,在打包过程中常常遇到速度缓慢甚至拉取失败的问题,例如“Could not Get xxx.pom”。即便尝试使用***,问题依旧没有得到解决。
为了解决这个问题,我们需要使用Maven代理仓库。
在Unity Project Settings中,勾选Custom Main Gradle Template和Custom Gradle Settings Template(注意,低版本Unity可能没有这一项,可以忽略)。接着,加入阿里镜像。
1. 修改mainTemplate.gradle文件
在project.repositories这一栏添加以下内容:
2. 修改settingsTemplate.gradle文件
在dependencyResolutionManagement的repositories这一栏添加以下内容:
通过以上操作,基本可以解决拉取问题,但打包速度仍然较慢。那么,有没有办法将maven仓库搭建在本地呢?
其实,Unity会将aar/jar下载到C:/Users/Administrator/.gradle目录。我们只需要编写一个脚本,将caches转换为所需的repository即可。
在C:/Users/Administrator/.gradle目录下新建一个gen_repository.py文件
执行gen_repository.py脚本,将会生成一个repository文件。
按照1和2的方法,将以下内容插入到对应的maven中:
通过以上步骤,你就可以实现Gradle的快速运行了。
Android开发学习教程(3)- Gradle构建项目
在Android Studio的开发过程中,告别了繁琐的第三方库管理方式,Gradle成为了构建项目的得力助手。它不仅简化了依赖关系的管理,还涵盖了编译、打包和部署等一系列构建任务,通过build.gradle文件定义了项目的构建逻辑。 这个文件系统中,至关重要的四个文件如下:工程根目录下的build.gradle:这是全局配置文件,你可以设置gradle版本为4.0.1,并配置依赖库的仓库,如Maven的阿里云仓库和Google仓库。
gradle.properties:用于调整JVM资源分配,指定使用AndroidX库,以及让Android插件自动迁移第三方库至AndroidX。
gradle-wrapper.properties:定义gradle的版本为6.1.1-all,确保工具的最新状态。
app文件夹下的build.gradle:这是开发中最常修改的文件,包含了项目的基本配置,如包名、SDK版本、混淆设置、依赖库及其版本等。
通过这些配置,Gradle让你能够灵活控制项目构建,提升了开发效率,使Android Studio的构建工具在与Eclipse的传统方式相比,显得更为高效便捷。Android gradle插件与gradle版本之间的关联
Android构建工具依赖gradle完成任务。明确gradle插件版本与gradle版本的区别及联系至关重要。
首先,gradle-wrapper.properties文件中的distributionUrl指定的是gradle版本,例如:.android.tools.build:gradle:3.6.3'。
理解gradle插件版本与gradle版本的对应关系有助于开发者更好地管理项目依赖。两者的修改路径主要包括:
方式一:通过菜单进行修改。
1. 打开File > Project Structure > Project,进行版本设置。
方式二:直接修改配置文件。
1. 访问gradle/wrapper/gradle-wrapper.properties文件进行修改。
2. 在顶级build.gradle文件中进行版本调整。
2024-12-28 16:25
2024-12-28 16:00
2024-12-28 15:28
2024-12-28 15:25
2024-12-28 15:24