Android 項目Gradle文件講解(Groovy和Kotlin)

Android 項目Gradle文件講解(Groovy和Kotlin)

  • 前言
  • 正文
    • 一、Gradle的作用
    • 二、Gradle的種類
      • ① 工程build.gradle
      • ② 項目build.gradle
      • ③ settings.gradle
      • ④ gradle.properties
      • ⑤ gradle-wrapper.properties
      • ⑥ local.properties
    • 三、Groovy和Kotlin的語言對比
      • ① 開啟ViewBinding、DataBinding和buildConfig
      • ② 添加依賴庫
      • ③ 添加lib庫中的jar使用
      • ④ 配置Jitpack倉庫
      • ⑤ 自定義打包信息
    • 四、源碼

前言

??在Android應用開發中,Gradle是很重要的,它關系到你的項目能否正常編譯運行,構建APK等等,而隨著Android Studio編輯器的更新,Gradle也發生了一些變化。

正文

??Gradle 在 Android 開發中扮演了重要角色,它提供了靈活和可擴展的構建工具,使得 Android 項目的構建過程變得更加高效和便捷。

??在很多版本中Android Studio中Gradle的主要語言都是Groovy,而在新版本的Android Studio,主要語言換成了Kotlin,雖然你仍然可以選擇使用Groovy,但是我們是不是應該知道兩者之間的編寫方式和規則。出現了問題也要知道怎么解決。

一、Gradle的作用

??Gradle 是一種基于 Groovy 的構建工具,被用于 Android 項目的構建、編譯和打包。它提供了強大的構建自動化功能,使得在 Android 應用開發中管理依賴、設置環境和自定義構建流程變得更加方便和靈活。

在 Android 開發中,Gradle 被廣泛用于構建項目、處理依賴、運行測試、生成 APK 等任務。下面是一些關于 Android 中的 Gradle 的重要說明:

  1. 構建腳本: Android 項目中的 build.gradle 文件是 Gradle 的核心配置文件。它定義了項目的構建設置、依賴關系和任務。通常,一個 Android 項目包含根目錄下的 build.gradle 文件和每個模塊(如 app 模塊)下的 build.gradle 文件。

  2. 插件: Android Gradle 插件是為了與 Android 構建系統集成而設計的 Gradle 插件。在項目的 build.gradle 文件中,通過引入 com.android.applicationcom.android.library 插件,可以使 Gradle 成為適用于 Android 應用或庫的構建工具。

  3. 任務: Gradle 使用任務(Task)來定義構建過程中需要執行的操作。常見的任務包括編譯代碼、打包應用、運行測試、生成 APK 等。Gradle 支持自定義任務,可以根據需要擴展構建過程。

  4. 依賴管理: Gradle 管理 Android 項目的依賴關系。通過 dependencies 塊,可以指定項目所需的外部庫和模塊。Gradle 可以自動從遠程 Maven 倉庫或本地文件系統下載依賴項,并將其包含到項目的構建路徑中。

  5. 變體: Android Gradle 插件引入了變體(Variant)的概念,用于管理不同構建類型(如 Debug 和 Release)和不同產品風味(如不同的應用標識符或資源配置)的構建變體。通過變體,可以針對不同的構建配置生成不同的 APK。

  6. 構建類型和產品風味: Android Gradle 插件允許定義多個構建類型和產品風味,以滿足不同的需求。構建類型可以是 Debug、Release 或自定義的構建類型,而產品風味可以設置不同的應用標識符、資源和其他配置。

二、Gradle的種類

??Gradle在Android項目中有兩個比較重要的文件,那就是工程下的build.gradle和模塊下的build.gradle,如下圖所示:

在這里插入圖片描述

??當我們將項目結構切換為Android模式時,打開Gradle Scripts,就可以看到排在最前面的是工程的build.gradle,然后是模塊的build.gradle,只要看文件括號后面的內容就知道這個build.gradle作用的范圍是什么,雖然兩者都是build.gradle,但因為作用范圍不同,實際的功能就不同。

