在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入探討 Hilt的工作原理

谷歌開發者 ? 來源:Android開發者 ? 作者:Android ? 2021-10-19 15:11 ? 次閱讀
所涉主題

  • 多種 Hilt 注解協同工作并生成代碼的方式。
  • 當 Hilt 配合 Gradle 使用,Hilt Gradle 插件如何在幕后工作以改善整體體驗。

多種 Hilt 注解協同工作并生成代碼的方式

Hilt 使用注解處理器生成代碼。對注解的處理發生在編譯器將源文件轉換為 Java 字節碼期間。顧名思義,注解處理器作用于源文件中的注解。注解處理器通常會檢查注解,并根據注解類型來執行不同的任務,例如代碼檢查或生成新文件。 在 Hilt 中,三個最重要的注解就是:@AndroidEntryPoint@InstallIn 以及 @HiltAndroidApp
  • @AndroidEntryPoint
    https://dagger.dev/api/latest/dagger/hilt/android/AndroidEntryPoint.html

  • @InstallIn
    https://dagger.dev/api/latest/dagger/hilt/InstallIn.html

  • @HiltAndroidApp
    https://dagger.dev/api/latest/dagger/hilt/android/HiltAndroidApp.html

@AndroidEntryPoint

AndroidEntryPoint 在您的 Android 類中啟用字段注入,例如 Activity、Fragment、View 以及 Service。

  • AndroidEntryPoint
    https://dagger.dev/api/latest/dagger/hilt/android/AndroidEntryPoint.html

