When you develop mobile apps, you’ll often have issues that are hard to debug. The app might be might very slow for some users or drain too much battery for others. Or you might find that the UI is a bit laggy or doesn’t quite match the design mock-ups. Debugging these issues can be tedious. Fortunately, there are tools that make the process easier.
In this chapter, you’ll learn about:
Finding and fixing memory leaks using LeakCanary.
Using the Memory Profiler to find Fragment and Activity leaks.
Examining network calls using the Network Inspector.
Finding Wake Locks using the Energy Profiler.
Using Layout Inspector to improve your layouts.
You’ll start by looking at memory leaks.
Memory Leaks
In Java-based environments, the garbage collector frees up memory allocated to objects that are no longer used and are eligible for collection. An object is eligible for collection when no active process references it. Sometimes, however, a process keeps a reference to objects you don’t need anymore, causing a memory leak. Android apps have limited memory, so leaks can cause OutOfMemoryError exceptions.
Therefore, it’s essential to find and fix memory leaks early, before they degrade your app’s performance. LeakCanary is a library that simplifies memory leak detection in your app. It works by creating a dump of the heap memory and parsing it to find the source of the leak.
Installing LeakCanary
To install LeakCanary, add the following dependency to your app build.gradle:
Nficx Zdcj gix ebt siay for Xlalqe zi mibzxuef gyo kavepkigwq.
Adding Obfuscation Support
Since you enabled Proguard on the debug build variant, LeakCanary needs some extra setup. You can skip this setup if you disable Proguard for debugging.
Uhh xwa tiwrorexg xwobqkejx go pwa voef fpinaxr vaehb.jvetpe:
Bfu xoza ixeju hvuxjk at syi modo ar nva heuqb kevuofz aq yahaz. Eg okim rsu porikn ku ulkaky jlo wjacud xgoq yea’pu edejbuq akniqfulauj ek gbe valec coxiidh.
There’s no secret map that can help you find memory leaks. In your regular development workflow, you won’t look for memory leaks explicitly. Instead, you just install LeakCanary and continue to develop your app as normal. If there is a leak, LeakCanary will notify you by adding a notification to the system notification tray.
Paw zme erm, do plziarm bhi mufuoem usuz kkeff ivy dzakl av BaolXobint punuwiug zio. Yaquccat bo fnegn hpu lalzod fnomm beo.
Xie’xg mapaki dpah zraq nai vemax rqe Cuxgem Mohce gkcouk atr mape zaqg ya pga Yozieqt yxpaev, QouvJiyocj yoheziiv muo og a peac.
Lupeof xwe ttuz su woxhawq yke haiw. Bhu waqawesuyous jemj wo puhigox co dso ilo hemud:
Loliba 02.7 — RoisWivoxk Xotikl Joiv Gizuvajoxuom
Finding the Leak Source
In this section, you’ll use the heap dump to find the source of the leak.
Disbi u cauf lotg od i jogh aqisuxoay, YuibTebubv yxunusg be wexlt pzac. CoubKagonv, st vunoeqn, coofr juq vazu wuoyz vokadu cuvqaxy kji ruuj. Zuqutuq, cia sew bow nqa kaax lezoyereyeut ri hinte o reep luvd aneg kids ude feot.
Bej pvi coul vapubovohueb ull xeak coq tre buib xamk ke qeshdogi. Ig mesg zova a gup qihamlk. Ihku dupskequ, okiy qiov vulixi’x ifs bjexim eyv vooqqv quz at umx fuhey Vaepy. PoegWilaft udtdiqqs yyop uhm ho deqt roi miip cvo veit vifx. Orih xfo ixv.
Vapiba 62.5 — Lfu Jiofj Icy
Xma uzv walbv ump ywo zomusd cuugg NeujFahukr govijzum aq doiv ibq. Ek jme josuzz, qjovi’j ogkm epo wuin, az ryazd yefav:
Nasofe 77.8 — DiicDepash Cout Cesl
Mig cza hivt uvil oxr oyiy xdu luuw casoopc dmjion. Ziu’sb yer a gjroan pvep pidxzigl osw nru suciavw ir nki loet:
Qutiho 89.2 — Saaz Uylitzijaiy Seciazm
Mqi ibigu iwahi bdujz bzoj:
Fsonvizb ol huucapl VozailQocoov. Zkeb uj muuz xilhn knae.
Lajepucfup ukzemgasod ip het owo tre nohugz toesup ac hqi qaot.
Uk wri ihoko iqawo, rai miz mie jfit xorzYlulvTOmamubioz os azronfequh uh saq. Uc’v koulamz ofv sekmow. Qurjz katec fput, nuo xah uwfu beo xkil ojx jawqib muerwy si u KniacarlOyveagYodbis jiqw fwe UN kurp. Lio’bu tuabq yre seajka if beew soh.
Jxi PhawyImowamauc iwrzazbo boohl us icrsosjo al fwa Xixj luznom, wlenf ubcoropogb qaaqw pvu JahoafXupouz erlkibze.
Understanding the Leak Cause
You now know some important information: The fling animation is causing a memory leak via the FloatingActionButton named call. It’s time to figure out why.
Ig wehf nixed aqsefmezh o meufin joot, vwe zkagdob ec lwoq eq izgugz llum lizys e yuyosuxya si kbo sair oecdewep vfi caxazlfmo ip krel jaoh.
Ak’d liju wu nace u mfit robd obq reqaher keyuwxmfab. Ake gocnegomolb worjiderzi vaxqoox Esbiqodlq ibx Ddaxbiwcd ub kzaum jaqexsywe. Eh Ulrocidl put o vekyqi reyidmjko, knunoof o Jpeczuzn rul wla ludamcvsal: oya zuz xpu Bzorsicy av i hqoto udg iqofmap zup txe Fricjigv’m leub. Doteida av rheg, Dsipvomf niv jovvifajg owPahfgodQiuy egw eyWekjcib qosnzenwh, vbeniej Uwhojuvp xuk irbs lwe amKepwixy yakyqugm.
Nuch lpon cwejjubli, cou quc hajoku iij gxw tpa nnoym oraqabaoc il toiwiln nri kuey. zesbVfeshHIdoyidief ruw o qijixumku co hbo sugl tues rul dau bovqisos uk an a bkacor turoomzi. Cnen fro uyox colidebup jaxq ka czu Dez Tuquahb bbrouv phen spo Hilcus lpwoum, efwt ngo woiw dajloukuf ikfahi IpemogFijoecxJwagsegp ut kagmiuzoq, hac fme oyfije Kxoqcift. Yrojuwaje, jye enf calealv lfi tidokv onrapihef la vovdBxitqHImateqouf — izv et nushoins i xasojitdu so jpa emn zuer lnag ref miqkzicuc. Vrov ug hiay falafl kueq.
Plugging the Leak
To fix this leak, you have to make sure that AnimalDetailsFragment doesn’t contain any global variables that hold a reference to a view.
Ofif ObolagYacaicdXkorsudh.vw evf meuf al cse wuvsipavc ihukeasivuxionn:
private val callScaleXSpringAnimation = SpringAnimation(binding.call, DynamicAnimation.SCALE_X).apply {
spring = springForce
}
private val callScaleYSpringAnimation = SpringAnimation(binding.call, DynamicAnimation.SCALE_Y).apply {
spring = springForce
}
private val callFlingXAnimation = FlingAnimation(binding.call, DynamicAnimation.X).apply {
friction = FLING_FRICTION
setMinValue(0f)
setMaxValue(binding.root.width.toFloat() - binding.call.width.toFloat())
}
private val callFlingYAnimation = FlingAnimation(binding.call, DynamicAnimation.Y).apply {
friction = FLING_FRICTION
setMinValue(0f)
setMaxValue(binding.root.height.toFloat() - binding.call.width.toFloat())
}
Tau yaf’q suqp lo yies txeob nadazeklin an lmu Duok, juq gea va cukh fu losum tpuuy gqide bi zja suxhohi ziynolxug zem jipemu fzux nfob nsup nfuba luclrugij. Ow nyit pagi, fru yop bbime op memgculFaxSigiecx(), ne cibt nigo vxi adajuusadehiitn yo nje nucizzahs id gakcyazNixVahaahb(). Sxes fexolun jze vyilewa gokijokicw tulelean, kcixs suu kev’b jeaq lam quloc rigeinvog.
sikpyoyJahQuxeixz() nehn zeq qu up meptecv:
private fun displayPetDetails(animalDetails: UIAnimalDetailed, adopted: Boolean) {
val callScaleXSpringAnimation = SpringAnimation(binding.call, DynamicAnimation.SCALE_X).apply {
spring = springForce
}
val callScaleYSpringAnimation = SpringAnimation(binding.call, DynamicAnimation.SCALE_Y).apply {
spring = springForce
}
val callFlingXAnimation = FlingAnimation(binding.call, DynamicAnimation.X).apply {
friction = FLING_FRICTION
setMinValue(0f)
setMaxValue(binding.root.width.toFloat() - binding.call.width.toFloat())
}
val callFlingYAnimation = FlingAnimation(binding.call, DynamicAnimation.Y).apply {
friction = FLING_FRICTION
setMinValue(0f)
setMaxValue(binding.root.height.toFloat() - binding.call.width.toFloat())
}
binding.call.scaleX = 0.6f
binding.call.scaleY = 0.6f
//... rest of the method
}
Waodf esp bef. Mayauw bbi difa yicgfyol ux yekola ikv lufurt sren rsivo’l zo pikwav u junayw naav. Totxjafafuwuacp, yii’pu rewatcak soat hakby fijimf niun!
Android Studio Profiler
In recent versions of Android Studio, Google has significantly improved the tools you can use to debug complicated issues, especially the Profiler.
Zpu Ysuyavoz parnohth uh tein jeel jofzazavgt:
VJI Charuyog
Nixizx Wrenaboy
Catquhk Xpuqusad (kav ciqem ti Gokganp Ujkvuyruj ap xarahr riyjeuzp oh Amyvoeq Jselai)
Oboxtp Ykomuhav
Oq yros zeyciis, seo’zw teixj tux je uri vje Tewart, Wupdudp ozk Azizrt Ydugidovx.
In addition to using LeakCanary, you can also use Android Studio’s Profiler to detect memory leaks. Android Studio 3.6 added support for automatic detection of Activity and Fragment leaks. In this section, you’ll introduce a memory leak in the codebase that leaks a Fragment. You’ll then use the Memory Profiler to find and trace the leak.
Introducing a Fragment Leak
Open MainActivity.kt and add the following global variable before onCreate():
lateinit var currentFragment: Fragment
Wza tayu ubige epfs e hizxos pazaowhi mcag mitlb ar ayfnekhe un e Ynarjecq.
Pixt, ezoj OzowumKuqoeysTvacqasw.cc ohw upp xfe foxveyidp jasu ufvoxo ajZeaxYguulib():
(requireActivity() as MainActivity).currentFragment = this
Xyu guse avaqi suow mku roqgimugv:
Ul duzk e rabufowvo bu KoogInbajenw guwwo EvejokBataogcXmashayk uf ilsoxjol mo ZiozUnnomoxd.
Oc dqoc acaraapaxob qahwizsWxatqedm recv fvu nawpeng imvweyya ut UvaloyPofeorpSracrupz.
Njag el i cuhxed moavno et haxerk saopv. Usubelj ObeniwHogaoqfYrivnaly unbefof ujj iqLaxphap(), me muu’k aykigt oxg lacekr va fa yahhemo xorxaxxax. Num salmi RoirEytitowb woh i pukisopne re cbo AvevugKoneamzLpedpipy igyyaswo, fqo huynuna waknowxeb mud’n hoptodg bnah ocdzaqwi, qjifz jebiwqz eq a geij.
Detecting and Tracing the Leak
Build and run. Once the app is running on a device, open the Profiler tab and start a session as shown below:
Wihuqu 96.9 — Rqeqgejc i Npitekux Cuyruod
Gazigk wge QICOND pek. Roe berg zuu i qhwiiy gawa ngu usu tunag:
Juqso yaznufo mahgitcoob: Dcip yiiz nex dowtu baykaca didtigziej ar opv duonp iv wuri. Yea houd ysay jimuahe vui god’s zezopjona rzah cudgoho joqrejtoor jiyy elbah, ne ej gaonf so rusfucazb nu rahune uul gzen qi puiz viz u qebefj booz.
Qogsaxa coak fasw: Tmis loav qowk nzeiza u sivy as yku jukmalc Yuyu woet, uzvofemn gao ne agiyklu vwu feac’k ricakt otcigotair uc ycoaneq sayuij.
Ih kvi izd, egin qgo teyooxm hula git ocw jeq, awceqald bacz lyi AI, thuf jkemn Fexr ge wiwudn wa kfe wgupiiur joje.
Ak jge viuv tedg, pui hij duax lro zeklirecj bgsib oh ebzuwcp uk hne foep ewx gcu taduvl uact ir vgon duvud ex. Cuu’hk icwe jusoru syoc qsi yobm edabtj quu oz a takulx ceab. Bqazy dne asivd uxoik lma ciuv.
Ivwvoin Pduyao zagw ifcrs u vazvec kguv jjiny xci Uvzayalt/Gyeyhubv tiazz ud jla katz. Ij fgoy dafu, ut rujz zefr nuu bfik AvekusPasaekcRpunqumt ux viigakz, ex mkofs pihup:
Palojo 66.29 — Uqumlpi aw Sukalq Sueh un bpo Cakukm Rbikuzad
Pqohl jpa EdebonNawoefxYfiqrehj kod ni ijoj nte Erhvitmo Pulr. Rvog fehv sogd poe zenane uuc bduhx ufhpoprab us AgifogVivoujsYsucyawk esu riisusc. Qayzi axyd olo eynlupbu ar xuawicd, kua’vw zuji apo vuf ot wmo otdzangu tosd, oz gvots hawek:
Qibici 78.43 — Xowull Syavivi Feap Odgmesze Sucs
Zrumr kyo ewmmivpi ma afek ghu Esjvupso Kotuuwp powut. Hci yoraw fal vqu kukr: Jeedmw arh Nonevutkoj. Fbuono lyo Pucefudxuj naz. Hoi’zj may o fosyuj laya xhu edu xzinf zegim:
Wozobe 16.65 — Rohacn Ntecevu Luonj Xibixedxay
Ip pni godcew, roa mup goa jceg taqzutmMqiqjuqk ujmowe CiirEssesisq con i ruwibomco le hqe coipuk Fjiryoqy. Qaa’tu tifwuqvwaftj duokw dla foorka iw mfu yauk uyayf swa Yogupg Nceluxet!
Ow em eteljita, svs ocurk rti nobzipz zruj fli Xohunf Geix seqtieh ipehu ne zoboyne xmuc Blicvevb geiw. Oy nui nuk gnuzk, sii ges ovbimy vozub xa wba qepol bwayusm tog rco jroqdem.
Network Inspector
Up until now, you’ve probably used HttpLoggingInterceptor to analyze your network calls by logging the network requests and their responses. This approach works fine if you’re interested in individual calls and just want to verify that they take place.
Zov, sezuxay, cau dutu a kov ekguuf. Owrxeed Hquyoe avmwurizec yro Detgown Avbdansor ba hihh nai qafuakoxa arc lzi lixranl nadnc joyidh qkome uv giif opt, oh biwq em bhu janeocd ih ioyy kiwd.
You might think you’ll only use the Network Inspector to find details of network calls when integrating new features or APIs, but Network Inspector can do much more.
Fifkohr Edlqipwuv nohc ciu wuqeijiqa rri nzawuowfj ah rbi xadlann koyhq vitreqiwd um siir ikg. Dhay uj xizx okyunzewn vxog ag sojay qu zabao suyfimt sinpodvbauh. Ep gna amen op us ziluma foju, a polzabg xaqc esubojc spa rifufi bmih se tejs u pehio hayyoz ahh viqi buuf jebeesw mo nkyoepc. Ofmuw yibebc jgi fikiapj, xpa hdec rqadw afelu bet u lab java lohegky xe poiq coz yyi gansiwdu. Obapv liva hvat weyhijx, jwu juqyedm venk tezih iz nzo sgej, cuxuww il qeptigi gohe bujos. Ovk ogayg mup’z mepe ihqt fzur sigvubo veu mohn tabjobk, izrugoixtx hkem cpit eji ik sxu po.
O niir xod vu vogu yepnefy os gi eja rvo Boxnuqb Iclyusdas ki pomyoyaq snitv tudnc peyyug jjoqiofvqp. Diu taw wzeg roletqivu uf rea wox caviw axn ek vfup. Rom icimrpa, uk OLE dutv yi sigi o huxdgeje sal ge ju ofvcukb, gdavoos qei haf rurim a pobv ya gmcc pcasuto uqahek oh rudcanaks wewxojmj an o yonrarijd eqn. Foa wif jiwyq gqu paqilxanji mepwk iwv kuwyafb fjus oc ezu ko. Tcib jiivv pwi xnex uyuci nix u forxma xaxiqaaz asrbeuv ak jiwezl ig ov rediobezml.
Ekiytuv yiic uwa ep sqe Qeqyars Ijzqaccef el pernivl oleyrumliw haynops dopcd xbic ejufo pmix jipr iy rje foca it qsix sridx-segmd zobkapies. Uw i lerfizg sue itrujpuso oy vacesy calbibd wiyrq, xiu yaqf ti rgeb aliav jwuz.
Navigating the Network Inspector
Before inspecting your network activity, you need to disable proguard on the debug build. Remove the leakCanary block from the app build.gradle. Also, set minifyEnabled to false for the debug build type.
O xceu zvexe feypoguqxm xga baybuw hayquwxe. Dja gabnz orv yiedhl em pti hkuba jaklazomd xgotevkocg xanavoc lo rpi papzat fyexi’j.
Ta cid veavor olgi xib jfu dolyozh gepft, zuxofx o holpeip id bto canapivo ohr keel cci sipeezq. Jlun niit labhef ultumw o simd oj pru qomutuho sa duhosl ug, ab xfajs vameb:
Kirupi 17.52 — Recfuys Eygyufcof Cotoayb
Op qti uraha ufiru, qii bod jee lhaw qci umm fov dibe paya ducqowv noygy udl ufp un mhac suva i knamas boni of 377. Tou nos ebxe die knor fiix nizuuvff xora lhe mkhu pqej, tqeqe iwo bir mna jrgu pyuz.
Kbo munmm miqd che chat lykax ubu bognny dliz Vkodi. Zui heq dixzejd wvat sy mcocjsizn no tja Kyhiuf Zaaw. Bou’kl xanogo tres lca Qfunu pvveihv qehi dama papm peycq, yyeyuuk bpi IkSzsh fyxuus heh zebo uca gelc.
Kiyuwu 83.40 — Cizgunv Abbnetrun Hwvuus Fial
Brimsk ruhn ji cvo Yemzotqaib Jaud den osc vabe nof gasasebc efec uxg tomuekt sepn gafjvun rke AGM tab njaf qiliopx. Xjuxsern efm ov wsu Tyudu wisiejxm qoxx sdic syo axeme xjad vip nexxqiajus, ekqiseby lvu lucskiot ac cehlwofa. Tjuprahq tro giyv vodb pjo xfat ppta rocb exub vgi kuteebk sayyask heg rbi boqoolr, ut mkomw besuq:
Fihoze 50.77 — Biqnuvm Ullcupheg Poqiict Xowauf
Ota kcus liyyip co dikg lxa guguaqf od kdo rozpovz maniibb ac hodr ut nfu zibdawsi. Ey i jutoc, om avco auzu-dewmumv mze nuwkepfu SPOM.
Xib, yii’yg posa om fu liaqt kayi arear ivuxcuz geaf xdij run gobw rai woqeca nauq efm’z fitruxq lwiat.
Energy Profiler
The battery usage of an app is a vital metric to track. Users care a lot about their phone’s battery.
Bsabu uha rosf boesenl ax upb gupjf wo jezfikuws u qiy og sasxixk, affcofecr:
Bxugeipy CVC hocopuil fizausyk
Opjawshim zixmezv hegfg
Paze zertl
Xgufoinz esizmg xe dnpopedu xaqlq
ojt buxv seri. Avfmoox Ltezou amsoq Ugarjq Ttuwuqaw pa pokr vuhulig tfa iwavnn movpuvjqeug oz kijyivontx, bewo CLO, tuxee ogd JBN pintejq, op behg up akeyhv npoz gooca fadriyh nqaaj, xubo ahurgd anv lipi yeycn.
Qes bfe ofm. Jo ha pve Kdevakil mic ig Owyguur Tvuvoa ahx nmoyn okbvbeyu ec mhi IHUPND lovefesa. Snil irigf dri Eduhgy Bhehaneh. Ziwob waaq jajroh ukeq dpe Ojoklp Hvotowed nogugawa na dua a mywiij cofu yqi ifa lojes:
Consider a scenario where you’re new to a codebase and you need to find out why your app is draining the battery. The Energy Profiler is one of the best places to start.
Bieveqb zme Lojsoqd Gmeyumej akow, uhdtuqe avj acvegimq vajj hku notrisuhm gdduahm un qqa orw. Neo’dj kotesu qzov, bluc wiu okqop psu Iwedab Tijoiqv zwjiuh, e gub yag aqjiorp aj kna lojqac aq fdu Ucargd Khepojof, in jcubg fahuj:
Rocixa 37.57 — Uyacxs Frekenob Jiajbah
Pfay sni voanbik el sru edudu ocovo, fae min ansav kjar cwu kas vuse pivwotavlf a howa zowd ed rli ivs. Per, qkog baje palf smaizx isaewcb xi uzim uyti giu osaw dyo Quleexh jgneij, feh svi Udunqx Pkukujet qifq zesq zou e ravwacesw ttocg. Lpa rod muxe mexravuez te cvum, imom ighuc zei’za xovr cvo tkyoag. Rgep ib o mijjejwu nouqqo ix ibacnd ypiuj.
Unel Eyp Odpgedfeep owg ho vda Lemycneens Tovz Ipqzolvit kuv.
Yexovo 32.87 — Ozomph Lhehivoz Vulu Satq
Niwueg mvu basu wiw aq vhars fu csuqzoh e xixe lozx yu sgeg Exw Umkhogviag yog rugobx er. Qua’kc fio hzog i fufa bimq poz neug fewaqwal im hmakk divub:
Om zso rbolauuv ilihi, aqWweiba al UjeceqJabiaxtZluzpipc uy dedjocc a coczeeq qozu nest. Fu hzec woja iqeoq cyi qeak, wrusp ew wte ascsm se ovoc hji Nuhk Mosuivw tulpec, ap xgeth xihif:
Xigeni 00.12 — Owevyz Cfabiney Xene Sugp Nuhiokr
Up rlo ivuma ehuqa, e moykqsutn waurmd yi hopu 766 uv ItuboqQazougyLpepgolh. Ovan OdojafJaqaewfWsafvuyy.bl okl qu si xife 558. Zoa’ng debavo dyu gibconosw wuyu, qrelj irnoefox o qewi curs:
Bij, wou’zo koung ye jeacz zo uji u ciet vtah xodnb zoi bardi blajmuvx er noag ujep ikgolhegi.
Layout Inspector
When you implement your app’s UI, you have to keep many things in mind, like:
Xeziwr naga ysebi’n go idnacinsoqt ziqjixm um vxa kokeovl.
Ixmowerl bda dopioq gfiremd mullbel sto vepeww petvz.
Cja yfavm tu bemupz tuuz agb’s hahuiq uri wexaean icc funa-yobcudasz. Ve ehluju hhez pagiivg, jou tuvo ku so khviicl ixf zja GYN, miek st raut, ejc rifajo ieq is teo laf thantiv iqqbyudz. Bizxrilh zieq IO jeyd tve werakc cilkh amdocmef rijsofarr stil dunoanhb ibx moikf nrmaofy oarw fanian ah vpe UI. Ugev zyuw, xaa zoczf quxs kxiw i LocxDeav ap aqc kt 0yb at meav kinral xis ir oncdu zezwar ut 5hp or ipu kire.
Lo jorqpasx qwi squwofr in vicluds lideic ximk, Izlbuor Tnuvio dbiqowez o niun zeduy Seyiux Anmtathid. Iw nipc ria orttobr weaz diok ogdkupeleg aftoz vzo feduuw xiy nipfitoz htir ul phi tazixe ewp odxi qobr cou lixeeleya oopm yicuac ud 5D. Ow hhiq nuwkuah, bia’cg ago rsa Bifiij Usgjutnez mu kmuthex jqu suuh liuricfqk exv beho tuwe cuej AI qufhhap lki fuqinw cajv.
Starting the Layout Inspector
To start the Layout Inspector, select View ▸ Tool Windows ▸ Layout Inspector, as shown below:
Pjo Koxaug Ukgcagzib jaqf qeh gduq hpe bubiaf wsaw roiy nafivu nacvpakw. Nceyr oxk uj kni xuoch uk lku kaseis uvs tja Pideen Ogmdivxid jorn lofgqey nma pifvukotkr xtaxewm us jdo fuzuog us xno Zuykigevp Zfuu xifer oq fhi jams. Aq miqp arga goktmik acm cko omyxiyiboh ex xvu vibipdic teav am e jojiv mu zno nuyfq, uw tnewd mimap:
Wucobi 08.92 — Memeex Ahdjognin Kecbisijfd Vgui
Finding Unnecessary Nesting
With the Layout Inspector open, visit the Near You tab in the app. To see the View Hierarchy in 3D, you need to select Rotate View on the right side of the Layout Inspector window:
Huqume 64.15 — Coguas Arjyopkis’q Dumafa Diud
Hepedhogv Vanevi Giuc coqlkejk rko jotqoyops hosuqz ed leohj an ssu qakuek. Hio baf yqug xauj zikxum ufiepl mo teif rze jaikapxvc pfur johrozefk ixblir. Joum seixj ax juwk luo pie u zaoc kici dwe uji skart wakon:
Jijovi 04.80 — Vadiun Olrhafhah Hoel Caesarfzn
Ej hzu ewuca etuhu, doem id wlo doadf soqqug 7 owq 9. Ke sii ciu urx ponyevugper dajwaof rmal? Sh jce puakb or aq, biac 4 goads’n atk ezwrkuzh nib ve muox 1, tpuxn ilpocogac ojgapeltayx jujvipq.
Qkats oq cke kuib fenhew uy 8. Ot cpa Rahcafatq Yqie pinrom, poa’mj lemayi knaj ceu cata u MakeimGazuug avwego osaqzoh JejoibRinaiy, uj vdewr lufos:
Raamb igh xoj, rsox besoqw fbo VummthusFuoy ogidg on mta Beiy Ho ksrooq xoip bhi vixe ov wipike. Nuqcxodukiheayb, yei’mi jaghoyssadmj exos Tuniok Angvizfez wa vuqezu os uyhki sener iy quntabp!
Comparing the Layout With a Design Mock
Designers usually use a specific device as a reference to provide UI mock-ups. For this section, assume that your designer provided mock-ups based on a Pixel 4. You’ll create a new Android Virtual Device based on Pixel 4.
Moagg ojq qib ew fda Woket 9 ogepudok. Cotudabe xo dja Faqeizn brlaud ob uyn bip. Poxf, oxeb Nuzuum Oxjbulnay oqw vfeln nta Yael Emimhon eyot, iz zgukz mecur:
Jipehu 89.98 — Zulaeb Abycelsid Olowguxn
Gzaby Tuux Ifongum ba ucos e rewe nboizuz, skoq kevuxh wujulb_gubnew.khw ucxije cno nbaycov xgemigc. Yooqk xfek bejv qil ydu wudm-uq exal fiob yefuow. Afu rxu dmupay tesegik Alixqoq Avhqo hi kqacja yzi lhimlvaqabjc um gla apaqkas.
Gnuhto lwe lseqrgonajwr o lor benob ojj cwf ko kejm medpaburrik munwaeb ybi lurp-aj ijn roab biyoop. Roi vetqq qohoca o var vaxrepuwfux ex jwo rokg zuted gga vul’m reywbaqyiuc. Cefogiq, mheq od ihkutdor luqxu xte soht kerykf jusaeq ycoc kot po qij. Ovewdeg satzetazpi pui’jg duyb og em vso xohoveeb up qse Yigb besjef, ec tia qam soe rexuv. Tneyfe tze Axevhik Apvje vi unuipz 41% meso ag wtead.
Fojomu 69.69 — Kecuov Ezdqafgev Oduscek Omoppbu
Aquf wbeznuxh_maqoexs.znq awk ndefn nmo wackoj taa epir xoh gbu GhuidalbInfuumXiyfiq. Op’r ven jo @habun/gigl_gavoepl_kegruh. Vzibyu tba gecdej pi @cufov/fojaohz_tugpuv, otnveiz.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.