Adnroid Studio - Gradle

一、概念

项目自动化构建管理,可以使用 Groovy DSL 语言(文件后缀xxx.gradle)或 Kotlin DSL 语言(文件后缀 xxx.gradle.kts)编写。

二、全局设置 settings.gradle

是整个 Gradle 项目构建的入口点,这里配置的都是全局的。构件时会生成一个 Settings 对象,这些简短的 DSL 语法底层都是在该对象上进行调用的。

Settings对象常用属性及方法说明
buildCache缓存配置。
plugins声明使用到的插件(全局)。
rootDir根目录。
rootProject根项目(该工程)。
settings返回构建时通过该文件实例化出的 Settings 对象。
include()将子模块添加到构建列表中(传入名称)。
includeBuild()将其它 Gradle 工程添加到构建列表中(传入路径)。

2.1 配置插件和依赖的仓库地址

内置的仓库能函数直接调用,自定义的要用 maven() 来指定地址。

// 插件管理
pluginManagement {
    // 仓库列表
    repositories {
        // 指定地址
        // 阿里云镜像仓库加速访问
        maven("https://maven.aliyun.com/repository/gradle-plugin")
        maven("https://maven.aliyun.com/repository/public")
        maven("https://maven.aliyun.com/repository/central")
        maven("https://maven.aliyun.com/repository/apache-snapshots")
        maven("https://maven.aliyun.com/repository/google")
        // Google插件仓库
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        // Maven中心仓库
        mavenCentral()
        // Gradle插件仓库
        gradlePluginPortal()
    }
}

// 依赖解析管理(更推荐在 build.gradle 文件中配置)
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven("https://maven.aliyun.com/repository/gradle-plugin")
        maven("https://maven.aliyun.com/repository/public")
        maven("https://maven.aliyun.com/repository/central")
        maven("https://maven.aliyun.com/repository/apache-snapshots")
        maven("https://maven.aliyun.com/repository/google")
        google()
        mavenCentral()
    }
}

2.2 配置插件

Gradle 插件可以帮助我们在构建过程中实现各种各样的高级功能,用于扩展任务(tasks)或构建逻辑。

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

2.3 添加子模块

让子模块参与到构建中。构件时会先读取 Settings.gradle,根据声明再去读取子模块中的 build.gradle 文件)。

// rootProject 代表工程,name 属性是其名称
rootProject.name = "Demo"
// 添加子模块,没有子模块可以不写
include("base")

三、模块配置 build.gradle

针对构建进行配置。对于 Settings.gradle 中声明的子模块,Gradle 都会为其生成一个 Project 对象,这些简短的 DSL 语法底层都是在该对象上进行调用的。

Project对象常用属性及方法说明
name模块名称。
path模块路径。
description模块描述。
dependencies配置模块的依赖列表。
repositories配置模块的依赖仓库。
layout通过此对象访问模块的关键位置。
group模块的组。
version模块的版本。

3.1 配置插件

// 指定项目需要使用到的插件
plugins {
    id("org.jetbrains.kotlin.jvk") version "1.9.0"    // 普通方式
    alias(libs.plugins.android.application) apply false    // toml方式
}

3.2 配置依赖

普通方法仅用于当前模块,带有 api 版本的方法可向上传递(引入这个模块的上层模块不用重复添加依赖项)。

DependencyHandlerScope的方法说明

implementation

api

添加依赖。
compileOnly仅在编译时可用,不会包含在最终构建结果中(编译完不会一起打包)。
runtimeOnly仅在运行时使用,不用于编译。如 MySQL 驱动不需要在项目编程时使用,但在程序运行时需要用到。

testImplementation

testApi

测试时需要的依赖。

androidTestImplementation

androidTestApi

Android测试时需要的依赖。

debugImplementation

debugApi

debug时需要的依赖。
kapt用于添加 Kotlin 注解处理器依赖项
annotationProcessor用于添加 Java 朱家琪依赖项。

3.2.1 添加