① 工程build.gradle

??在 Android 工程中,項目的根目錄下有一個名為 build.gradle 的文件,通常稱為 “工程級 build.gradle”,用于配置整個項目的構建設置。下面是一個簡單的 Android 工程級 build.gradle 文件的示例:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {id 'com.android.application' version '8.1.3' apply falseid 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}

??上述示例中的 plugins 塊配置了插件,并指定插件的版本,這是新版本的工程build.gradle,它將一些功能放到settings.gradle中,下面我們會說到。

② 項目build.gradle

??在 Android 項目中,每個模塊(如 app 模塊、library 模塊等)都有一個對應的模塊級 build.gradle 文件,用于配置該模塊的構建設置和依賴項。下面是一個簡單的 Android 模塊級 build.gradle 文件的示例:

plugins {id 'com.android.application'id 'org.jetbrains.kotlin.android'
}android {namespace 'com.example.hellokotlin' compileSdk 33 // 指定編譯使用的 Android SDK 版本defaultConfig {applicationId "com.example.hellokotlin" // 應用的唯一標識符minSdk 24 // 最低支持的 Android 版本targetSdk 33 // 目標 Android 版本versionCode 1 // 版本號versionName "1.0" // 版本名稱testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release { minifyEnabled false  // 是否開啟代碼混淆proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 混淆規則文件}}compileOptions {	//編譯選項sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {		//Kotlin編譯基于Jvm的版本jvmTarget = '1.8'}// 其他配置項,如構建變體、簽名配置等
}dependencies {  // 依賴項implementation 'androidx.core:core-ktx:1.9.0'implementation 'androidx.appcompat:appcompat:1.6.1'implementation 'com.google.android.material:material:1.8.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
  • plugins 聲明了所應用的插件,例如 'com.android.application' 表示應用 Android 應用插件,org.jetbrains.kotlin.android表示Kotlin語言插件,如果你使用Java語言開發,則不需要這個插件。
  • android 塊用于配置 Android 構建設置,其中包括編譯和構建的相關配置。例如,compileSdkVersion 指定了編譯使用的 Android SDK 版本,defaultConfig 定義了默認的配置項,如應用標識符、最低支持版本、目標版本等。
  • buildTypes 塊用于定義不同構建類型(如 release、debug)的配置。通過這個塊,可以控制是否開啟代碼混淆、添加混淆規則等。
  • dependencies 聲明了該模塊的依賴項。使用 implementation 關鍵字可以引入所需的庫和模塊。例如,androidx.appcompat:appcompat:1.6.1' 引入了 AndroidX AppCompat 庫。
  • 可以在文件的其他部分定義自定義任務和其他配置塊。這些可以根據項目需求進行個性化配置,例如添加構建任務、自定義變體等。

??需要注意的是,每個模塊都有自己的 build.gradle 文件,但具體的配置選項和依賴項可能因模塊類型和項目需求而有所不同。建議參考具體模塊的 build.gradle 文件和官方文檔來了解和調整配置。

③ settings.gradle

??settings.gradle 是 Android 項目的根目錄下的一個重要文件,它用于配置項目的模塊和構建設置。

??這里需要說明一下,實際上關于settings.gradle項目在舊版本的Android Studio上沒有這么多內容,只是對工程下面的模塊進行管理,我們看看之前的settings.gradle中有什么內容,如下所示:

rootProject.name = "HelloKotlin"
include ':app'

??之前的內容比較簡單,當你需要改動項目名稱或者增加項目中的模塊時這個文件才會發生變化。大概是在大黃蜂版本開始發生了變化,將原本屬于工程級build.gradle中的一些功能挪到了settings.gradle中,新版本代碼如下所示:

下面是一個常見的 Android settings.gradle 文件的示例及其說明:

pluginManagement {repositories {google()mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}rootProject.name = "HelloKotlin"
include ':app'

??我們著重說明一下增加的部分, settings.gradle 文件中的 pluginManagementdependencyResolutionManagement 配置塊中的內容。這些配置塊用于配置 Gradle 插件的倉庫和依賴項的解析方式。

pluginManagement 配置塊中:

  • repositories 聲明了用于解析 Gradle 插件的倉庫。示例中的配置包括 google()mavenCentral()gradlePluginPortal()。通過這些倉庫,Gradle 將查找并下載所需的插件。

dependencyResolutionManagement 配置塊中:

  • repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 設置了倉庫模式為 RepositoriesMode.FAIL_ON_PROJECT_REPOS。這表示如果項目中存在本地的倉庫,則構建過程將失敗。該配置用于強制 Gradle 僅使用遠程倉庫解析依賴項,而不依賴本地倉庫。

  • repositories 聲明了用于解析項目依賴項的倉庫。示例中的配置包括 google()mavenCentral()。通過這些倉庫,Gradle 將查找并下載項目所需的依賴項。

??這些配置塊的作用是為 Gradle 構建過程提供正確的插件和依賴項解析環境。配置中的倉庫聲明可以根據項目的需求進行調整,以確保構建正常進行。

④ gradle.properties

??gradle.properties 文件是一個位于根目錄下的重要配置文件,用于設置 Gradle 構建系統的全局屬性。它可以包含一些常用的配置屬性和自定義屬性,以影響項目的構建過程。其中讓人印象最深刻的莫過于Google將庫統一遷移到AndroidX下,當時就需要改一個屬性android.useAndroidX=true,現在這已經是一個常駐屬性了,之前的V4、V7的庫你只會在一些老項目上看到,屬于時代的眼淚了,下面我們看看這個gradle.properties中的內容

#  指定用于守護進程的 JVM 參數。
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
#  使用AndroidX
android.useAndroidX=true
#  Kotlin 代碼樣式:“official 官方”或“obsolete 過時”:
kotlin.code.style=official
#  啟用每個庫的 R 類的命名空間,以便其 R 類僅包含庫本身中聲明的資源,而不包含庫依賴項中的資源,從而減小該庫的 R 類的大小
android.nonTransitiveRClass=true

實際上就4行代碼,我將一些內容翻譯了一下,可能不是那么準確,但是差不太多,平時這里改動比較少。

⑤ gradle-wrapper.properties

??在 Android 項目中,gradle-wrapper.properties 文件位于根目錄下的 gradle/wrapper 文件夾中,它用于配置 Gradle Wrapper。Gradle Wrapper 是一個與項目一起分發的 Gradle 版本管理工具,它可以確保每個構建都使用指定版本的 Gradle,而無需手動安裝或配置 Gradle。

gradle-wrapper.properties 文件包含了一些重要的配置屬性,用于指定 Gradle Wrapper 的行為和使用的 Gradle 版本。下面看一個示例:

#Fri Dec 15 15:44:43 CST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

上述示例中的 gradle-wrapper.properties 文件包含了以下重要配置和說明:

  • distributionBasedistributionPath 配置了 Gradle Wrapper 下載和緩存 Gradle 發行版本的基本路徑。默認情況下,它們指向 GRADLE_USER_HOME,即用戶的 Gradle 目錄。

  • zipStoreBasezipStorePath 配置了壓縮文件的基本路徑,Gradle Wrapper 會將下載的 Gradle 發布文件存儲在這里。默認情況下,它們也指向 GRADLE_USER_HOME

  • distributionUrl 指定了要使用的 Gradle 發布版本的 URL。通過指定這個 URL,Gradle Wrapper 會自動下載并使用該版本構建項目。

??gradle-wrapper.properties 文件的作用是為項目提供一個指定版本的 Gradle。當你使用 Gradle Wrapper 執行構建時,它會根據該文件中的配置自動下載所需版本的 Gradle。這有助于項目的一致性和可移植性,因為每個開發者都可以使用相同的 Gradle 版本構建項目,無需手動配置。

??需要注意的是,如果需要更改 Gradle 版本或其他配置屬性,可以在 gradle-wrapper.properties 文件中進行相應的修改。比如我可能Gradle需要升級8.1,那么你在改動之后點擊Sync Now進行下載配置,具體的配置方式和詳細說明可以參考官方文檔。

⑥ local.properties

??local.properties 文件是一個位于根目錄下的本地配置文件,它用于指定本地開發環境中的一些路徑和屬性。該文件通常用于定義 SDK 和其他構建工具的位置,以便 Gradle 可以正確定位并使用它們。

以下是一個示例 local.properties 文件的內容及其說明:

sdk.dir=D\:\\Android\\Sdk
ndk.dir=D\:\\Android\\Sdk\\ndk\\26.1.10909125

上述示例中的 local.properties 文件包含了以下重要配置和說明:

  • sdk.dir 配置了 Android SDK 的位置。這個配置屬性指定了 Android SDK 的根目錄路徑,Gradle 將使用該路徑來查找構建所需的 Android 庫和工具。

  • ndk.dir 配置了 Android NDK 的位置。這個配置屬性指定了 Android NDK 的根目錄路徑,Gradle 將使用該路徑來支持使用 C/C++ 編寫的本地代碼。

??通過在 local.properties 文件中設置這些屬性,Android 開發工具鏈(如 Android Studio 和 Gradle)可以找到和使用正確的 SDK、NDK 版本,并確保項目的構建過程能夠正常進行。

??請注意,local.properties 文件通常是在 Android 項目的每個開發者的本地環境中設置。這意味著每個開發者可以根據自己的系統配置和需求來設置這些屬性,而不會影響到其他開發者。默認情況下你是不需要配置ndk的路徑的,需要根據你的實際開發環境和需求來設置 local.properties 文件中的屬性。確保路徑和屬性值與你的系統配置和目錄結構一致。

三、Groovy和Kotlin的語言對比

??在一開始build.gradle中是使用Groovy作為構建語言的,而在后面Google主推Kotlin為主要編程語言之后,就開始推薦使用Kotlin去構建build.gradle。對于開發者來說你目前熟悉什么就使用什么,下面我們來看一下一個Android工程中,使用Groovy和Kotlin去構建Gradle文件的區別。

??要進行對比,首先我們創建兩個項目,編寫語言都使用Kotlin,Gradle的語言一個使用傳統的Groovy,一個使用新的Kotlin。
首先說明一下我使用的Android Studio的版本:

在這里插入圖片描述

算是比較新的版本了,下面我們來創建項目,首先創建使用Groovy作為Gradle編輯語言的項目。

在這里插入圖片描述

然后我們再創建使用Kotlin作為Gradle編輯語言的項目。

在這里插入圖片描述

??OK,等兩個項目都創建好之后,建議你先依次運行一次,看看剛創建的項目是否異常,這可以幫助你規避一些問題。同時為什么幾張圖就能解決的問題,我要創建兩個項目來說明呢?是不是為了水篇幅,你要是這么想格局就小了,創建項目有什么好處的,那就是你可以拿到我這里的源碼,兩個項目的源碼都可以進行對比,對比之后你就能知道當前項目有什么問題,同時如果說后續有什么新的需求要添加的話就可以很方便的更新代碼和更新文章,我就不用再去重新創建項目了。說了這么多廢話,下面我們進入對比環節。

??要對比兩個語言在Gradle文件中的不同使用方式最好的方法就是通過一些實際中的使用功能來進行,后面的內容也是基于這一點。

① 開啟ViewBinding、DataBinding和buildConfig

??對于兩個功能,相應使用過的開發者應該不陌生,對于ViewBinding來說,極力推薦,如果你還在使用findViewById這種方式的話,建議你替換,而DataBinding相較來說有一定的使用門檻,用不好會出一堆問題,建議研究過再去使用。而buildConfig開啟之后則會在編譯時生成一個BuildConfig的類,在之前的Android Studio中,這個是默認生成的,而新版中需要手動配置才能生成,里面主要的功能就是可以讓你知道當前運行的是正式環境還是開發環境,對于一些日志的控制還是有幫助的。

Groovy

    // 添加配置 開啟ViewBindingbuildFeatures {viewBinding true// dataBinding true// buildConfig true}

Kotlin

    // 添加配置 開啟ViewBindingbuildFeatures {viewBinding = true// dataBinding = true// buildConfig = true}

下圖為具體添加的位置,左為Groovy,右為Kotlin (后面的圖也是這個方式,就不贅述說明

在這里插入圖片描述

同時要注意的是在app模塊下的build.gradle。

② 添加依賴庫

在Android開發中我們會使用很多依賴庫,由第三方也有Google提供的,下面我們添加一個比較常用的Gson庫。

Groovy

	// Gson庫implementation 'com.google.code.gson:gson:2.11.0'

Kotlin

	// Gson庫implementation("com.google.code.gson:gson:2.11.0")

??我們可以看到區別,在于Groovy可以使用單引號或者雙引號,但是Kotlin只能使用雙引號,同時左右需要加上括號,注意是在dependencies{}下進行配置,如下圖所示:

在這里插入圖片描述

注意,當gradle文件改動之后你都需要點擊Sync Now進行同步配置,否則配置不生效,這也是很多人問過我的問題。

③ 添加lib庫中的jar使用

例如我們這里下載Gson的jar包,然后將這個包復制到app下的libs包,如果沒有這個包就創建它,兩個項目都完成這一步操作。

在這里插入圖片描述

??在老版本的Android Studio中默認有這個libs,還有默認將libs中的文件配置的代碼,在版本迭代中首先是去掉了配置的代碼,再來就是去掉了這個libs文件。那么現在我們創建了這個libs文件夾,下一步就是增加配置的代碼了。

Groovy

	// 使用libs中的jar包implementation fileTree(include: ['*.jar'], dir: 'libs')

Kotlin

	// 使用libs中的jar包implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

可以看到,在kotlin中使用是就是作為map進行配置的,如果你想使用libs中的aar包,那么就將,*.jar改成*.aar,配置如下圖所示:

在這里插入圖片描述

??這里我將之前的依賴庫代碼注釋掉了,因為都是使用的gson的庫,如果你同時使用的話,可能會存在依賴沖突的問題,盡量避免這么做。當你使用成功時,你的jar文件就是可以展開的,如下圖所示:

在這里插入圖片描述

而aar文件則不會有變化,需要通過使用里面的API來判斷是否正常導入。

④ 配置Jitpack倉庫

??使用依賴庫的時候的,依賴庫是存在于某一個遠程倉庫中的,目前新版本的Android Studio,自帶了google()、mavenCentral()這兩個倉庫,如果你使用的是官方的依賴庫,那么基本上做什么配置,直接使用就行了,而如果是一些第三方庫,例如早期的BaseRecyclerViewAdapterHelper庫,當時就在Jitpack庫下面,不過新版本已經遷移到了MavenCentral()庫下面,具體的你可以去Github上查看這個庫的更新記錄就知道了。

Groovy

    // 添加 jitpack庫maven { url 'https://jitpack.io' }

Kotlin

	// 添加 jitpackmaven("https://jitpack.io")

注意這里是在settings.gradle中了,如下圖所示:

在這里插入圖片描述

⑤ 自定義打包信息

通過項目編譯成apk文件,我們可以修改apk的文件名稱,如下所示:

Groovy

	// 自定義打包android.applicationVariants.all { variant ->variant.outputs.all {outputFileName = "GradleGroovy${variant.versionName}.apk"}}

Kotlin

    // 自定義打包android.applicationVariants.all {outputs.all {if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl) {this.outputFileName = "GradleKotlin${versionName}.apk"}}}

注意是在app模塊下的build.gradle

在這里插入圖片描述

如果你生成Apk之后沒有看到app下有一個debug或release的文件夾,那么你可以刷新以下項目,前提是你生成APK提示成功了。

四、源碼

GradleGroovy

GradleKotlin

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18172.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

裝飾模式:雞腿堡

文章目錄 UML類圖目錄結構Humburger.javaChickenBurger.javaCondiment.javaChuilli.javaLettuce.javaTest.java深度理解test怎么寫 UML類圖 目錄結構 我們從指向最多的開始寫 Humburger.java package zsms;public abstract class Humburger {protected String name;public S…

【接口自動化_05課_Pytest接口自動化簡單封裝與Logging應用】

一、關鍵字驅動--設計框架的常用的思路 封裝的作用:在編程中,封裝一個方法(函數)主要有以下幾個作用:1. **代碼重用**:通過封裝重復使用的代碼到一個方法中,你可以在多個地方調用這個方法而不是…

C++貪心算法(3)

整數區間 #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int a[110][10]{0};for(int i0;i<n;i){cin>>a[i][1]>>a[i][2];}int cnt[110]{0};int mi99999;int mii-1;bool f[110]{false,false,false,false,false,false,false,…

debian讓dotnet 程序以守護進程方式運行,如果意外退出主動開啟

創建服務文件: 打開一個新的.service文件在/etc/systemd/system/目錄下&#xff0c;例如myapp.service sudo nano /etc/systemd/system/myapp.service編輯服務文件: 添加以下內容到myapp.service文件&#xff0c;確保修改ExecStart以指向你的.NET Core應用程序的可執行文件&am…

JVM-調優之-高內存占用問題排查

排查思路 1&#xff09;檢查jvm內存的分配情況 2&#xff09;檢查jvm的gc情況 3&#xff09; 找出占用量比較大的對象 第一步&#xff1a;jmap -heap PID 查看jvm內存使用情況 jmap -heap 2525 可以看到老年代年輕代等其他內存區域內存使用率百分比 第二步&#xff1a;jsta…

Golang:使用roylee0704/gron實現定時任務

可以使用roylee0704/gron實現定時任務 文檔 https://github.com/roylee0704/gronhttps://pkg.go.dev/github.com/roylee0704/gron 安裝 go get github.com/roylee0704/gron代碼示例 package mainimport ("fmt""time""github.com/roylee0704/gron…

如何用分立器件設計一個過流保護電路

過流保護電路是指當后級負載電流過大或者發生短路時&#xff0c;自動切斷電源與后級負載&#xff0c;從而防止大電流損害電源電路&#xff0c;過流保護又叫OCP。 常見的過流保護電路有保險絲過流保護&#xff0c;集成的過流保護芯片&#xff0c;還有這種分立器件搭建的過流保護…

Browserify:將 Node.js 模塊轉換為瀏覽器可用的 JavaScript

什么是 Browserify&#xff1f; Browserify 是一個 JavaScript 工具&#xff0c;用于將 Node.js 模塊轉換為在瀏覽器環境中可用的單個 JavaScript 文件。通過 Browserify&#xff0c;您可以使用 require() 函數引入其他模塊&#xff0c;就像在 Node.js 中一樣&#xff0c;而不…

詳解 Scala 的隱式轉換

當編譯器第一次編譯失敗的時候&#xff0c;會在當前的環境中查找能讓代碼編譯通過的方法&#xff0c;用于將某個類型進行轉換&#xff0c;實現二次編譯通過 一、隱式函數 隱式函數可以在不修改任何代碼的情況下&#xff0c;擴展某個類的功能 /**聲明語法&#xff1a;implicit d…

Ubuntu上安裝Maven

在Ubuntu上安裝Maven的步驟如下&#xff1a; 更新包索引&#xff1a; sudo apt update 安裝Maven&#xff1a; sudo apt install maven 驗證安裝是否成功&#xff1a; mvn -version 以上步驟將會安裝Maven并添加到系統路徑中&#xff0c;你可以通過運行mvn -version來驗…

TIM輸出比較

一、OC&#xff08;Output Compare&#xff09;輸出比較 1、輸出比較可以通過比較CNT&#xff08;計數器&#xff09;與CCR&#xff08;捕獲/比較寄存器&#xff09;寄存器值的關系&#xff0c;來對輸出電平進行置1、置0或翻轉的操作&#xff0c;用于輸出一定頻率和占空比的PW…

微信小程序連接阿里云快速入門【物聯網】

一、前言 1.1 項目背景 隨著5G的逐漸普及&#xff0c;萬物互聯的浪潮已經席卷而來。在萬物互聯的場景下&#xff0c;如何實現設備之間的互聯互通&#xff0c;成為了一個亟待解決的問題。 微信小程序作為一款輕量級的小程序開發框架&#xff0c;以其簡潔的語法和豐富的組件庫…

08、SpringBoot 源碼分析 - 自動配置深度分析一

SpringBoot 源碼分析 - 自動配置深度分析一 refresh和自動配置大致流程如何自動配置SpringBootApplication注解EnableAutoConfiguration注解AutoConfigurationImportSelector自動配置導入選擇器DeferredImportSelectorHandler的handleDeferredImportSelectorGroupingHandler的r…

【學習筆記】C++每日一記[20240520]

簡述幾種內存泄漏的預防機制 用智能指針代替普通指針&#xff0c;由于智能指針自帶引用計數功能&#xff0c;能夠記錄動態分配空間的引用數量&#xff0c;在引用計數為零時&#xff0c;自動調用析構函數釋放空間。 借助一些內存泄漏檢測工具&#xff0c;例如Valgrind、Memche…

DNS 解析過程

文章目錄 簡介特點查詢方式??1. 瀏覽器緩存2. 系統緩存&#xff08;hosts文件&#xff09;3. 路由器緩存4. 本地域名服務器5. 根域名服務器6. 頂級域名服務器7. 權限域名服務器8. 本地域名服務器緩存并返回9. 操作系統緩存并返回10. 瀏覽器緩存并訪問流程圖 總結 簡介 DNS&a…

Enable Full Line suggestions 啟用全行建議

開啟后效果如下&#xff1a; 直接提示可能要輸入的參數

基于 Solana 的 Drift Protocol 快速崛起,重新定義去中心化衍生品市場

隨著區塊鏈技術的快速發展&#xff0c;加密市場的格局正在悄然改變。投資者對透明度、效率和去中心化的需求愈發強烈&#xff0c;之前完全由中心化交易主導的加密貨幣交易&#xff0c;開始向鏈上轉移。 根據 Coingecko 的最新數據&#xff0c;CEX 和 DEX 的現貨交易量已經達到了…

WWW24因果論文(3/8) |通過因果干預實現圖分布外泛化

【摘要】由于圖神經網絡 (GNN) 通常會隨著分布變化而出現性能下降&#xff0c;因此分布外 (OOD) 泛化在圖學習中引起了越來越多的關注。挑戰在于&#xff0c;圖上的分布變化涉及節點之間錯綜復雜的互連&#xff0c;并且數據中通常不存在環境標簽。在本文中&#xff0c;我們采用…

系統開發與運行知識

系統開發與運行知識 導航 文章目錄 系統開發與運行知識導航一、軟件工程二、軟件生命周期三、開發模型四、開發方法五、需求分析結構化分析 六、數據流圖分層數據流圖的畫法設計注意事項 七、數據字典數據字典的內容 八、系統設計九、結構化設計常用工具十、面向對象十一、UML…

C++中Lambda表達式的使用場景

Lambda表達式在C中有許多常用的使用場景&#xff0c;下面舉例說明幾個常見的場景&#xff1a; STL算法中的自定義比較器&#xff1a;在使用STL算法時&#xff0c;有時需要自定義比較器來指定元素的排序規則。Lambda表達式可以方便地定義簡單的比較器&#xff0c;例如在std::so…