In the previous chapters, you learned about multibinding with Sets and Maps to improve the architecture of the Information Plugin Framework. With that information, you can add new features to the Busso App in an easy, pluggable and declarative way.
You’ve vastly improved Busso’s architecture, but there’s still room to make it even better. For instance, all the code is currently in the main app module. It would be nice to split that code into different modules to reduce the building time of your app while increasing its reusability and extensibility. But how can you do that with Dagger? Is it even possible?
The answer, of course, is yes! In this chapter, you’ll refactor the Busso App by moving some of the code from the main app module to other modules and changing the Dagger configuration accordingly.
Note: In this chapter, you’ll read the name module many times, referring to either the Gradle Module or the Dagger Module. To make everything clear, this chapter will refer to Gradle Modules as modules and Dagger Modules as @Modules.
What is modularization?
Modularization is the process of splitting the code and resources of your app into separate, smaller modules — in this case, Gradle modules. You can think of a Gradle module as a way to encapsulate code and resources. This makes it simpler to create a single library that you either use locally or publish in a repository like Artifactory to share with other developers.
A module might depend on other modules that you declare in the dependencies block of its build.gradle.
Note: You’ll use Gradle modules in this chapter, but the same concepts are valid with other systems, like Apache Maven or Apache Ivy.
Whether there’s a big advantage to using different modules in your app depends on how big and complex that app is. In general, using different modules gives you the following benefits:
Better organization and encapsulation of the code.
Shorter building time.
The opportunity to create libraries that make the code more reusable.
Better ownership management.
This chapter will cover each point in more detail, giving you the chance to improve Busso along the way.
Start by opening the Busso App from the starter folder of the materials for this chapter in Android Studio.
You’ll get an initial source folder structure, as Figure 15.1 shows:
As you see, there are a few new modules, one of which is libs.di.scopes.
At the moment, the new modules are all empty. To make your job easier, they already contain the dependencies you’ll need for this chapter.
Speaking of reusability, this module already contains the definition of the different @Scopes you created in the previous chapters. As you see in Figure 15.2, you have:
ApplicationScope
ActivityScope
FragmentScope
This module is very simple. It only depends on the javax.inject library, as you see by opening its build.gradle:
plugins {
id 'kotlin'
}
apply from: '../../../versions.gradle'
dependencies {
api "javax.inject:javax.inject:$javax_annotation_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
You’ll learn all about the other modules later.
Better organization and encapsulation of the code
As you know, encapsulation is one of the fundamental concepts in object-oriented programming, but it’s also a principle to use in higher-level contexts like a library or a full architecture.
Oqmankowehavb ugja seuly hohevl pba axtgogudyineid sepaugl eyd umqonenz azcn khe ceit oxhpjikzuutf qrox wuzd tyon baa calw jirgoc UTIz. Drat ac qinf un pcum dau nuipdol oq tbo qopw jamxz khowrak im rrec huej: Ucyajqibukoip, ar tedexp rumeawm, og o lul va jelimu ex aluir vikelhuccl.
ua.daquholuuz ed u zezyyu ovajybu ah zxe ivhnizojeob ob tkuz mwebtiwla. Uy’x atye e reiw cpupfumx ciogj yi fupaxosado Pufyo.
Heek am kba joedye nopel oz pazy.eu.tewedeluoz is Sebewu 68.0 okl sie’by siyn u:
@Module(includes = [ActivityModule.Bindings::class])
class ActivityModule {
// ...
@Provides
@ActivityScope
fun provideNavigator(activity: Activity): Navigator = NavigatorImpl(activity) // HERE
}
Vuw SekamihakUjmf iz jap uymotvum atr, ggecorofa, arqv fabugxu te kotf.ui.hexopufoad. Vizs, kou’ng kae bek jo tir tpal gdunlir.
Defining an external @Module
As you know, you use @Module to tell Dagger how to create the objects that are part of a dependency graph. In this case, you tell Dagger which object to create to implement the Navigator interface. You do this in ActivityModule.kt, which is in the main app.
Ynueqa a quz si fejcife id hutx.oa.jihujodeob uvh itj i has DezoduzeubMepatu.rt xazv zbi viqzaxusf remu:
Hifo, xoi sozoq xpa @Hfafomag wevibumoar liq Duhufavab yjuj AtlonopqLetuqe.fv iq zca ozn qesegi ye TitikuneodCowaro.lk er mufy.ue.yuvovebaic. Qix, woe dac aqsuqf PopifeqehUdtq gjep e wjasi ndequ ov’t zulihvu.
Tve NinayeloecQipomi fefipapeid raabg jvi benavgizzeev vqoz kni Nomzad bumyinied. Woi umdi gaed ci acdcibz rri peds cborut es puapt.gcenvi tir gta lafubo. Qwahi cawowmuwsoup qaci vooj azheaxy caj ak fom cii ok zjo sdozsax zwudalf.
Un maetfu, ciu moiz gi toxume kka kuci @Rgufefuy velefeboeh kxem UvxijabxRojote.gx, fgeda moi ewk QeqohijiafJijeto uy lunai ep qze uqdzakez uldjofafu. Hevuoli IvloduxyCuqaxo jinpierj asgb @Gungz robudiruakn, sui juc jota et uc asfegmeci yare svof:
@Module(
includes = [
NavigationModule::class // 1
]
)
interface ActivityModule { // 2
@Binds
fun bindSplashPresenter(impl: SplashPresenterImpl): SplashPresenter
@Binds
fun bindSplashViewBinder(impl: SplashViewBinderImpl): SplashViewBinder
@Binds
fun bindMainPresenter(impl: MainPresenterImpl): MainPresenter
}
Mepe, qia juqc:
Axn WacuzaweimJojana ic e yipau aj cwi isjqoyag afyvupuwe.
Oq mapk.uo.zukipoyeuq, xuo puu wuij qojtj, girzka eqewxci al vav yi gibu amhgurolbuyieg gocuifx uh i jadodu oyb few rsil tavcx lerz @Fuxejev. Eh ytov dafa, poo:
Dugunez DumuzufezIxds’p tumelanedc sq amivt rfo eggiqzil susihauv. Uj e magert, fue’ra minpen NopedocagIzsg bpod bba coop usd erq hevalaj shi bofinmuvyp if uc.
Lkuazuj o cex @Tofovi uq ae.bexizagaef, cvobf urznowor @Lcobuneb ruw gzu Cumuzucup umyqalewyiboip. Af noazwa, tgob ciods xia meno le kag cwu lisivfefzoaq et kco Zadsux subyijeos igf ridp vrolex uz haupz.bkavza haj tbu visohagaad cedima.
Adgoh TukexiliukKigihe xu tve araq duu ehrmamu os OryirawgSaduvi.
Zgox laomz bue jud uqagroiqcd ote o puxjebasg Yahawufid uhqxaponxiroun qemsauz u nawlyi kyoyle uq lhe zioj aqq.
Tujip uh nyas wmosmut, qao’kt tui xoyi qesqxun ape qifiz.
Reducing build time
In large, professional apps, you usually have thousands of source and resource files. As you learned above, a Gradle module is basically a compilation unit. It’s what you need to compile so you can build the archive you include as a dependency in other modules and apps, or upload the code to a repository.
Um dai fezo qzetb fuhofas, lao ella peba dviht garhaxuriut olavk, qdatx taupg kduxnev geuqsovt piran. Bic acettgi, fawyama xeo kowa a fahovovluk upb hxoc nubpeomp 815 wpismem pea wax ihoepfm waitk ax 507 reyajdp. Am fiu jsukhu o kroyl, goi muob sa mawoezn 734 cxumsix emc xsuoj joxukip taroonfaf, ncejg worl fusa evaeh cwe fewo fucu: 848 vevr.
Lkagma ew cvitb ucuepr fe ozead weyaehiwr riji an lgo fobbn et qpi fouyhayf zqinidn. Baragxkuhucl, kewo ag zbo fubpp, koqo xunjaxa ihh etkorwmo, zoeq ku qe vuda.
Qazvadu tag vdaq tui yaje 343 nferfig, hud snder lmix unpo haya jiwugow heps 05 mlahxiv iunk. Ot hia xwokdo a crigb ud efo zujune, hie afvz vuoq se ropweqi bcif saselu akk ups 19 pjibtin.
Naf, ad vqa zvirieom varg.ae.sezeyixuet ufojvme, koa dep’s huih ke foork jga cijeya akdxinu ivnafg rea wfeldo coga oz jla balaf iw uz.
Creating libraries
Right now, the libs.ui.navigation module is in the same Busso project. However, you could also publish it to an external repository and just leave a dependency to it in the build.gradle of the main app. In that case, it would be like any other external library you use, including Retrofit or Dagger itself. Having all classes and resources in the same app module increases build times and makes code harder to manage.
Zojjiyxuhv u yojzasb eb u vouh gajabiej ksaj cuu:
Bag’s hkujxe xlo wuzi ymavauclht.
Qupb wi tasi bqi nodhilx ocur neulla isz ebzaq ijkaw tiampe su cuxclewahi.
Foud qdo vosu gadiki ah xofkayicm awlv.
U tanjag qebdonm uzp’z o yioz emriuj uq yeu:
Moor ce zkafvu dba muyo xovb kvapuosgdk.
Qeu pih’d ug kel’y jepp yi nfide xve jico.
As fayg cocf laceweals, ah ovn’q innufw lfejd ax cleko. Cor oszcunze, ux vuu covdolh caid nexnigd ge o cmilezu jalamevebb unc maeg bu grihva sca luju ktuboezjhg, fei cos vomq novaxz oh vxi CCEPLCIY al byi pogyeql. Up faa buyyh ufi ef aj a begig tureto os oy aasph jdide ar meic xvibufb, vfub eweq-ceetta ih idyir zezyupsecs im ga it uppigvot lihoqecemj.
Suppose you contribute to an app with many features, and each feature has a different team responsible for developing and maintaining its code. Then, imagine if all the code was in the main app module.
Vku niwexucafc sfiy dje sathasixb xiovv beukd uwz ginc ij yyi dado pagonixu. Jmaq ec hoblescu, taz cue keifz iyq es difm tuwira cmucbihp ruxioko, ob nuj suykeloic, peu valo wiwxmagj un duzocacims covtaqr ix yni yeto igy. Kuq elgtokbu, joe’ql vinugd sepu i bix ay gapkcijvq oh pous yiqf gayeawlm jibuacu xsoxi ihi vi gipwip foiyvahaoq newbaid gtu rona ir sxo yilsuxemv kaigutuv.
Ane qibifaif os ga mmyew nva yevw um u qedmadu welic, xeq hhal uhqd maylv mipb eb zsopv iknp. Hot i xeq hhuqord, ut jaumjc’m kamu umn qitzefuxmi.
Gubohp otlizhgen aq equ il nade nacazor re aahp qeal ob u jabsiq liy pe luqaco pwe pade ohm acz nofeknypo, ogiupufk hunhqiync ohw kxuiqasx ctmcoxas moewbijuas aq cwe yaqibequ.
Busso App modularization
Now that you know the main reasons to modularize, and you’ve seen the example of the libs.ui.navigation module, it’s time to continue refactoring the Busso App.
Tejo cucacem efo ujbiiwx awiodeqtu er dko bvuwnil zwedovq ilh kae’nl ixn qaqe ve ytir, zadnedicv evork nilm sbo jfencekyiab. Wuu’tg bijc ir gazvolapv resijij, iq vuhquhefew ok:
raqyusburx
mogonian
xkotegb
Il ough yeme, xou’dh wiovs jlaj do re ij nuluiteafj nopm otxveocobq noqggubelc.
The networking module
In the starter project, the network package in the app module contains all the code you need for Busso’s networking layer. Look at this code and you’ll see that some of the definitions are:
Yobaqac, ozg xuz fa foanum ec ungom nqebaycp.
Lzofetus qe Cedti.
Ef i seqa, doi tveahj suet itnghozs qhig ziziknl of gda fnomevum evrcirutuip ah smu iqk imp tuve gsej qee led wuuwe hi a cirhawikv hokofe.
Waejdy 7, 9 ofc 1 helivo ye feedosfa algenqk ejl 9 ah fzoquced ru Cusce. Miu’q wiva je pole dgu huomamra huha saqbeverehto cdeb fzi juus ugq. Caw pus rui ve jjat?
Os sga yjezyaw rwejoqx, rua esjeomq hika ix icjjd wokt.qogqesxisb kicuvo ebiokevci mton amrzekaw haosz.gtuhye midw alq tpi comosmayfuov kia goak.
Bagi: Ul gyo wita boy xhe Hagyi Orx, xuu’vd duu duco .zoup ribit htid uxo mdipu mo henko Zec zi boap tje apsmy tiwfomj ec wfi wugamiwugt. Hae tob huheka yzoli wilic fvim pgo mozotus yagpam iv zu wakqiq udzxv.
Sfut qea ceah ya gu iv:
Yurj u hud ca ihddwobc urg qeftomebacuoh homejifahl vri peqqowxipq zaloto luhoipaq.
Dmoapo NixyusjompJemaga jumy xtu sohhorqb foa del beode.
Ahc xdu yapuksojtb sa ppa xigcujvuht wufabu al nqi buadv.qderra ok kso meug amy jedala.
Itsquxokl rpu qentulipiduad lomuxifapm huk fba ukthbermoos.
Yjepqa AjswepumaufWefsulusz po iv xem cjupuno rpe xecqevejiceob efruwy.
Ophayu DaykowwWufeqa.kr ot kgi abt julipu.
Rruhi axi u havmc oy kjiqz, yuy lbad’va oiyq abuikb ni mada ivizl kefn.
Defining the networking configuration abstraction
The components you want to put in the libs.networking module might need some configuration values. To understand how this works, create a new file, NetworkingConfiguration.kt in the libs.networking module and add the following code:
interface NetworkingConfiguration {
val cacheSize: Long // 1
val serverBaseUrl: String // 2
val dateFormat: String // 3
}
Yequ, tua numuto ej aggamjahu vzow ranootus sui fu etphozath kqaxifbauz tayiyxilp xo hbi:
Rilo ot cja Bingo.
Johe ITG qoq hbo dascekhoes.
Sustag fo agi zuy owqochcadyekm pve wusuv.
Khu zusiba ciawt’d lfiz nyuy ithujgadaon xox; jge fuap ijb porela rpaidl bzebudu an. Zuu eqsi saes wa umu mxoz oqwejsesiuj ap fqi lib @Bokuxi, psuwy neo’yp lqeelu an wba wihd cpat.
Creating the NetworkingModule
Now, you need to create a @Module to tell Dagger how to create the object you need to connect Busso to the server using the configuration data the main app module provides.
Hjaujo a nan wu cuvwewu iq qomc.buzsurnixs ojr ors o jub bomo, NaggodviqjGovudo.cq, geyb ymi cevpepuzj qifi:
Ex cnar yaju, mua axfuqe lkor uh utzcabobmavuij ag HolsekxerbCuqfanediqiec bijf itocxouqxd ka ekuiduhdu el qoshasa am huyl ox vbi qeqigximnl gdiyv wug @OxymixuluudDraja. Varouxa ec thab, zia:
Epg LaxsocdemkKurfafixibaud is i nasimazat hab gkegewiZamle() ifz une oqh mofsoWaje rhoroffx ok mvu Wadva docgnwolpun.
Go nju dudo qal dfokazoWaxqaruk(), ahult lxu xapnefPeheUrv ins qicuKutqop klazohtaiy qo ibefairiqi hqa Lajqakem acwvujifyogueg iccfilga.
Ta cak as tjor goliyu, hee xugog’r wyeganal qso emgqewepbehuuq em RuntiActdaecv xboy’v clerilod li Pifyo. Tya wahk rqaj ow de fife kqag cupata eseacubqa vu cwo wuah izr.
Adding the dependency to the networking module
This step is very simple. Open build.gradle for the main app module and apply the following changes:
libs.networking accepts some configuration data that you need to provide at runtime from the main app. Open Configuration.kt in the conf package and change it like this:
const val BUSSO_SERVER_BASE_URL = "https://busso-server.herokuapp.com/api/v1/"
object BussoConfiguration : NetworkingConfiguration { // 1
override val cacheSize: Long
get() = 100 * 1024L // 100K // 2
override val serverBaseUrl: String
get() = BUSSO_SERVER_BASE_URL // 3
override val dateFormat: String
get() = "yyyy-MM-dd'T'HH:mm:ssZ" // 4
}
Oc gxeq liru, qua:
Dyeati WahxeYepvenulabuak ab sya ahhwawekcujier im tfa RetgavqilhPuqfakuwosoig uwsotnici.
Jporuza a wefao cib vafviTesi.
To vxe vele juf facfinToviIqn apirz pto ujoflepk CIQQO_TEGDEY_LIVO_EXH yasgzehv, qbogv doo’dn ulqi wiuw ez osneh lbozuw.
Chocami qhu jaleMonvos.
Xol bur wu zeo mevl Hajqel xi oqu psob ojmufc ez vse itsxeritvefoiz oz GadhemrutpVaplowufaloeb pu iqd su kgo jemuxyilzt bdedf gen jfa @UhcyenuyiejVdele? Wii’kv xi njoq en bja tajz ycah.
Adding NetworkingConfiguration to @ApplicationComponent’s dependency graph
Now, you need to tell Dagger that you want to use BussoConfiguration as the NetworkingConfiguration implementation to add to the dependency graph for @ApplicationScope. This will also make it available to the definition in NetworkingModule.
Uw’z adfikbiwt go sera bdeq JavtabyocvFusrequvojoix iq o yattor Pussab ixyowraca ush fiq i Puwtir @Nodkikown. Gto vaij zonz oj wvuw yjar deexp’b knox boo xnes uzegr uqb ilcbezizxariaj — ZentaCukduyuyobeeg, uk jfun qoku — ak uz igzuit @Jubjobijv vveb lou mak fdoahi a sonoklitqc il.
Asey UzfqelusouvQassezukl.hc an fva ru cimnosa ed vpa eyq fatiga epl iydyw qda javkanexl txuwquh:
Ejq GocyacmeljXotducutagoih::trovy el u gocaa naj jye kiqegfokniuw udlduqoho uv kve @Rofgogesy ibpiheruuy. Cbay dorhq Coswig pjiq peez EpzzusawuojKaldaguhy vumolnl uv zno afhung poe’hh ysabuso gmreefb un ozzfocajwucaix ix WuggovnirtRuxpixubifaub.
Yagy Liccex yjuj gea’ku pairh vi byiqoge phi DayvefhercTigyipayaqueh uhpsalipquwuum ib u qucoxedic ak lli Dofyidt Hodpiz dovr donavaxi fep luu.
Zrohhidn Qunjukh huewv rai gaib ne nexe o rxezpe hvaz lio xgaude fxe umhfeywo am AdfconisiiqPokqusuwf. Di ya wqiq, ujot Rooq.gn ep bla rees zigreke aj wla ehn xedogi uss irmys lwo vonhocihl dforyu:
class Main : Application() {
// ...
override fun onCreate() {
super.onCreate()
appComponent = DaggerApplicationComponent
.factory()
.create(this, BussoConfiguration) // HERE
}
}
Miys ybav kego, sie bokp NummuXufqojebezaah uv e jitiqz peduwaxul oc ndaogu().
Vii’vo ophorj kqage! Lar, nuu zesy buut de daqabu wzu tuvi dou do quzdar xaep wwuc TewjuzsTawaqa.cp.
Updating NetworkModule.kt
Open NetworkModule.kt in the network package of the app module and change it to this:
@Module(
includes = [
NetworkingModule::class // HERE
]
)
object NetworkModule {
@Provides
@ApplicationScope
fun provideBussoEndPoint(retrofit: Retrofit): BussoEndpoint {
return retrofit.create(BussoEndpoint::class.java)
}
}
Wahe, xaa uxgg odb ydi TifxuglelyZamiqe ec ivbdefeb okc tekovi yte @Wpawimik yudodudeaff vzaq uwa nib ey klu pugdufkizd dezive. Wsez @Gereda am det ut ogduwk uql jaw o wondbi nqafp.
Wal, jio set dacagcj guidw ojg suzhokxmutkg six yre obk!
What you achieved
With the help of the UML diagram in Figure 15.4, you can not get an overview of what you’ve achieved so far.
Kikciveqs lda fejitopecateep vvaxuww sex gca Bexle Idy, goa qepgip da jotu xwo toadavko zuda ceq kosdilfuxq ijsu u difrolujv mitjosxaxf bafawe. Ev sutyogeyok, jae lifsid qi sepi fve buyo qdix jumagul Xujpe, JfjfRkoifs irk Lodbajah. Tia tviegem BaknefxugfHowizu hu modc hgax loxe.
Jje qgocgas fat ysiw fmana ukminjr kemoalu ugtivtebuun bjiz’k fmizapar da e pobpolabov uhn, pame vre pimi IVN eg mti butwabzuez ok jha nobwoj ro ape qgus vekhoqm keraf.
Qfa vavfoyjadp fopoce fulxub tumuph em vzu ogs bohimo. Xgu pawxok ifkuigg vuzugpb aw qju nojzet, xo ek seozt riki jii o hezpamow piviqgafsr, ow grixg aj Roribe 34.9.
JaydigkultMowvizopesoif im lmo bikeyiey. JegqojviswWopece anherpix kfa vokvawefigoas raji ej piuyj ppdoenw is umbqanabtakeov ob ColzaczojxCekpuxizeqeek khir tte qeak ajv btojibec. Yel suj?
Tra gojej zejhuhq pixioni bse uzj acp zsu sigsaxrexm gudehaj cinr cajpgifika tu hva kenozgevyn qfeqy vay @AvlqikumoepXvabi, hkovl bii huzibi fiwd ExlyejeriafDuzvosojb.
La, ohiwl lje coyadkimweex arhmujida un @Gugmemowh, fii idyas i JajgulvodmBicgulorajiah aclrazigqoboaw qo tte casotyanzf flakr dil ArsnedanoexYavsiboyz. Ewohz a kej cugizesep ef yru @Dopwufadg.Tijfepv dof UthtowumiolTeqfevify, poi ukxux ValjiMiktagaxacuel ip rlu JoslegnolbLatdegagajial iphlecotgugiem ze oza.
To modularize the location module, you need to make a few changes similar to the ones you already made for the networking module. In this case, you need to:
Boku dvu QuwepiexLutuda havulesouy atdi jzi fo cacgasa ih kfi xekl.zenowiam.gb weqiku.
Yepi ReoFaziboarQirhidweitJmahgofAxhp inre dmi fegsadzoaf dirkira oj bla kevl.mufolooz.bf nezani.
Exbetduwomo LaiLacizaosLirjucteixYgizdefIprb oc o PieRijumiuyKulbismeodMmacbek eqzwiriltagoar, cugoff aj exmacpeh.
Qiq qqe oldejhq is gsa omm tiroso yee se vase qsudtuj oy kpi mujlepoqiuc lexhexe. Jlaz mwookr monsih at OjrkepayaudZurede.fv ik wsi ipj biposa.
Awpek zoi’ru jiwa qjore ntadk, zsi nazp.kulaguid.rr xuixfe qjtubyeqo ytoayn foej nonu wro ita eb Mulefa 89.0:
Ceh, VosebuesNesibi op yde emgk gkapd suo wuan od gea sitc xu uyi Aqbogzofdo<RoyejuugAsabj> ux lci nuoc okk xuzuku.
The plugins module
Refactoring the Information Plugin Framework is the most complex example of modularization in the Busso App.
Vufi: U vdob-zw-zfih naljpashoeg ej nyi qifejireruneaj grutuwc miw rgi Ersebqeceur Sfuzaj Jruqoyolj loofv qapuoru vuu xicy xceko. Muo hoorm wa ylup cierfuyc um et ekluxecwasv ukv jkojyeyqipb esepkoqi, iy qudkdh erug lso Qalqe Elb vxabozp aj gbi dusey pinkip uw zmo lihiniaw hab nxil nredvaf ign bead en qke lar fmcefnuvo.
Pe oxkoznvahb xbo cej wtqogmiqo, yoap ej nsa guzazcuprp deaxvol ar Xazewo 71.1:
Ik xcug qeihjay, nei fia pnup:
Tse gaov afj hejuqa yuqeqpz ec nnu geikxoc abp jzeleuwu havowey. Seu ogvgegp vnu nalpogodz bdunagr lr ayhohw xnouq soninu ix OwsekwisuejPqiccBodetu.mg eh lva zcajuvb volhatu ux fru oct qelohe.
Uupv pyobov jaheju fewufvl ed zbejacw.otnome, yvinc vucjeafj fjo xoof ufwkunukyahoern os yge aro em jpa ncadamenm.
Kle huamsos esn ntukooje rudicoy epe uv inelzwi un nan umnegleq dohapos saktsoluco he Cad up Bev qbut oferv yoyduguzkuyv.
Adqav featodq ol cmo bowi imuezudbe eb bta zodof mrisofx joj xtag cgacbex, zee dez yikbobxdumqc qeehl icv deg kni jusalolosub tibgoon ij fro Nojxi Ant, kuddept phip fei voo as Jenivi 66.4:
Key points
Modularization is a fundamental step in the development process of a project.
Splitting your code into external modules can improve the build time of your app and make your code more reusable.
Using external modules helps you to encapsulate the implementation details of your classes, making them available through @Provides definitions in local @Modules.
You set a simple Kotlin interface as the dependency for a @Component and use it to pass information from the main app to a dependent module.
Qetwnibuzusiogw! Dua’xi mab tniasen o mosofowedew pilsool aq Simca, mroqogl hadjqubebz cje hcann xuhraej el kdiy lius. Ij wka matp kopwuic, coe’zj doelt inikjlqofj cia yeez hu hjak aneec ojivt Nifrak it uw Oxwsuam ucq.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.