91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入探討 Hilt的工作原理

谷歌開發(fā)者 ? 來源:Android開發(fā)者 ? 作者:Android ? 2021-10-19 15:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

所涉主題

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

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

Hilt 使用注解處理器生成代碼。對注解的處理發(fā)生在編譯器將源文件轉(zhuǎn)換為 Java 字節(jié)碼期間。顧名思義,注解處理器作用于源文件中的注解。注解處理器通常會檢查注解,并根據(jù)注解類型來執(zhí)行不同的任務(wù),例如代碼檢查或生成新文件。 在 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 插件為您提供的語法糖。接下來我們將探討更多關(guān)于 Gradle 插件的內(nèi)容,在此之前,我們先來看看這個例子在沒有語法糖的情況下應(yīng)該是什么樣子的。
@AndroidEntryPoint(AppCompatActivity::class)class PlayActivity : Hilt_PlayActivity() {
  @Inject lateinit var player: MusicPlayer
  // ...}

現(xiàn)在,我們看到原始基類 AppCompatActivityAndroidEntryPoint 注解的真實入?yún)ⅰ?/span>PlayActivity 實際上繼承了生成的類 Hilt_PlayActivity,該類由 Hilt 注解處理器生成,并包含所有執(zhí)行注入操作需要的邏輯。針對上述內(nèi)容生成的基類,其代碼簡化示例如下:

@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 注解的類。這使得注入操作可以在任何您需要的基類中執(zhí)行。

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

在 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 應(yīng)用中使用過 Dagger (不通過 Hilt),您可能會熟悉這些直接在組件上編寫的注入方法。

@InstallIn

InstallIn 用于表明模塊或者入口點應(yīng)該被裝載到哪個組件中。在如下示例中,我們將 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,應(yīng)用中任何傳遞依賴項內(nèi)都可以提供模塊和入口點。然而,部分情況下我們需要收集所有由InstallIn 注解提供的內(nèi)容以獲取每個組件的完整模塊和入口點。 Hilt 在特定的包下生成了元數(shù)據(jù)注解,以便更輕松地收集和發(fā)現(xiàn)這些由 InstallIn 注解所提供的內(nèi)容。生成的注解格式如下:
package hilt_metadata
@Generated("dagger.hilt.InstallInProcessor")@Metadata(my.database.MusicDatabaseModule::class)classMusicDatabaseModule_Metadata{}

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

HiltAndroidApp

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

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

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

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

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

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

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

這是一篇關(guān)于 Hilt 的文章,我們就不詳細(xì)介紹 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 插件

現(xiàn)在您已經(jīng)了解了 Hilt 中代碼生成的工作原理,接下來讓我們看看 Hilt Gradle 插件。Hilt Gradle 插件執(zhí)行很多有用的任務(wù),包括字節(jié)碼改寫和類路徑聚合。
  • Hilt Gradle 插件

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

字節(jié)碼改寫

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

為了說明我們?yōu)楹卧?Hilt 中使用字節(jié)碼改寫,讓我們回到 @AndroidEntryPoint。

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

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

然而,字節(jié)碼改寫仍有一些缺點:

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

  • 因為在改寫操作時字節(jié)碼已經(jīng)被編譯,所以問題通常出現(xiàn)在運行時而不是編譯時。

  • 改寫操作使調(diào)試變得復(fù)雜,因為當(dāng)出現(xiàn)問題時,源文件可能并不代表當(dāng)前正在執(zhí)行的字節(jié)碼。


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

類路徑聚合

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

    關(guān)注

    68

    文章

    20255

    瀏覽量

    252273
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2371

    瀏覽量

    66772
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73965

