Android gradle配置jar包加载顺序及延伸知识

Android gradle配置jar包加载顺序及延伸知识

  • 前言
  • 一、直接配置
    • 1.APP目录下的build.gradle
    • 2.项目级的build.gradle
    • 3.其他问题
  • 二、gradle的生命周期及关键方法
    • 1.关键方法
    • 2.gradle的生命周期
  • 总结


前言

项目涉及到了要加载framework.jar,需要将libs文件夹下的framework.jar的依赖在原生framework依赖之前加载,触及到知识盲区,学习并记录下来。

项目的jdk环境:17.0.6
17.0.6


一、直接配置

1.APP目录下的build.gradle

先在app/libs文件夹下添加jar包,如果没有libs文件夹自行创建。
在这里插入图片描述
加入进项目后右击需要添加的jar,选择add as library,这时可以看到项目正在同步,同步完成过后可以发现APP目录下的build.gradle中的dependencies依赖下,新添加了依赖项

implementation files('libs\\framework.jar')

我们需要将 implementation 改为 compileOnly,like this:
在这里插入图片描述

compileOnly files('libs\\framework.jar')

然后再这个文件中加上这么一段代码,这时候APP目录下的build.gradle中我们应该改动了这些:

android {
   ...
   //加上这一块代码
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        incremental true
    }
    ...
}

dependencies {
    compileOnly files('libs\\framework.jar')
   ...
}

2.项目级的build.gradle

项目级的需要import 相关的依赖来保证不出错,我这边的编译器会爆红,但是不影响编译
添加在顶部
在这里插入图片描述

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

然后添加如下代码:

...
allprojects {
   
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile){
            options.compilerArgs << '-Xbootclasspath/p:CnsDVR/libs/framework.jar'
          
        }
    }
    tasks.withType(KotlinCompile).configureEach {
        compilerOptions.jvmTarget = JvmTarget.JVM_1_8
    }
}
...

3.其他问题

如果你的jar包没问题,那么应该就可以用了,代码会爆红,但是不影响编译,我跑的时候因为同时加入了另外一个wifi.jar,并且有依赖冲突报了,duplicate class这个错误,部分错误日志如下:

> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable

   > Duplicate class android.net.wifi.CoexUnsafeChannel found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.EasyConnectStatusCallback found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$Capabilities found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$ParcelableRttParams found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$ParcelableRttResults found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$ResponderCallback found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$ResponderConfig found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$RttCapabilities found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$RttListener found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

     Duplicate class android.net.wifi.RttManager$RttParams found in modules jetified-framework (framework.jar) and jetified-wifi (wifi.jar)

这个问题可以由两种解决方式,一种是把包里面的重复的类删除掉重新压缩放进去,另一种呢就是在APP目录下的build.gradle中排除掉多余的文件,类似如下:

android {
   ...
 
   
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        incremental true
    }

//加上这一块代码
    packagingOptions {
        exclude 'com/android/internal/util/Preconditions.uau'
        exclude 'com/android/internal/util/AsyncChannel.uau'
    }
    ...
}

dependencies {
    compileOnly files('libs\\framework.jar')
   ...
}

这样就可以使用了。

二、gradle的生命周期及关键方法

1.关键方法

先复习下一些见名知意的方法

dependencies {
    compileOnly files('libs\\framework.jar')
   ...
}

compileOnly 用于将库添加为编译时依赖项,但在运行时不需要。这通常用于那些仅在编译时需要的库,例如某些测试库或编译时注解处理器。而implementation 用于将库添加为运行时依赖项。这是最常见的依赖关系类型,当你需要一个库在运行时可用时,你会使用它。

 packagingOptions {
        exclude 'com/android/internal/util/Preconditions.uau'
        exclude 'com/android/internal/util/AsyncChannel.uau'
    }

排除了两个路径文件,避免依赖冲突

tasks.withType(KotlinCompile).configureEach {  
    compilerOptions.jvmTarget = JvmTarget.JVM_1_8  
}

这里配置了Kotlin编译任务,设置其目标JVM版本为1.8。

2.gradle的生命周期

在使用的时候我们用到了这部分代码:

gradle.projectsEvaluated {  
    tasks.withType(JavaCompile){  
        options.compilerArgs << '-Xbootclasspath/p:CnsDVR/libs/framework.jar'  
     
    }  
}

这部分代码配置了Java编译任务。它为Java编译器提供了额外的命令行参数。这些参数指示Java虚拟机在启动时使用特定的类路径。

