Kako se učinkovitije prijaviti u Timber

Zapisivanje je jedan od najčešće korištenih uslužnih programa u Androidovom okviru. Zaista je korisno u otklanjanju pogrešaka u vašem kodu, jer otklanjanje pogrešaka prema prekidnoj točki jednostavno neće raditi.

Općenito je dobra praksa stavljati izjave dnevnika u svoj kod. Ove vam izjave pomažu u praćenju kontrole protoka u vašoj aplikaciji. Slično tome, ne preporučuje se imati izjave dnevnika u kodu spremnom za izdanje, jer te izjave dnevnika može pročitati svatko tko svoj telefon poveže s računalom. Dakle, kada puštate svoju aplikaciju u trgovinu za reprodukciju, preporučuje se ukloniti sve izjave iz vašeg koda.

Ali ovo može biti prava muka. Po vašem kodu ima toliko izjava iz dnevnika. Sada morate pronaći svaku i ukloniti je iz koda za izdanu verziju.

Drugi problem sa zadanim mehanizmom zapisivanja je taj što morate proslijediti TAG svaki put kad napišete izvod iz dnevnika.

Ne bi li bilo prekrasno kad bi se izrazi dnevnika automatski onemogućili tijekom proizvodnje? Ne bi li bilo sjajno kada bi izvještaji Dnevnika automatski bilježili TAG / naziv klase tijekom prijavljivanja i kada biste se mogli usredotočiti na pisanje boljeg koda?

Pa, probleme poput ovih i mnoge druge rješava bolja knjižnica za evidentiranje na androidu, nazvana Timber (Jake Wharton).

Lagana je knjižnica koja se lako koristi. Vodi brigu o većini održavanja koje morate obaviti tijekom prijave kako biste se više mogli usredotočiti na pisanje izvrsnog koda, a manje na stvari za održavanje.

Idemo naprijed i stvorimo uzorak aplikacije kako bismo vidjeli kako možete uključiti drvo u svoju aplikaciju za Android i olakšati život u prijavi.

Početak rada

Stvorit ćemo jednostavnu Android aplikaciju s 4 gumba. Svaki bi gumb ispisao različite izjave dnevnika prioriteta na konzoli.

Stvorite novi projekt u Androidu i dodajte ovisnost za Drvo u datoteku build.gradle na razini aplikacije. U vrijeme pisanja ovog članka, ovo je najnovija verzija ovisnosti o drvetu:

implementation 'com.jakewharton.timber:timber:4.7.1'

Inicijalizacija drva

Nakon preuzimanja ovisnosti, sada je vrijeme za inicijalizaciju drvne biblioteke. Najbolje mjesto za inicijalizaciju drva je u klasi Application koja će biti aktivna tijekom cijelog životnog vijeka aplikacije. Pa, kreirajmo prilagođenu klasu aplikacije i u njoj inicijalizirajmo našu Timber knjižnicu :

class MainApplication : Application() { override fun onCreate() { super.onCreate() if(BuildConfig.DEBUG){ Timber.plant(Timber.DebugTree()) } }}

Stvaranje glavne aktivnosti

Stvorimo sada našu MainActivity dodavanjem 4 gumba i postavljanjem slušatelja klikova na svaki od njih. Evo moje datoteke Activity_main.xml. Koristim ConstraintLayout kao svoj korijenski izgled i uključujući po 4 gumba za različite razine bilježenja.

Sada je vrijeme da postavite slušatelje klikova na ove gumbe i ispišete zapisnik dnevnika svaki put kad se klikne na gumb. Koristim sintetičke veze kotlina umjesto uobičajenih findViewById poziva ili Butterknifea. Evo moje datoteke MainActivity.kt :

class MainActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
 btn_error.setOnClickListener { onClickedError() }
 btn_info.setOnClickListener { onInfoClicked() }
 btn_debug.setOnClickListener { onDebugClicked() }
 btn_verbose.setOnClickListener { onVerboseClicked() } }
 private fun onVerboseClicked() { Timber.v("On Verbose Clicked") }
 private fun onDebugClicked() { Timber.d("On Debug Clicked.") }
 private fun onInfoClicked() { Timber.i("On Info clicked.") }
 private fun onClickedError() { Timber.e("On Error Clicked.") }
}