dependencies {
    // 引入仓库中的依赖
    implementation("io.coil-kt.coil3:coil-compose:3.5.0")    // 普通方式
    implementation(libs.compose.material3)    // 通过 toml 的方式
    // 导入本地jar包(存放在根目录的lib里)
    // 需要一个包一个包写
    implementation(
        files(
            "lib/spring-context-6.1.3.jar",
            "lib/spring-core-6.1.3.jar"
        )
    )
    // 直接给目录
    implementation(fileTree("lib"))
}

3.2.2 排除、强制(解决冲突)

一个依赖里会有前置依赖(该依赖还依赖别的),有时会有冲突,可以排除该依赖中的前置依赖。

implementation("org.springframework:string-context:6.1.3") {
    exclude("org.springframework")    // 排除整个组
    exclude("org.springframework:spring-aop")    // 排除具体某一个某块
}

spring-context 中包含了 spring-aop,当添加了 context 6.1.3 又添加了 aop 6.1.1 会优先使用更新的 aop 6.1.3。 此时可以通过排除不用最新的,也可以添加感叹号强制使用旧的。

// 两种方式二选一
implementation("org.springframework:string-context:6.1.3") {
    exclude("org.springframework:spring-aop")    // 不用新的
}
implementation("org.springframework:string-aop:6.1.1!!")    // 双感叹号强制使用

四、自定义任务 Task

Gradle 的工作由一个或多个任务(Task)来定义,任务代表构建执行的独立工作单元,比如编译一些类、创建 jar 包、生成 JavaDoc 文档、将一些内容发布到代码仓库。这些任务由插件提供(最直观的感受就是那些用来配置的DSL语句,以及build后显示的各种Task信息),工程中引入插件后就可以执行对应的任务了。当然也可以在 build.gradle 中创建自定义任务。

4.1 创建任务

register()懒加载,用到时才创建。
create()普通创建。

 IDE 代码左边可以点击箭头执行,也可以终端输入 ./gradle hello 执行。

// 第一个参数为任务名称,第二个参数 Lambda 为具体操作
tasks.register("hello") {
    // 设置组(相同组名的任务会在IDE的Gradle面板里聚合显示)
    group = ""
    // 设置描述信息(终端输入 ./gradle tasks 会显示可用任务和描述)
    description = ""
    println("执行中")
    // 插入到队列头部
    doFirst {
        println("任务开始")
    }
    // 插入到队列尾部
    doLast {
        println("任务结束")
    }
}

4.2 默认任务

defaultTasks()要传入已有任务名,终端输入 ./gradle 就会执行。
defaultTsks("hello")    // 默认任务,传入已有任务名

4.3 前置任务

一个任务还可以依赖其它任务。

tasks.register("hello") {
    // 执行自定义任务之前,需要先完成源代码编译
    dependsOn(tasks.compileJava)    // 也可以传任务名字符串
}

4.4 修改任务

named()修改已有任务。
// 执行build前先执行我们的自定义任务
tasks.named("build") {
    dependsOn("hello")
}

// 直接从tasks中获取build任务(仅限插件提供的任务)
tasks.build {
    dependsOn("hello")
}

4.5 内置任务类型

上述提到的方法默认泛型都是<Task>类型,还可以指定为其它内置类型:Zip、Jar、Sign、Delete 等。

tasks.register<Copy>("hello") {
    from("build/classes")    // 复制的目录
    into("test")             // 目标位置
    dependsOn("tasks.build")    // 依赖一下前置任务
}

4.6 自定义任务类型

通过继承 DefaultTask 类来创建自定义任务类型,自定义的这个类必须可继承(要么open要么abstract)。

// 自定义
open class HelloTask : DefaultTask() {
    private var name: String = ""
    // 注解声明的函数才会在任务执行时被自动调用
    @TaskAction
    fun hello() { println("名字是:$name") }
    // 也可以声明普通函数
    fun setName(str: String) { name = str }
}

// 使用(运行会执行 HelloTask 中的 hello() 函数)
tasks.register<HelloTask>("hello") {
    // 此时 this 就是 HelloTask 类型了
    setName("张三")    // 调用普通函数
}