如下示例所示,通過向 PlayActivity 添加 AndroidEntryPoint 注解,即可輕松將 MusicPlayer 注入到我們的 Activity 中。
@AndroidEntryPointclass PlayActivity : AppCompatActivity() {
  @Inject lateinit var player: MusicPlayer
  // ...}

如果您使用 Gradle,您可能熟悉上文所述的簡化語法。但這并不是真實的語法,而是 Hilt Gradle 插件為您提供的語法糖。接下來我們將探討更多關于 Gradle 插件的內容,在此之前,我們先來看看這個例子在沒有語法糖的情況下應該是什么樣子的。
@AndroidEntryPoint(AppCompatActivity::class)class PlayActivity : Hilt_PlayActivity() {
  @Inject lateinit var player: MusicPlayer
  // ...}

現在,我們看到原始基類 AppCompatActivityAndroidEntryPoint 注解的真實入參。PlayActivity 實際上繼承了生成的類 Hilt_PlayActivity,該類由 Hilt 注解處理器生成,并包含所有執行注入操作需要的邏輯。針對上述內容生成的基類,其代碼簡化示例如下:

@Generated("dagger.hilt.AndroidEntryPointProcessor")class Hilt_PlayActivity : AppCompatActivity {
  override fun onCreate() {    inject()    super.onCreate()  }
  private fun inject() {    EntryPoints.get(this, PlayActivity_Injector::class).inject(this as PlayActivity);  }}
  • AppCompatActivity
    https://developer.android.google.cn/reference/androidx/appcompat/app/AppCompatActivity

在示例中,生成的類繼承自 AppCompatActivity。然而,通常情況下生成的類會繼承傳入 AndroidEntryPoint 注解的類。這使得注入操作可以在任何您需要的基類中執行。

生成類的主要目的是處理注入操作。為了避免字段在注入之前被意外訪問,有必要盡可能早地執行注入操作。因此,對于 Activity,注入操作在 onCreate 中被執行。

在 inject 方法中,我們首先需要一個注入器的實例——PlayActivity_Injector。在 Hilt 中,對于 Activity,注入器是一個入口點,我們可以使用 EntryPoints 工具類獲得一個注入器的實例。

您可能想到了,PlayActivity_Injector 也是由 Hilt 注解處理器生成的。格式如下:

@Generated("dagger.hilt.AndroidEntryPointProcessor")@EntryPoint@InstallIn(ActivityComponent::class)interface PlayActivity_Injector {
  fun inject(activity: PlayActivity)
}

生成的注入器是一個被裝載到 ActivityComponent 的 Hilt 入口點。它僅包含一個讓我們注入 PlayActivity 實例的方法。如果您曾在 Android 應用中使用過 Dagger (不通過 Hilt),您可能會熟悉這些直接在組件上編寫的注入方法。

@InstallIn

InstallIn 用于表明模塊或者入口點應該被裝載到哪個組件中。在如下示例中,我們將 MusicDataBaseModule 裝載到 SingletonComponent 中:
@Module@InstallIn(SingletonComponent::class)object MusicDatabaseModule {  // ...}

  • InstallIn
    https://dagger.dev/api/latest/dagger/hilt/InstallIn.html

  • SingletonComponent
    https://dagger.dev/api/latest/dagger/hilt/components/SingletonComponent.html

通過 InstallIn,應用中任何傳遞依賴項內都可以提供模塊和入口點。然而,部分情況下我們需要收集所有由InstallIn 注解提供的內容以獲取每個組件的完整模塊和入口點。 Hilt 在特定的包下生成了元數據注解,以便更輕松地收集和發現這些由 InstallIn 注解所提供的內容。生成的注解格式如下:
package hilt_metadata
@Generated("dagger.hilt.InstallInProcessor")@Metadata(my.database.MusicDatabaseModule::class)classMusicDatabaseModule_Metadata{}

通過將元數據放進特定的包下,Hilt 注解處理器可以輕松地在您應用中所有的傳遞依賴項中找到生成的元數據。至此,我們可以使用元數據注解中所包含的信息來找到由 InstallIn 注解所提供內容的自身引用。在本示例中指的是 MusicDatabaseModule

HiltAndroidApp

最后,HiltAndroidApp 注解可以讓您的 Android Application 類啟用注入。此處,您可以將其視為與 AndroidEntryPoint 注解完全相同。第一步,開發者僅需在 Application 類上添加 @HiltAndroidApp 注解。
@HiltAndroidAppclass MusicApp : Application {
  @Inject lateinit var store: MusicStore
}

  • HiltAndroidApp
    https://dagger.dev/api/latest/dagger/hilt/android/HiltAndroidApp.html

然而,HiltAndroidApp 還有另外一個重要的作用——生成 Dagger 組件。

當 Hilt 注解處理器遇到 @HiltAndroidApp 注解時,會在包裝類中生成一些列組件,該包裝類與 Application 類同名,前綴為 HiltComponents_。如果您之前使用過 Dagger,這些組件就是添加了 @Component@Subcomponent 注解的類,而在 Dagger 中通常需要您手動編寫。

a1b92714-30aa-11ec-82a8-dac502259ad0.png

為了生成這些組件,Hilt 在上述元數據包中查找所有被添加 @InstallIn 注解的類。添加了 @InstallIn 注解的模塊被放置在相應組件聲明的模塊列表中。添加了 @InstallIn 注解的入口點被放置在聲明相應組件的父類型的位置。

從這里開始,Dagger 處理器接管并根據 @Component@Subcomponent 注解生成組件的具體實現。如果您曾使用過 Dagger (不通過 Hilt),那么大概率您已經直接處理了這些類。但是,Hilt 對開發者隱藏了這種復雜操作。

這是一篇關于 Hilt 的文章,我們就不詳細介紹 Dagger 生成的代碼了。如果您有興趣,詳情請查閱:

  • Ron Shapiro 和 David Baker 的演講:

    https://www.youtube.com/watch?v=wCvXe2LsN5o

  • Dagger codegen 101 的備忘單:

    https://medium.com/androiddevelopers/dagger-code-generation-cheat-sheets-6b4fa2da4e7a

Hilt Gradle 插件

現在您已經了解了 Hilt 中代碼生成的工作原理,接下來讓我們看看 Hilt Gradle 插件。Hilt Gradle 插件執行很多有用的任務,包括字節碼改寫和類路徑聚合。
  • Hilt Gradle 插件

    https://dagger.dev/hilt/gradle-setup#hilt-gradle-plugin

字節碼改寫

顧名思義,字節碼改寫就是改寫字節碼的過程。與注解處理只能生成新代碼不同,字節碼改寫可以修改現有代碼。如果謹慎使用,這將是非常強大的功能。

為了說明我們為何在 Hilt 中使用字節碼改寫,讓我們回到 @AndroidEntryPoint

@AndroidEntryPoint(AppCompatActivity::class)class PlayActivity : Hilt_PlayActivity {
  override fun onCreate(…) {    val welcome = findViewById(R.id.welcome)  }
}
雖然繼承 Hilt_PlayActivity 基類在實踐中有效,但它可能會導致 IDE 報錯。由于生成的類在您成功編譯代碼后才存在,因此您經常會在 IDE 中看到紅色波浪線。此外,您將無法享有諸如方法重載這種自動補全的能力,并且您將無法訪問基類中的方法。 失去這些功能不僅會降低您的編碼速度,而且這些紅色波浪線也會極大程度地分散您的注意力。 Hilt Android 插件通過在您的類上添加 AndroidEntryPoint 注解來啟動字節碼改寫。啟用 Hilt Android 插件后,您只需要在類上添加 @AndroidEntryPoint 注解,同時您可以使其繼承普通的基類。
@AndroidEntryPointclass PlayActivity : AppCompatActivity { // <-- 無需引用生成的基類
  override fun onCreate() {    val welcome = findViewById(R.id.welcome)  }}

由于此語法無需引用生成的基類,所以不會引起 IDE 報錯。在字節碼改寫期間,Hilt Gradle 插件會將您的基類替換為 Hilt_PlayActivity。由于此過程直接操作字節碼,對開發者是不可見的。

然而,字節碼改寫仍有一些缺點:

  • 該插件必須修改底層字節碼,而不是源代碼,這容易出錯。

  • 因為在改寫操作時字節碼已經被編譯,所以問題通常出現在運行時而不是編譯時。

  • 改寫操作使調試變得復雜,因為當出現問題時,源文件可能并不代表當前正在執行的字節碼。


由于這些原因,Hilt 嘗試盡可能減少依賴字節碼改寫。

類路徑聚合

最后,讓我們看看 Hilt Gradle 插件的另一個有用功能: 類路徑聚合。要了解什么是類路徑聚合,以及為什么需要它,讓我們看另一個示例。

在本示例中 :app 依賴一個獨立的 Gradle 模塊 :database:app:database 都提供了被 InstallIn 注解的模塊。

如您所見,Hilt 會在特定的 hilt_metadata 包下生成元數據,在生成組件時,會用它們查找所有被添加 @InstallIn 注解的模塊。

不使用類路徑聚合的處理對于單層依賴關系仍然可以正常工作,現在讓我們看看當添加另一個 Gradle 模塊 :cache 作為 :database 的依賴項時會發生什么。

:cache 被編譯時,雖然它會生成元數據,但在編譯 :app 時該元數據無法使用,因為它是一個傳遞依賴項。因此,Hilt 無法知曉 CacheModule,它會意外地從生成的組件中排除。 當然,您可以使用 api 而不是 implementation 聲明 :cache 的依賴關系,從而在技術層面解決這個問題,但不推薦這樣做。使用 api 不僅會讓增量構建變得更糟糕,還把維護工作也變成一場噩夢。 這就是 Hilt Gradle 插件發揮作用的地方。

即使使用 implementation,Hilt Gradle 插件也可以自動從 :app 的傳遞依賴項中聚合所有的類。

此外,與直接使用 api 相比,Hilt Gradle 插件還具有許多優點。

首先,對比在整個應用中手動使用 api 依賴關系,類路徑聚合更不容易出錯并且不需要維護。您可以像往常一樣簡單地使用 implementation,其余的將由 Hilt Gradle 插件處理。

其次,Hilt Gradle 插件僅在應用級別聚合類,因此與使用 api 不同,項目中庫的編譯不受影響。

最后,類路徑聚合為您的依賴項提供了更好的封裝,因為不可能在源文件中意外引用這些類,并且它們不會出現在代碼補全提示中。

總結

本文我們揭示了各種 Hilt 注解協同工作以生成代碼的方式。 我們還關注了 Hilt Gradle 插件,并了解它是如何在幕后使用字節碼改寫和類路徑聚合,讓 Hilt 的使用變得更安全、更輕松。
編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19833

    瀏覽量

    233958
  • API
    API
    +關注

    關注

    2

    文章

    1566

    瀏覽量

    63669
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70370

原文標題:Hilt 工作原理 | MAD Skills

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    LDO的工作原理、特性、應用場景詳解

    在現代電子設備的復雜電路系統中,穩定、高效的電源供應至關重要。LDO,即低壓差線性穩壓器(Low Dropout Regulator),作為電源管理領域的關鍵元件,發揮著不可或缺的作用。本文將深入探討 LDO 的工作原理、特性、應用場景。
    的頭像 發表于 03-14 18:09 ?2173次閱讀

    氣體傳感器工作原理及分類

    氣體傳感器作為現代科技的重要組成部分,廣泛應用于環境監測、工業安全、醫療健康等多個領域。它們能夠精確檢測各種氣體的濃度,為預警、控制和處理潛在危險提供關鍵數據。本文將深入探討氣體傳感器的工作原理及其
    的頭像 發表于 02-23 17:52 ?855次閱讀

    深入探討DeepSeek大模型的核心技術

    導讀 本文深入探討了DeepSeek大模型的核心技術,從公司背景、模型能力、訓推成本到核心技術細節進行了全面分析。 ? 一、關于DeepSeek公司及其大模型 1.1 公司概況 DeepSeek
    的頭像 發表于 02-10 10:49 ?1299次閱讀
    <b class='flag-5'>深入探討</b>DeepSeek大模型的核心技術

    鎖存器的工作原理與作用

    鎖存器(Latch)作為數字電路中的基本元件,扮演著存儲單個比特信息的關鍵角色。其獨特的功能和廣泛的應用領域使其成為數字電路設計和實現的核心組成部分。本文將深入探討鎖存器的基本概念、工作原理、類型、主要作用以及應用領域,以期為相關領域的技術人員提供全面而
    的頭像 發表于 02-03 16:53 ?2111次閱讀

    干簧管傳感器可以檢測什么,干簧管傳感器工作原理

    干簧管傳感器,作為一種基于磁場感應原理的開關型傳感器,在現代電子設備、自動化控制系統以及安全監測領域中扮演著至關重要的角色。本文將深入探討干簧管傳感器的工作原理、結構特點、應用領域以及其在各種場景下的技術優勢。
    的頭像 發表于 01-30 15:35 ?1057次閱讀

    無線收發器工作原理,無線收發器怎么使用

    無線收發器作為現代通信技術的重要組成部分,廣泛應用于各個領域,包括無線通信、物聯網、遠程控制和無線傳感器網絡等。本文將深入探討無線收發器的工作原理,同時提供詳細的使用方法。
    的頭像 發表于 01-29 15:31 ?1246次閱讀

    相位測量儀工作原理,相位測量儀怎么使用

    相位測量儀作為電子測量領域的重要工具,廣泛應用于電力、通信、自動化控制等多個行業。它通過精確測量電壓、電流等信號之間的相位關系,為工程師和技術人員提供了關鍵的數據支持。本文旨在深入探討相位測量儀的工作原理,并詳細介紹其使用方法。
    的頭像 發表于 01-29 15:07 ?1880次閱讀

    深入探討Linux系統中的動態鏈接庫機制

    異常或崩潰。為深入理解動態鏈接機制及其工作原理,我重溫了《程序員的自我修養》,并通過實踐演示與反匯編分析,了解了動態鏈接的過程。 本文將深入探討Linux系統中的動態鏈接庫機制,這其中包括但不限于全局符號介入(Global Sy
    的頭像 發表于 12-18 10:06 ?548次閱讀
    <b class='flag-5'>深入探討</b>Linux系統中的動態鏈接庫機制

    得瑞領新亮相IDC中國年度峰會,深入探討NVMe SSD助力金融行業數字化轉型

    在2024 IDC中國年度峰會上,得瑞領新展示了其企業級存儲解決方案,并通過主題演講深入探討了NVMe SSD在金融行業數字化轉型中的高效應用和技術創新。
    的頭像 發表于 09-18 14:52 ?486次閱讀
    得瑞領新亮相IDC中國年度峰會,<b class='flag-5'>深入探討</b>NVMe SSD助力金融行業數字化轉型

    光耦合器的工作原理

    光耦合器 ,也被稱為光隔離器,幾十年來一直是電子學的重要組件,為信號隔離提供了關鍵功能。它們廣泛應用于各個行業,包括工業自動化和消費電子產品中,確保系統不同部分之間的電氣隔離,這對安全性和性能至關重要。本文將深入探討光耦合器的結構、工作原理及其應用。
    的頭像 發表于 09-04 17:44 ?994次閱讀
    光耦合器的<b class='flag-5'>工作原理</b>

    LLC電源轉換器的工作頻率

    LLC電源轉換器的工作頻率是一個關鍵參數,它直接影響到變換器的性能、效率和穩定性。然而,要詳細闡述LLC電源轉換器的工作頻率,需要深入探討工作原理、設計考慮、實際應用以及技術挑戰等多
    的頭像 發表于 08-20 17:19 ?2080次閱讀

    SPWM逆變器的基本工作原理

    在現代電力電子技術領域,正弦脈寬調制(SPWM)逆變器因其卓越的性能和靈活性而廣泛應用于變頻調速系統中。本文旨在深入探討SPWM逆變器的工作原理、特點。 一、SPWM逆變器的基本特征 SPWM逆變器
    的頭像 發表于 08-20 16:55 ?3768次閱讀
    SPWM逆變器的基本<b class='flag-5'>工作原理</b>

    SIM卡座帶卡托的工作原理及使用特點

    深入探討SIM卡座帶卡托的工作原理之前,我們先來簡要了解一下SIM卡座在現代智能設備中的重要作用。SIM卡座,作為連接手機與SIM卡的重要橋梁,不僅負責固定SIM卡,還確保手機能夠正常接收信號并
    的頭像 發表于 08-20 15:15 ?2518次閱讀
    SIM卡座帶卡托的<b class='flag-5'>工作原理</b>及使用特點

    深入剖析測速傳感器:工作原理、種類及應用領域

    的速度信息,為各種應用場景提供了關鍵數據支持。本文將深入探討測速傳感器的工作原理、種類及其在各領域的應用。 測速傳感器的工 作原理 測速傳感器的工作原理多種多樣,但核心目標都是將物體的速度信息轉化為可測量的電信號
    的頭像 發表于 08-15 18:20 ?2142次閱讀

    深入探討Linux的進程調度器

    ,以及其運行的順序。這篇文章將詳細探討Linux進程調度器的工作原理、主要算法、調度策略以及其在實際操作中的應用。
    的頭像 發表于 08-13 13:36 ?1228次閱讀
    <b class='flag-5'>深入探討</b>Linux的進程調度器
    主站蜘蛛池模板: 女人扒开腿让男人桶到爽 | 天堂中文在线网 | 男女交黄| 久久本道综合色狠狠五月 | 亚洲youjizz| 又大又粗进出白浆直流动态图 | 黄网站在线观看永久免费 | 特级黄 | 人人澡人人人人夜夜爽 | 日日夜夜操天天干 | 中文字幕一精品亚洲无线一区 | 一级特黄性生活大片免费观看 | 色5566| 欧美爽爽爽爽爽爽视频 | 不卡一区二区在线观看 | 色麒麟影院| 四虎comwww最新地址 | 亚洲 欧美 自拍 另类 欧美 | 韩国在线a免费观看网站 | 在线成人免费 | 日本免费黄色录像 | 手机看片福利盒子久久 | 国产精品久久在线观看 | 日本不卡在线观看 | 99久久精品费精品国产一区二区 | 老湿成人影院 | 手机在线免费视频 | 五月亭亭六月丁香 | 日韩色爱| 人人玩人人添天天爽 | 毛片的网站 | 久久国产精品自在自线 | 欧美一级特黄啪啪片免费看 | 欧美123区 | 扒开末成年粉嫩的小缝强文 | 爽好舒服快给老师 | 天天射干 | 日本一区二区精品88 | 222.www免费观看| 免费视频性 | 美女骚网站 |