那么gradle.projectsEvaluated是什么呢?
gradle.projectsEvaluated 是一个Gradle的生命周期事件。在Gradle的构建生命周期中,有多个事件和阶段,每个阶段允许你执行或配置特定的任务。projectsEvaluated是这些事件之一。
当所有的项目都已经被评估,并且所有的build.gradle文件都已经被解析和执行后,projectsEvaluated事件就会被触发。换句话说,这是所有项目的配置阶段完成后的一个点。
为什么这个事件是有用的呢?
在某些情况下,你可能需要等待所有的项目配置完成后才能执行某些操作。例如,假设你有多个子项目,并且你想在主项目的build.gradle文件中对它们进行一些后处理或汇总操作。这样的操作可能依赖于所有子项目的配置信息,所以你需要确保在所有的项目都被评估后再执行这些操作。
在给出的代码示例中,gradle.projectsEvaluated被用来配置Java编译任务。这意味着只有当所有的项目都被评估后,这些Java编译的配置才会被应用。这可能是为了确保在配置Java编译选项之前,所有的其他插件或脚本都已经完成了它们的配置工作。
简而言之,gradle.projectsEvaluated为你提供了一个机会,在所有项目都被评估后执行某些操作或配置。

上面提到了Gradle的生命周期事件,那么Gradle的生命周期事件是什么呢?

Gradle的生命周期事件主要包括以下四个阶段:

  1. 初始化阶段:在这个阶段,Gradle会读取项目的构建脚本并创建一个Project对象模型。同时,Gradle会检查构建脚本的语法和语义,以确保项目的正确性。此外,Gradle还会加载和执行插件,并根据插件中的规则来生成任务。如果有必要,Gradle还会执行一些预处理操作,例如解析依赖关系和配置项目属性。
  2. 配置阶段:在这个阶段,Gradle会执行构建脚本中的所有语句,并将任务和属性配置好。在这个阶段,你可以使用代码来定义和配置任务,也可以使用插件来扩展和修改任务。同时,Gradle还会创建一个任务图,它表示所有任务之间的依赖关系。
  3. 执行阶段:在配置阶段完成之后,Gradle会进入执行阶段。在这个阶段,Gradle会执行所有的任务,并根据任务之间的依赖关系来确定任务的执行顺序。如果任务之间存在依赖关系,Gradle会先执行依赖任务,然后再执行被依赖的任务。如果一个任务失败了,Gradle会停止构建过程并抛出异常。
  4. 完成阶段:在所有任务执行完毕之后,Gradle会进入完成阶段。在这个阶段,Gradle会执行一些清理工作,例如关闭文件和网络连接等。如果有必要,Gradle还会生成报告和日志文件,并将构建的结果通知给用户。同时,Gradle也会处理用户的输入和输出,以确保构建过程的可交互性。

此外,在Gradle的生命周期中,每个阶段都有对应的钩子函数(Hook Function),这些钩子函数可以在特定的阶段执行用户定义的代码。例如,在初始化阶段有settingsEvaluatedprojectsEvaluated两个钩子函数;在配置阶段有beforeEvaluateafterEvaluate两个钩子函数;在执行阶段有taskGraphReadytaskExecutionStartedtaskExecutionFinished等钩子函数;在完成阶段有buildFinished等钩子函数。通过使用这些钩子函数,你可以在Gradle生命周期的不同阶段执行自定义的操作,以满足特定的构建需求。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Android gradle配置jar包加载顺序及延伸知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242917.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot对PDF进行模板内容填充、电子签名合并

1. 依赖引入–这里只包含额外引入的包 原有项目包不含括在内 <!-- pdf编辑相关--> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version> </dependency><de…

数据结构与算法:选择排序

原理 从当前位置到最后&#xff0c;找出最小(或者最大)值&#xff0c;放在当前位置&#xff0c;位置后移。然后重复此过程。 每次都要在剩余未排序的集合中&#xff0c;找到那个最小(或者最大)的值&#xff0c;放到当前位置。所以叫选择排序。 最小或者最大&#xff0c;影响…

iOS加密CoreML模型

生成模型加密密钥 必须在Xcode的Preferences的Accounts页面登录Apple ID&#xff0c;才能在Xcode中生成模型加密密钥。 在Xcode中打开模型&#xff0c;单击Utilities选项卡&#xff0c;然后单击“Create Encryption Key”按钮。 从下拉菜单中选择当前App的Personal Team&…

Hive命令操作

1.命令行模式 1. 获取帮助 --> hive -H 或-help 2. 运行hive语句 --> hive -e "执行语句" 3. 运行hive文件 --> hive –f "执行文件" 4. 定义变量 --> hive –hivevar keyvalue 5. 引用变量 --> ${varname} 2. 交互模式 1. 进入客户端 -…

Apache Web 服务器监控工具

将Apache Web 服务器监控纳入 IT 基础架构管理策略有助于先发制人地识别性能瓶颈&#xff0c;这种主动监控方法提供必要的数据&#xff0c;以确保 Web 服务器能够胜任任务&#xff0c;并在需要时进行优化。保证客户获得流畅、无忧的用户体验可以大大有助于巩固他们对组织的信任…

STM32的DMA的五大问题

1&#xff0c;DMA控制器的内部结构 STM32中的DMA控制器是一种用于在外设和存储器之间传输数据的专用硬件。DMA控制器的内部结构主要包括以下几个关键部分&#xff1a; 通道&#xff1a; DMA控制器可以有多个通道&#xff0c;每个通道独立管理一个数据传输任务。通道的数量取决于…

【教学类-06-15】20231213 (按比例抽题+乱序or先加后减)X-Y之间“加法减法+-题”

