【游戏引擎源码解析】【python资产管理源码】【golang源码阅读技巧】android gradle源码

时间:2024-11-28 19:50:51 来源:云赏源码授权 分类:综合

1.Android开发学习教程(3)- Gradle构建项目
2.Android-gradle plugin
3.Android gradle插件与gradle版本之间的关联
4.Android gradle 下载
5.理解Android Studio中的Gradle
6.一文搞清Gradle依赖

android 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让你能够灵活控制项目构建,提升了开发效率,python资产管理源码使Android Studio的构建工具在与Eclipse的传统方式相比,显得更为高效便捷。

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,golang源码阅读技巧可在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、源码制作play音乐signingConfigContainer和buildOutputs四个容器,构建了一个extension对象,并用这个extention创建了variantFactory,为变体配置了buildType、productFlavor、signingConfig和buildOutputs。createTasks方法分为两部分,createTasksBeforeEvaluate构建前的准备工作,createAndroidTasks为真正的构建task。createAndroidTasks方法中,为每个变体调用了createTasksForVariantData方法,判断变体类型后调用taskManager.createTasksForVariantScope(variantScope)为变体配置了众多task,如assembleXXX的相关task,实现多渠道的核心功能。

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文件中进行版本调整。

Android gradle 下载

       在升级Android Studio版本后,发现需要下载Gradle,尤其是在网络条件不佳的情况下,下载过程变得异常缓慢。为了解决这个问题,我们可以通过直接下载Gradle并将其放置在默认目录中来实现。默认的Gradle目录在mac系统中为~/.gradle/,在其他系统中请根据实际情况进行对应。

       下载Gradle的路径位于~/.gradle/wrapper/dists。在你的项目目录下的/gradle/wrapper/gradle-wrapper.properties文件中,可以看到相关的配置信息。为了更直观地了解Gradle的下载过程,我们可以查看一个已经下载好的Gradle(例如gradle-3.2-all)的内部结构。

       在下载好的Gradle中,你会发现包含gradle-3.2-all.zip.lck、gradle-3.2-all.zip.ok以及gradle-3.2-all.zip等文件。其中,gradle-3.2-all.zip是从.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项目构建过程更加顺畅和高效。

一文搞清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任务,可以查看项目的依赖树。例如,使用 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特别慢的问题

       受限于国内网络环境,在打包过程中常常遇到速度缓慢甚至拉取失败的问题,例如“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的快速运行了。