Lekce 7 - Android programování - Dokončení implementace kalkulačky
V předchozím kvízu, Kvíz - Tvorba GUI pro Android aplikace v Kotlin, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu si ukážeme ladění Android aplikace a vygenerujeme
instalační soubor .apk
kalkulačky.
Testování a ladění aplikace
Android Studio nabízí několik nástrojů, které nám pomohou při ladění aplikace. Pomůže nám také při hledání chyb, které by mohly způsobovat pády aplikace. Pojďme se s nimi hodně stručně seznámit! Nejprve si popsané pomocníky vyjmenujeme:
- Android Profiler
- Debugger a boj s errory
- Nástroj Logcat
Android Profiler
Nástroj Android Profiler je dostupný od verze Android Studia 3.0. Tento
nástroj poskytuje data v reálném čase. Díky nim můžeme zjistit, jak naše
aplikace využívá prostředky jako procesor, paměť, připojení k internetu
a baterii. Android Profiler najdeme v menu pod položkou View ->
Tool Windows -> Profiler. Otevře se nám okno (viz.
následující obrázek). Abychom viděli nějaká data, musíme spustit
aplikaci na nějakém zařízení. Po spuštění projektu
SimpleCalc
, na námi vytvořeném virtuálním zařízení, v
Profileru uvidíme něco podobného tomu, co je na následujícím obrázku:
Pokud po spuštění aplikace neuvidíte žádná data, klikněte na
tlačítko +
v levém horním rohu v okně Profileru, vpravo od
nápisu SESSIONS. V rozbalené nabídce zvolte aktuální projekt.
Využití baterie lze sledovat pouze u aplikací běžících na zařízení s Androidem 8.0 (API 26) a vyšší.
Debugging
Ladění je jednou ze základních součástí každodenního života vývojáře. Vždy se snažíme psát bezchybný kód a bezchybné aplikace. Ladění nám umožňuje procházet jednotlivé řádky kódu, sledovat obsah proměnných aplikace atd. Nejlepší bude ukázat si to na příkladu. V projektu kalkulačky si v debuggeru zobrazíme obsah některých proměnných. Určíme místa v kódu, ve kterých budeme chtít "dát pauzu". Tyto body se jmenují breakpointy a vytvoříme je kliknutím vlevo vedle řádku, který nás zajímá - viz obrázek:
Po kliknutí na popsané místo levým tlačítkem myši se na něm zobrazí červené kolečko. Dalším kliknutím na kolečko tento breakpoint zrušíme. Seznam všech breakpointů zobrazíme kliknutím na záložku Favorites na levé straně okna, kde v otevřeném okně rozbalíme nabídku Breakponits. U každého vidíme název souboru a číslo řádku, na kterém se daný breakpoint nachází. Dvojklikem na jakýkoliv breakpoint v tomto seznamu se přesuneme do místa v kódu, kde tento breakpoint je:
Jak je vidět na předchozím obrázku, máme v kódu celkem dva breakpointy.
Nyní spustíme aplikaci v zařízení (skutečné nebo virtuální) tlačítkem se zeleným broučkem - viz obrázek:
Ve chvíli, kdy je prováděn příkaz, který je označen breakpointem, je aplikace pozastavena a otevře se okno debuggeru, ve kterém najdeme některé naše proměnné, včetně hodnot, které v tu chvíli obsahují. Ukažme si další obrázek, na něm je šipkou označena i zelená ikona, díky níž můžeme pokračování v běhu aplikace. Tedy pokud se neobjeví další breakpoint, na kterém se aplikace znovu zastaví:
Zobrazení errorů při pádu aplikace
Nejsme dokonalí a i přes veškerou snahu se najde chvíle nepozornosti a v
kódu uděláme chybu, která se projeví až za běhu aplikace. Pád aplikace a
reakci Android Studia na ní si opět ukážeme na příkladu. A to tak, že v
projektu kalkulačky záměrně vytvoříme podmínky pro pád. V souboru
MainActivity.kt
zakomentujeme tento řádek kódu v metodě
onCreate()
:
spinnerOperation = findViewById(R.id.spinnerOperation)
Jde o proměnnou, uchovávající referenci na Spinner
v XML,
kterým uživatel vybírá matematickou operaci. Zakomentováním zabráníme
inicializaci proměnné spinnerOperation
.
Chyba nastane již při startu aplikace, protože se na konci metody
onCreate()
pokusíme komponentě Spinner
nastavit
adaptér. Proměnná spinnerOperation
není inicilizovaná a
aplikace spadne s chybou UninitializedPropertyAccessException
.
Otevřeme si v menu okno Logcat takto: View -> Tool Windows -> Logcat a spustíme aplikaci. V tomto případě nemusíme aplikaci spouštět v debug módu, stačí aplikaci pouze spustit tlačítkem se zelenou šipkou:
Brzy po spuštění dojde k pádu aplikace a v okně Logcatu se objeví hromada červeného textu s důvodem pádu. V tomto textu nalezneme modrý podtržený text (vypadá jako odkaz). Když na něj klikneme, přesuneme se v kódu na ten řádek, ve kterém k chybě došlo. Pokud je v Logcatu takto označených míst více, máme tak i odkazy na části kódu, jejichž vykonávání pádu bezprostředně předcházelo.
Nástroj Logcat
Tento nástroj jsme již nakousli v předchozím odstavci o boji s errory a
ještě jej potkáme v lekci o životním
cyklu Activity, kdy si v Logcatu necháme vypisovat volání metod
životního cyklu hlavní aktivity aplikace Hello World!
. V okně
Logcat se zobrazují různé systémové zprávy. A zobrazují se zde i zprávy,
které do kódu přidáme sami. Zprávy jsou zobrazovány v reálném čase
jedna za druhou a je možné v nich listovat zpětně a prohlížet starší
zprávy.
Můžeme vytvořit různé filtry pro zobrazování vybraných zpráv nebo
zobrazovat pouze vlastní zprávy generované kódem aplikace. A samozřejmě,
jak již víme, zobrazuje i errory způsobující případný pád aplikace za
běhu. Pro zobrazování zpráv v Logcatu je nutná instalace konkrétní
aplikace do zařízení (připojeného k počítači kabelem, nebo vytvořeného
virtuálního zařízení). Zopakuji, že Logcat otevřeme v menu View
-> Tool Windows -> Logcat, nebo kliknutím na záložku
v dolní části Android Studia. Pomocí třídy Log
můžeme v
kódu vytvářet zprávy, které budou zobrazeny v Logcatu, zde seřazené od
nejvyšší k nejnižší prioritě:
Log.e(tag: String, message: String)
(error)Log.w(tag: String, message: String)
(warning)Log.i(tag: String, message: String)
(information)Log.d(tag: String, message: String)
(debug)Log.v(tag: String, message: String)
(verbose)
Příklad vytvoření zprávy v kódu:
Log.d("muj_tag", "Some message from the application code")
Při vytváření zprávy je dobrým zvykem jako tag nepoužívat přímo
textový řetězec, ale předem deklarovanou konstantu typu String
takto:
var MUJ_TAG = "muj_tag" Log.d(MUJ_TAG, "Some message from the application code")
Opět si popsané vyzkoušíme v projektu kalkulačky. Jednu zprávu
vložíme do metody onCreate()
:
Log.d(MUJ_TAG, "onCreate()")
Druhou zprávu přidáme do metody calculate()
:
Log.d(MUJ_TAG, "Výpočet: $number1 ${spinnerOperation.selectedItem} $number2 = $result" )
Díky těmto zprávám můžeme v okně Logcatu sledovat volání metody
onCreate()
a také každý výpočet.
Otevřeme Logcat a do pole pro filtrování zpráv vložíme
tag:muj_tag
, pro zobrazení pouze našich zpráv označených
tímto tagem a level:debug
pro zobrazení pouze do úrovně
debug
:
Filtrování zpráv je velice užitečné. Systémových zpráv je totiž Logcatem vypisováno poměrně hodně a hledání vlastních zpráv by bylo komplikované.
Aplikace je hotová, ukázali jsme si, jakým způsobem ji ladit a zbavovat
chyb, pojďme si tedy vygenerovat instalační soubor .apk
, díky
kterému můžeme zajistit její distribuci
Vygenerování instalačního souboru aplikace
Dejme tomu, že potřebujeme vytvořenou aplikaci publikovat (nemám teď na mysli přímo Google Play), někomu odeslat k otestování, nebo se s ní jen budeme chtít pochlubit. K tomu musíme vytvořit instalační soubor. V několika následujících krocích si projdeme postup, jak na to:
- V menu klikněte na Build a v rozbalené nabídce zvolte Generate Signed Bundle/APK:
- V okně Generate Signed Bundle or APK zaškrtněte druhou možnost (APK) a potvrďte tlačítkem Next:
- V dalším okně budete vyzváni k zadání cesty, hesla k úložišti klíčů, k zadání názvu konkrétního klíče této aplikace a jeho hesla. To proto, že každý instalační balíček musí být podepsaný. My zatím žádné úložiště klíčů, ani žádný klíč vytvořený nemáme, proto klikneme na tlačítko Create New:
- V okně Choose keystore file, v horní části, zvolíme cestu k
místu, kde budeme mít úložiště klíčů. V dolní části okna toto
úložiště pojmenujeme a potvrdíme tlačítkem OK. Takto, na
zvoleném místě v počítači, vytvoříme soubor
.jks
, kam můžeme ukládat naše budoucí klíče:
- Otevře se nám okno New Key Store. V horní části vidíme cestu k právě vytvořenému úložišti klíčů. Pod cestou k úložišti zvolíme nějaké jeho heslo a pro potvrzení zopakujeme do vedlejšího pole. V další části okna už budeme vytvářet nový klíč k naší aplikaci s kalkulačkou. Na obrázku je vidět příklad, jak všechna pole vyplnit. Opět potvrdíme tlačítkem OK:
- Nacházíme se zpět v okně Generate Signed Bundle or APK z bodu
3), ale s již vyplněnými údaji o použitém klíči. Při příštím
generování souboru
.apk
tedy použijeme vytvořený klíč z úložiště klíčů a body 4) a 5) budou vynechány, protože stisknutím tlačítka Choose existing... najdeme umístění úložiště klíčů, zadáme jeho heslo, dále zadáme jméno konkrétního klíče (Key alias), jeho heslo a potvrdíme tlačítkem Next:
- V dalším okně označíme položku release a dole zaškrtneme obě políčka (volbu V1 i V2). Potvrdíme tlačítkem Finish, čímž spustíme build projektu:
- Po dokončení buildu se v pravé dolní části okna objeví oznámení o
dokončení akce a o umístění vygenerovaného souboru
.apk
. Kliknutím na modré locate bude soubor zobrazen ve složce:
- Pokud byste si během buildu odskočili a toto oznámení propásli, klikněte na zelenou bublinku v pravé dolní části okna, která informuje o nových událostech. Měla by být zelená. Pokud je červená, znamená to, že se něco nepovedlo. Kliknutím na bublinku zobrazíme okno, ve kterém nalezneme to, co potřebujeme:
Tímto máme hotovou první aplikaci i s vygenerovaným instalačním
.apk
souborem
Kompletní Kotlin kód včetně jednotlivých XML souborů máte v příloze.
V následujícím cvičení, Řešené úlohy k 5.-7. lekci Android v Kotlin, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 51x (15.96 MB)
Aplikace je včetně zdrojových kódů v jazyce Kotlin