作品展示&#xff1a; 背景需求 1、加减混合题——加法题多&#xff0c;减法题少 大三班一位女孩让我给他批改0-10加减法混合题&#xff0c;我随机从每列题目里面选了2个加法和2个减法题抽查答案正确性。 “347&#xff0c;对&#xff0c;这里819 对” 然后我停顿几秒&…

22.Java程序设计-基于SpringBoot的批发零售业商品管理小程序系统的设计与实现

摘要&#xff1a; 批发零售业商品管理小程序系统的设计旨在提高批发商、零售商和管理员的业务效率&#xff0c;实现商品的高效管理、订单的快速处理以及库存的精准监控。本系统基于Spring Boot框架&#xff0c;利用其强大的特性和生态系统&#xff0c;结合小程序前端&#xff…

R语言对医学中的自然语言(NLP)进行机器学习处理(1)

什么是自然语言(NLP)&#xff0c;就是网络中的一些书面文本。对于医疗方面&#xff0c;例如医疗记录、病人反馈、医生业绩评估和社交媒体评论,可以成为帮助临床决策和提高质量的丰富数据来源。如互联网上有基于文本的数据(例如,对医疗保健提供者的社交媒体评论),这些数据我们可…

AndroidStudio flutter 开发环境 绿色版,绿化方法

这里写自定义目录标题 绿色版下载:绿色版制作过程参考资料1.按照正常方式配置flutter开发环境(不包括桌面开发环境),确认能够正常编译apk2.移动AndroidStudio3.修改 {Android Studio安装路径}\bin\idea.properties4.移动.android5.移动AndroidSdk6.移动gradle 绿色版下载: and…

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032

原因分析&#xff0c;启动yarn-session.sh&#xff0c;会向resourcemanager的端口8032发起请求&#xff1a; 但是一直无法请求到8032端口&#xff0c;触发重试机制会不断尝试 备注&#xff1a;此问题出现时&#xff0c;我的环境ambari部署的HA 高可用hadoop&#xff0c;三个节点…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

低代码 —— 饮食均衡,合理膳食

目录 一、低代码的概念 二、低代码的优缺点 &#xff08;一&#xff09;优点 &#xff08;二&#xff09;缺点 三、低代码的能力 1、场景构建能力 2、数据编排能力 3、连接生态能力 4、业务中台能力 四、你认为低代码会替代传统编程吗&#xff1f; 1、从技术特征来看…

各厂家扇区电下倾识别调整方法

一、华为设备 针对华为4488天线或44天线TDD/FDD1800/FDD900电子下倾调整步骤 步骤1&#xff1a;先通过“DSP RETPORT”命令梳理全网供电开关开启状态 操作命令如下&#xff1a; &#xff08;可通过脚本执行DSP RETPORT:;命令批量提取全网信息&#xff0c;该命令是以RRU为单位…

【深度学习】强化学习(七)基于策略函数的学习方法

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习 二、基于值函数的学习方法三、基于策略函数的学习方法 一、强化学习问题 强化学习的基本任务是通过智能…

OpenCV极坐标变换函数warpPolar的使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1702字&#xff0c;预计阅读4分钟 前言 前阵子在做方案时&#xff0c;得了几张骨钉的图片&#xff0c;骨科耗材批号效期管理一直是比较麻烦的&#xff0c;贴RFID标签成本太高&#xff0c;所以一般考虑还是…

【教学类-06-16】20231213 (按比例抽题+乱序or先加再减后乘)X-Y之间“加法减法乘法+-×混合题”

作品展示&#xff1a; 背景需求&#xff1a; 大三班的“第一高手”对我提供的每一套的题目都只有一种反应&#xff1a; “这个是分合题&#xff0c;太简单了” “乘法&#xff0c;乘法我也会&#xff0c;11的1 22的4 33的9&#xff0c;,44十六……” “都太简单了&#xff0…

数据通信网络基础

数据通信网络基础&#xff08;1&#xff09; 一.前言 • 在人类社会的起源和发展过程中&#xff0c;通信就一直伴随着我们。从20世纪七、八十年代开始&#xff0c; 人类社会已进入到信息时代&#xff0c;对于生活在信息时代的我们&#xff0c;通信的必要性更是不言而喻 的。…

11.仿简道云公式函数实战-逻辑函数-TRUE

1. TRUE函数 TRUE 函数可直接返回逻辑值 true。 2. 函数用法 TRUE() 3. 函数示例 TRUE 函数一般不会作为函数单独使用&#xff0c;可与其他函数一起使用&#xff0c;或作为判断逻辑的结果。如&#xff0c;判断字段值是否为空时&#xff0c;设置公式为IF(ISEMPTY(方案选择)…

内网服务器部署maven私服简记

前言 很多企业希望创建自己的maven私服&#xff0c;但服务器无法和外网连通&#xff0c;所以这里介绍一套完整的内网部署nexus的解决方案。实现的方式也很简单&#xff0c;将下载好的nexus安装和项目所需的依赖仓库都上传到服务i去上去&#xff0c;通过脚本的方式实现批量导入…