原文標(biāo)題:Hilt 工作原理 | MAD Skills

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入解析AD8367S可變增益放大器:特性、應(yīng)用與設(shè)計要點

    都能穩(wěn)定工作。今天,我們將深入探討Analog Devices公司的AD8367S可變增益放大器,詳細(xì)介紹其特性、工作原理、應(yīng)用場景以及設(shè)計過程中的注意事項。 文件下載: AD8367S.pdf 一、產(chǎn)品概述 AD8367S是一
    的頭像 發(fā)表于 01-14 16:45 ?557次閱讀

    鋰電池制造關(guān)鍵:深入探討輥壓工藝的核心參數(shù)

    本文深入探討了輥壓工藝中設(shè)備變量、工藝參數(shù)與材料屬性之間的量化關(guān)系,特別是針對工藝放大和設(shè)備轉(zhuǎn)移時的參數(shù)設(shè)定提供了理論依據(jù)。盡管原文主要基于顆粒力學(xué)模型,其核心原理對于鋰電行業(yè)中的干法造粒及極片輥壓
    的頭像 發(fā)表于 01-13 18:03 ?307次閱讀
    鋰電池制造關(guān)鍵:<b class='flag-5'>深入探討</b>輥壓工藝的核心參數(shù)

    深入探討PCB布局布線的專業(yè)設(shè)計要點與常見挑戰(zhàn)

    本文深入探討PCB布局布線的專業(yè)設(shè)計要點與常見挑戰(zhàn),并介紹上海創(chuàng)馨科技如何憑借資深團隊與豐富經(jīng)驗,為客戶提供從精密布局、優(yōu)化布線到生產(chǎn)制造的一站式高可靠性PCB解決方案。
    的頭像 發(fā)表于 01-04 15:29 ?252次閱讀

    雷擊浪涌發(fā)生器的原理、基本構(gòu)造與工作流程以及作用

    雷擊浪涌發(fā)生器,作為防雷測試與研究領(lǐng)域的重要工具,其設(shè)計與應(yīng)用充分體現(xiàn)了對自然雷電現(xiàn)象的模擬與利用。本文將深入探討雷擊浪涌發(fā)生器的工作原理、核心作用及其在現(xiàn)代防雷技術(shù)發(fā)展中的重要地位。
    的頭像 發(fā)表于 12-15 09:18 ?558次閱讀
    雷擊浪涌發(fā)生器的原理、基本構(gòu)造與<b class='flag-5'>工作</b>流程以及作用

    深入解析 onsemi NVHL060N065SC1 N 溝道 MOSFET

    在電子工程師的日常設(shè)計工作中,MOSFET 是不可或缺的重要元件。今天,我們就來深入探討 onsemi 推出的 NVHL060N065SC1 N 溝道 MOSFET,看看它有哪些獨特的性能和應(yīng)用特點。
    的頭像 發(fā)表于 12-01 09:28 ?597次閱讀
    <b class='flag-5'>深入</b>解析 onsemi NVHL060N065SC1 N 溝道 MOSFET

    三相電源防雷器的作用、工作原理及實際應(yīng)用中的考慮因素

    ,作為電力防護(hù)體系中的關(guān)鍵組件,承擔(dān)著保護(hù)三相交流電源系統(tǒng)免受雷電侵襲的重任。本文將深入探討三相電源防雷器的作用、工作原理及其在現(xiàn)代防雷技術(shù)中的應(yīng)用價值。
    的頭像 發(fā)表于 11-26 13:42 ?509次閱讀

    信號發(fā)生器的構(gòu)成和工作原理

    信號發(fā)生器作為現(xiàn)代電子測試與測量領(lǐng)域中的關(guān)鍵設(shè)備,其精密的構(gòu)造和巧妙的工作原理使之能夠產(chǎn)生各種所需的電信號。本文將深入探討信號發(fā)生器的構(gòu)成及其工作原理,以幫助讀者更好地理解這一重要電子設(shè)備
    的頭像 發(fā)表于 11-13 11:45 ?396次閱讀
    信號發(fā)生器的構(gòu)成和<b class='flag-5'>工作原理</b>

    興感半導(dǎo)體角度磁編碼器的工作原理和技術(shù)優(yōu)勢

    在現(xiàn)代工業(yè)控制及自動化、機器人技術(shù)和精密測量領(lǐng)域,角度磁編碼器作為一種關(guān)鍵傳感器,其核心性能直接影響著系統(tǒng)的精度與可靠性。隨著技術(shù)的不斷進(jìn)步,角度磁編碼器在多個領(lǐng)域的應(yīng)用越來越廣泛,本文將深入探討工作原理、技術(shù)優(yōu)勢以及在工業(yè)控制及自動化的應(yīng)用。
    的頭像 發(fā)表于 10-30 11:22 ?2975次閱讀
    興感半導(dǎo)體角度磁編碼器的<b class='flag-5'>工作原理</b>和技術(shù)優(yōu)勢

    為數(shù)據(jù)中心保駕護(hù)航:UPS電源的工作原理與選型指南

    (不間斷電源)系統(tǒng)正是保障業(yè)務(wù)連續(xù)性的關(guān)鍵防線。本文將深入探討UPS電源的工作原理、技術(shù)特點、應(yīng)用場景及選型要點,幫助數(shù)據(jù)中心管理者做出更明智的決策。一、UPS電源工作原理:不止是備用
    的頭像 發(fā)表于 09-05 11:34 ?1297次閱讀
    為數(shù)據(jù)中心保駕護(hù)航:UPS電源的<b class='flag-5'>工作原理</b>與選型指南

    一文了解Arm神經(jīng)超級采樣 (Arm Neural Super Sampling, Arm NSS) 深入探索架構(gòu)、訓(xùn)練和推理

    本文將從訓(xùn)練、網(wǎng)絡(luò)架構(gòu)到后處理和推理等方面,深入探討 Arm 神經(jīng)超級采樣 (Arm Neural Super Sampling, Arm NSS) 的工作原理,希望為機器學(xué)習(xí) (ML) 工程師和移動端圖形開發(fā)者來詳細(xì)解釋 Arm NSS 的運行機制,及其如何在移動端硬件
    的頭像 發(fā)表于 08-14 16:11 ?3038次閱讀

    工業(yè)化超聲波清洗設(shè)備的工作原理與實際應(yīng)用

    行業(yè)對高品質(zhì)清洗技術(shù)的強烈需求。用戶在選擇設(shè)備時,常常關(guān)注“工業(yè)超聲波清洗設(shè)備工作原理”、“工業(yè)超聲波清洗優(yōu)勢”及“實際應(yīng)用場景”這類長尾關(guān)鍵詞。本文將深入探討
    的頭像 發(fā)表于 08-04 17:07 ?1208次閱讀
    工業(yè)化超聲波清洗設(shè)備的<b class='flag-5'>工作原理</b>與實際應(yīng)用

    超聲波清洗機的工作原理和清洗技術(shù)特點是什么?

    超聲波清洗機的工作原理和清洗技術(shù)特點超聲波清洗機是一種高效的清洗設(shè)備,廣泛應(yīng)用于各個工業(yè)領(lǐng)域。本文將深入探討超聲波清洗機的工作原理以及其清洗技術(shù)特點,以幫助讀者更好地了解這一先進(jìn)的清洗技術(shù)。目錄1.
    的頭像 發(fā)表于 06-27 15:54 ?1331次閱讀
    超聲波清洗機的<b class='flag-5'>工作原理</b>和清洗技術(shù)特點是什么?

    超聲波清洗機的工作原理與操作步驟詳解

    的污垢”乖乖撤退。從珠寶到工具,甚至是一些精密器件,超聲波清洗機都是你最值得信賴的助手。在這篇文章中,我們將深入探討這神奇設(shè)備的工作原理與具體操作步驟,讓它給你的家庭
    的頭像 發(fā)表于 04-25 17:09 ?1525次閱讀
    超聲波清洗機的<b class='flag-5'>工作原理</b>與操作步驟詳解

    光學(xué)傳感器的工作原理與應(yīng)用

    的疾病診斷,光學(xué)傳感器的應(yīng)用遍布生活的每一個角落。本文將帶你深入了解光學(xué)傳感器的工作原理、分類、應(yīng)用及其未來的發(fā)展趨勢。 光學(xué)傳感器的工作原理 光學(xué)傳感器的工作原理基于光學(xué)效應(yīng),即當(dāng)光
    的頭像 發(fā)表于 04-15 18:24 ?1813次閱讀

    LDO的工作原理、特性、應(yīng)用場景詳解

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