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

这篇具有很好参考价值的文章主要介绍了Android gradle配置jar包加载顺序及延伸知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

项目的jdk环境:17.0.6
Android gradle配置jar包加载顺序及延伸知识,Android基础,android,jar,java


一、直接配置

1.APP目录下的build.gradle

先在app/libs文件夹下添加jar包,如果没有libs文件夹自行创建。
Android gradle配置jar包加载顺序及延伸知识,Android基础,android,jar,java
加入进项目后右击需要添加的jar,选择add as library,这时可以看到项目正在同步,同步完成过后可以发现APP目录下的build.gradle中的dependencies依赖下,新添加了依赖项

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

我们需要将 implementation 改为 compileOnly,like this:
Android gradle配置jar包加载顺序及延伸知识,Android基础,android,jar,java

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 相关的依赖来保证不出错,我这边的编译器会爆红,但是不影响编译
添加在顶部
Android gradle配置jar包加载顺序及延伸知识,Android基础,android,jar,java

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包加载顺序及延伸知识。文章来源地址https://www.toymoban.com/news/detail-759904.html

到了这里,关于Android gradle配置jar包加载顺序及延伸知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio下载及安装和Gradle的配置(非常详细)从零基础入门到精通,看完这一篇就够了

    文章目录 下载 安装 修改Sdk的位置 创建项目 修改Gradle的位置 查看AS版本 工具栏–View项 工具栏–Build下的功能说明 Build Variants视图说明 下载模拟器(avd)/安卓虚拟设备 屏幕熄灭功能 关闭虚拟设备功能 删除自己开发的应用软件 将开发的应用运行到虚拟设备上。 修改模拟器

    2024年02月09日
    浏览(55)
  • Android Studio下载及安装和Gradle的配置(非常详细)从零基础入门到精通,看完这一篇就够了_

    文章目录 下载 安装 修改Sdk的位置 创建项目 修改Gradle的位置 查看AS版本 工具栏–View项 工具栏–Build下的功能说明 Build Variants视图说明 下载模拟器(avd)/安卓虚拟设备 屏幕熄灭功能 关闭虚拟设备功能 删除自己开发的应用软件 将开发的应用运行到虚拟设备上。 修改模拟器

    2024年02月06日
    浏览(52)
  • 【Android学习】Android studio环境搭建-解决下载gradle慢&加载mainfest.xml慢的问题

    转载:https://blog.csdn.net/qq_31881469/article/details/78646406/ 目录 1、解决网络连接问题 (1)问题描述  (2)方法步骤  2、解决内存吃紧问题  (1)问题描述  (2)方法步骤  3、解决构建速度慢问题  (1)问题描述  (2)方法            检查你的 Android SDK,卡上很长时间,

    2024年02月14日
    浏览(41)
  • Android 开发中需要了解的 Gradle 知识

    作者:wkxjc Gradle 是一个基于 Groovy 的构建工具,用于构建 Android 应用程序。在 Android 开发中,了解 Gradle 是非常重要的,因为它是 Android Studio 默认的构建工具,可以帮助我们管理依赖项、构建应用程序、运行测试等。 本文将介绍 Android 开发中需要了解的一些 Gradle 知识,包括

    2024年02月13日
    浏览(30)
  • 完美解决 AndroidStudio Gradle 下载jar包慢Android Studio : Read timed out和connect timed out的解决方法

    在项目当中找settings.gradle.kts文件将其 找到上图的文件,按照上图进行将下面内容进行替换 新版本 老版本 mavenCentral() 如果不知是什么版本就挨个试一下

    2024年02月05日
    浏览(51)
  • SpringBoot配置文件的加载顺序

    一、引言 如果我们了解SpringBoot配置文件的加载顺序,对项目的开发和部署会有很大的帮助。举个工作中的例子,我们的项目是微服务架构模式,用Nacos做注册中心(可以配置每个微服务),所有服务请求需要通过网关,由网关做统一的鉴权和路由转发。环境有三套,本地环境

    2024年02月02日
    浏览(85)
  • Android导入其它项目慢,Gradel下载失败,另辟蹊径:使用离线gradle加载,附镜像方式

    最近在开发中需要测试以前写的小项目。结果忘了换本地的gradle,提示下载失败。换了现在用的gradle,项目能跑了。虽然网上有很多很多教程了,但对我的情况也不是都适用。所以自己记录一下。本人水平有限,有不对的地方请帮我指正,万分感谢。 如果您很着急,请直接看

    2024年02月03日
    浏览(55)
  • Spring Boot 的系统配置文件加载顺序

    【理论介绍】 配置文件加载顺序: 1、项目根目录下的config目录。【优先级最高】 2、项目根目录。 3、classpath下的config目录。 4、classpath目录(新建项目时application.properties默认所在位置)。【优先级最低】 备注: 加载顺序:4 - 3 - 2 - 1。 优先级:逐渐减低(1234)。 【举例说

    2024年02月09日
    浏览(52)
  • Java-springboot动态加载jar包,动态配置

    1、背景 ​ 目前数据治理服务中有众多治理任务,当其中任一治理任务有改动需要升级或新增一个治理任务时,都需要将数据治理服务重启,会影响其他治理任务的正常运行。 2、目标 能够动态启动、停止任一治理任务 能够动态升级、添加治理任务 启动、停止治理任务或升

    2024年02月13日
    浏览(43)
  • 112、SpringBoot中配置文件的加载顺序是怎样的?

    优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。 命令行参数。所有的配置都可以在命令行上进行指定 Java系统属性(System.getProperties()); 操作系统环境变量; jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件 jar包内部的

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包