五、生命周期钩子

可以在不同阶段执行自定义内容,如统计某一阶段或某个任务的耗时。

未特别说明的,在 settings.gradle 或 build.gradle 中都可以调用。

初始阶段gradle.settingsEvaluated()完成工程的配置阶段之后调用(只能定义在 setting.gradle 或 init.gradle 中)。
gradle.projectsLoaded()所有模块加载之后调用(只能定义在 setting.gradle 或 init.gradle 中)。
配置阶段gradle.beforeProject()每个模块完成配置之前调用(只能定义在 setting.gradle 或 init.gradle 中)。
gradle.afterProject()每个模块配置完成之后调用。
gradle.projectsEvaluated()所有模块配置完成之后调用。
gradle.aftersEvaluated()整个配置阶段完成后调用。
gradle.taskGraph.whenReady()全部任务都已经构建完成时调用。
执行阶段gradle.taskGraph.beforeTask()每个任务执行前调用。
gradle.taskGraph.afterTask()每个任务执行后调用。
gradle.buildFinished()整个构建全部结束后调用
gradle.settingsEvaluated {
    println("开始构建")
}

gradle.buildFinished {
    println("结束构建")
}

统计每个任务的耗时:

var time = 0L
gradle.taskGraph.beforeTask {
    time = System.currentTimeMillis()
}
gradle.taskGraph.afterTask {
    val takeTime = System.currentTimeMillis - time
    println("任务$name 耗时:$takeTime")
}

六、多模块

6.1 依赖其它模块

implemention(project(":module_base"))

6.2 统一配置

对多个模块进行统一配置,可以在根目录创建一个 build.gradle 来编写。

// 表示对所有子模块生效(用allprojects包括自己也生效)
subprojects {
    // 定义插件,plugin()在这里不行了
    apply(plugin = "java")
    // 定义组
    group = ""
    // 定义版本
    version = ""
    // 定义仓库地址
    repositories {
        maven("https://maven.aliyun.com/repository/public")
    }
}

6.3 依赖传递

A模块依赖B模块,可以调用B模块中的功能,C依赖A模块却不能调用B中的功能,就因为中间隔了一层。解决方法是将 implemention 改成 api ,参见上面 3.2。

6.4 buildSrc 模块