Primijetite kako nismo trebali inicijalizirati nijednu TAG varijablu u našoj klasi, Timber to čini automatski umjesto vas.

Prilagođavanje drvne građe za otklanjanje pogrešaka i izdavanje

E sad, ovdje drvo zaista sjaji . Ono što smo do sada učinili nije bilo sjajno, samo ispisivanje izvještaja dnevnika na klikove gumba. Ali kao što znate, prijava u proizvodnju nije dobra ideja. Napisat ćemo kôd kako bismo onemogućili zapise za produkciju, a da ih držimo omogućenima tijekom načina uklanjanja pogrešaka.

Napisat ćemo blok if da provjerimo je li naša aplikacija u načinu otklanjanja pogrešaka i omogućimo bilježenje za to. Ako ne, tada želimo inicijalizirati drvo pomoću prilagođenog stabla.

Evo modificirane klase MainApplication.kt :

class MainApplication : Application() { override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { Timber.plant(object : Timber.DebugTree() { override fun createStackElementTag(element: StackTraceElement): String? { return String.format( "Class:%s: Line: %s, Method: %s", super.createStackElementTag(element), element.lineNumber, element.methodName ) } }) } else { Timber.plant(ReleaseTree()) } }}

Kao što vidite, drvo smo inicijalizirali pomoću prilagođenog ReleaseTreea u načinu puštanja. Ajmo sada stvoriti vlastito stablo izdanja.

Izrada prilagođenog stabla

Stvaranje stabla izdanja prilično je jednostavno. Stvorite novu klasu Kotlin i proširite je iz Timber.Tree. Primijenite sve apstraktne funkcije i spremni ste za početak.

Evo mog ReleaseTree.kt :

class ReleaseTree : @NotNull Timber.Tree() { override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { if (priority == Log.ERROR || priority == Log.WARN){ //SEND ERROR REPORTS TO YOUR Crashlytics. } }
}

Kao što vidite, kad god se dogodi pogreška, možemo poslati zapisnik internetskoj usluzi kao što je Firebase CrashAnalytics ili Crashlytics, a ne odjaviti se iz produkcije.

Proizlaziti

Prednosti upotrebe Timber vs Android Logging

Pogledajmo neke od prednosti korištenja Timber biblioteke umjesto zadanog uslužnog programa Log android sdk.

  • No need to worry about TAGS: Timber generates the TAGs automatically for you so you don’t have to worry about including a global TAG in every class.
  • No need to manually remove Log statements: As already shown, it’s really easy to disable Logging for release apps. Hence, you no longer have to go through your entire code and manually remove all the logs.
  • Customized behavior on production: In production versions, you don’t want to log, although you definitely want to log any crashes that might occur. You can implement this by using a custom debug tree (as shown above) which instead of logging to the logcat, sends the logs to your crashlytics service.
  • Customized Meta-Data: You can include customized metadata with your log statements. For example, I’ve added class name, line number and method name from which the log statement is getting printed in the implementation above. Having this data at your disposal can make debugging easier.
  • Lightweight: Does not increase your app size/method count by much. Really lightweight library as it is just a wrapper over the already existing log utility.

Conclusion

For a long time I had ignored the use of log statements and printing out better logs. As my code got bigger and problems got more complex, I realized I needed to adopt better and more efficient debugging routines. Hence, using Timber is one step in the right direction.

*Important* : I’ve created a SLACK workspace for mobile developers where we can share our learnings about everything latest in Tech, especially in Android Development, RxJava, Kotlin, Flutter, and overall mobile development in general. Click on this link to join the slack workspace. It’s absolutely free! This article was originally posted at //ayusch.com/timber-for-android

Like what you read? Don’t forget to share this post on Facebook, Whatsapp, and LinkedIn.

You can follow me on LinkedIn, Quora, Twitter, and Instagram where I answer questions related to Mobile Development, especially Android and Flutter.