内容概要:本文围绕“基于交流潮流的电力系统多元件N-k故障模型研究”展开,深入探讨了利用Matlab代码实现电力系统在发生多个关键元件同时故障(即N-k故障)情况下的交流潮流计算与故障分析方法。该模型不仅考虑了传统潮流方程的非线性特性,还引入了故障约束条件,能够精确模拟复杂多样的故障场景,如短路、断线等,进而评估电网在极端运行条件下的稳态与动态行为。研究通过构建典型电力系统算例,验证了所提模型在故障筛选、脆弱性识别及系统恢复策略制定方面的有效性,为电力系统安全评估、风险预警和防御体系构建提供了坚实的理论依据和技术支撑。此外,模型具备良好的扩展性,可进一步应用于连锁故障传播分析、恶意攻击模拟等高级安全分析领域。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力的高校研究生、科研院所研究人员以及电力公司从事电网规划、运行与安全管理的技术人员,特别适用于开展电力系统安全稳定、可靠性评估与应急响应机制研究的专业人士。; 使用场景及目标:①开展电力系统在多重故障条件下的交流潮流仿真,评估系统电压稳定性、线路过载风险及负荷损失程度;②识别电网中的关键薄弱环节与脆弱元件,支撑电网加固改造与防御资源配置;③用于科研项目中的故障场景建模与算法验证,或作为教学案例帮助学生理解复杂故障下的系统响应机制。; 阅读建议:此资源以Matlab代码为核心实现手段,建议读者结合理论推导与代码实现进行对照学习,重点关注故障建模过程中雅可比矩阵的修正方法、故障注入方式及收敛性处理策略,建议在仿真中逐步增加故障数量与复杂度,深入理解N-k故障对系统潮流分布的影响规律,并尝试将其拓展至含新能源接入的现代电力系统场景中进行验证与优化。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文详细介绍了基于PyTorch实现的并行物理信息神经网络(PINNs)在NLS–MB方程孤子演化预测中的应用实例,系统阐述了模型架构设计、损失函数构造、训练流程优化及并行计算策略的实施过程。通过深度融合物理先验知识与深度学习框架,该方法有效求解了非线性薛定谔类偏微分方程,实现了对孤子动力学行为的高精度、高效率数值模拟与长期演化预测,充分展现了PINNs在处理复杂科学计算问题中的强大建模能力与泛化性能。; 适合人群:具备一定深度学习理论基础和偏微分方程求解经验,熟练掌握Python编程语言及PyTorch深度学习框架,从事计算物理、流体力学、光学通信或相关工程仿真的研究生、科研人员及高级技术人员。; 使用场景及目标:①深入理解如何将物理守恒律与控制方程作为硬约束嵌入神经网络,提升模型在稀疏数据下的泛化能力与物理一致性;②掌握PINNs在非线性孤子波、色散介质传播等复杂动力系统建模中的关键技术实现路径;③应用于量子物理、非线性光学、大气海洋动力学等领域中传统数值方法难以求解的高维、强非线性偏微分方程的正/反问题研究。; 阅读建议:建议读者结合文末提供的完整代码资源(可通过公众号“荔枝科研社”获取)进行动手实践,重点关注物理残差项在自动微分框架下的精确计算、多任务损失权重的平衡策略,并尝试迁移模型至其他类型的非线性演化方程以深化理解与应用能力。
内容概要:本文围绕LLC谐振变换器的变频移相混合控制模型展开研究,通过Simulink搭建完整的仿真模型,系统阐述了该控制策略的理论基础与实现方法。研究结合变频控制与移相控制的优点,旨在提升LLC谐振变换器在宽负载范围内的转换效率与系统稳定性,深入分析其在高频高效电源系统中的动态响应特性与优化潜力。文中详细展示了控制逻辑设计、关键参数整定及仿真验证过程,有助于读者全面掌握LLC变换器的工作机理与先进控制技术的应用。; 适合人群:具备电力电子技术、自动控制理论及仿真建模基础的科研人员与工程师,特别适用于从事高频电源、新能源变换系统研发的技术人员,以及电力电子与电气工程方向的研究生及以上学历人员。; 使用场景及目标:①深入理解LLC谐振变换器的核心工作原理及其在轻载与重载工况下的控制挑战;②掌握变频与移相混合控制策略的设计思路、协同机制与仿真建模技巧;③应用于高频DC-DC变换器、电动汽车车载充电机、光伏微逆变器及高效开关电源等高性能电力电子系统的研发与性能优化。; 阅读建议:建议读者结合提供的Simulink仿真模型逐步操作,重点观察系统在不同负载条件下的频率调节与相位调节响应,深入分析效率曲线与谐振腔波形变化,进而掌握控制参数对系统性能的影响规律,可进一步拓展至其他谐振拓扑(如Series Resonant、LCL等)的混合控制策略研究。
内容概要:本文详细介绍了基于物理信息神经网络(PINNs)求解欧拉-伯努利双梁正问题的PyTorch实战方法,通过Python代码实现对双梁结构力学行为的建模与数值求解。该方法将控制偏微分方程作为物理约束嵌入神经网络训练过程中,结合深度学习框架实现无需传统网格划分的高精度数值仿真,适用于复杂工程结构的正问题求解。文中系统阐述了模型架构设计、损失函数构造、边界与初始条件处理、网络训练流程及结果可视化等关键技术环节,突出了PINNs在固体力学领域中融合数据驱动与物理规律的优势。; 适合人群:具备一定深度学习理论基础和力学背景知识,熟悉PyTorch框架使用,从事科学研究或工程技术工作的研究生、高校科研人员及工业界研发工程师。; 使用场景及目标:①掌握物理信息神经网络在结构力学中的建模范式;②实现对欧拉-伯努利梁等经典弹性体问题的无网格神经网络求解;③探索将PINNs拓展至更复杂的多物理场耦合、非线性材料或动态响应分析等问题的新途径;④为工程仿真提供一种避免传统有限元离散化、适应不规则几何和高维问题的替代方案。; 阅读建议:建议读者结合所提供的完整代码逐模块运行与调试,深入理解物理损失项与数据损失项的平衡机制,关注网络超参数选择对收敛性的影响,并尝试修改结构参数、边界条件或外载形式以验证模型泛化能力,进一步推动方法在实际科研项目中的迁移应用。
源码下载地址: https://pan.quark.cn/s/56fcef70b5be **苹果的iTunes历史版本:12.6.5.3** iTunes是由苹果公司开发的一款数字媒体播放软件,它不仅用于维护个人的音乐资料库,还支持与Apple的iPod、iPhone和iPad产品进行同步和交互操作。这个特定的历史版本——12.6.5.3,是在苹果对iTunes实施多次更新和功能优化之后的一个可靠版本。 在12.6.5.3版本中,核心的改进方向在于兼容性提升和稳定性增强。那个时期的iTunes仍然提供了对iOS设备的完整支持,用户可以通过USB数据线将音乐、视频、软件、书籍以及照片等资料传输到他们的iPhone、iPad或iPod touch设备上。同时,它也支持设备的备份和还原功能,以保障用户的数据安全。 在音乐管理领域,iTunes 12.6.5.3展示了一个直观的界面,使用户可以便捷地浏览、播放、整理以及购买音乐。它具备智能播放列表功能,能够依据用户的偏好自动生成播放列表。除此之外,该版本的iTunes融合了Apple Music服务,用户可以付费订阅并获取庞大的在线音乐资源库。 对于视频资料,用户可以欣赏和下载购买的电影及电视剧作品,其中包括高清和4K分辨率的影片。这个版本或许也包含了AirPlay技术的支持,让用户能够将媒体资料无线传输到兼容AirPlay的设备,例如Apple TV。 在设备同步环节,12.6.5.3版的iTunes维持了与各种iOS系统版本的兼容状态,涵盖了当时最新的iOS操作系统。这使用户在将设备升级至最新系统时,依然可以无障碍地管理设备内的内容。 压缩文件包中的`iTunes64Setup.exe`与`iTunes32Setup...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 依据所提供的文件资料,能够系统性地剖析并归纳出关于HiTool工具操作的相关要点,主要涵盖以下几个领域: ### 一、HiTool工具概述 #### 概述 HiTool是由深圳市海思半导体有限公司研发的一款用于将程序镜像载入到单板Flash中的烧写工具。该工具能够支持多种不同的烧写情境,涵盖一键将所有程序镜像载入到单板Flash、单板已配备BootROM时按地址载入其他程序镜像以及仅载入Boot到单板Flash等操作。 #### 适用产品型号 - **产品名称**:Hi3536 - **产品版本**:V100 #### 目标读者 - **技术支持人员** - **单板软件开发人员** ### 二、环境配置 为了确保HiTool工具能够顺利运行,需要按照以下步骤进行环境准备: 1. **软件配置**:将SDK中的`osdrv\tools\pc_tools\uboot_tools`文件夹内的`HiTool.exe`文件复制到PC的某个本地硬盘中。(PC设备必须安装Windows操作系统) 2. **硬件连接**:保证单板的串口和网线已经正确连接。 3. **工具启动**:运行`HiTool.exe`工具,选择相应的芯片型号(例如Hi3536),然后点击“确定”。 ### 三、分区载入 #### 适用情境 适用于一键将所有程序镜像载入到单板Flash的情况。 #### 载入步骤 1. **启动HiTool工具**:参照“环境配置”的步骤来启动HiTool工具。 2. **选择HiBurn选项**:进入HiBurn烧写工具界面。 3. **选择分区载入模式**:进入分区载入的操作界面...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值