Tag Archives: Työkalu

OUYA, Android-konsoli

Kesälomalta paluu sorvin ääreen voi olla raskasta tai hauskaa… Kesälomalla hankittujen lelujen kanssa siitä onneksi saa hauskaa.

OUYA on Kickstarter-rahoituksen avulla luotu Android 4.1 -konsoli, jossa pyörivät kaikki normaalit Android-applikaatiot ilman suurempaa vaivaa. Konsoliin saa helposti ladattua SDK:n, jonka avulla ohjainta voi käyttää applikaatioissaan, mutta hiirellä ja näppäimistölläkin voi konsolia suoraan käyttää.

OUYA ei ole kovin tehokas konsoli eikä pelitarjonta ole vielä kovin laaja, tätä artikkelia kirjoitettaessa vain 384 peliä, mutta 99$ hintansa puolesta se on hyvä hankinta arcade pelien pelaamiseen olohuoneen sohvalla kavereiden kanssa.

Yrityksille OUYA tarjoaa halvan ja helpon ratkaisun tarjota interaktiivista sisältöä asiakasnäyttöihin. Valmiin applikaation kääntäminen ja asentaminen OUYA:lle on hyvin helppoa. Kehittäminen OUYA-konsolille ei ole yhtään sen vaikeampaa kuin mille tahansa muulle Android-laitteelle. Toki pieniä muutoksia joudutaan tekemään käyttöliittymään, jotta normaalisti kosketusnäytölle tarkoitettua applikaatiota voi käyttää peliohjaimella tai hiirellä. Kosketusnäytön korvaaminen hiirellä tai muulla ohjaimella johtaa helposti hyvin heikkoon käyttökokemukseen.

 

Asentaaksesi minkä tahansa applikaation OUYA:lle pitää sinun voida ladata applikaation .apk-tiedosto Internetistä. Mene OUYA:n kotinäkymän MAKE-valikkoon ja sisäänrakennetulla Internet-selaimella lataa APK-tiedosto. Tämän jälkeen palaa päävalikkoon, mene MANAGE-valikkoon, valitse SYSTEM ja siellä valitse ADVANCED. Tämä on jokaiselle Android-käyttäjälle tuttu asetukset-valikko Androidissa. Mene listassa alaspäin ja valitse Storage, jonka sisällä valitse Download. Täältä löydät juuri lataamasi APK-paketin ja asentaminen onnistuu ohjaimen O-napilla. Tämän jälkeen applikaatio löytyy samasta MAKE-valikosta kuin OUYA:n Internet-selain.

Samaan MAKE-valikkoon tulevat myös applikaatiot, jotka itse kehität ja asennat tietokoneen ADB:n avulla microUSB:n kautta.

Kehittäminen OUYA:lla

Kaikki OUYA-konsolit toimivat applikaatioiden kehittämiseen ilman maksuja tai muutoksia konsoliin. Jotta saat OUYA:n toimimaan normaalissa Android-kehitysympäristössäsi Macilla sinun täytyy vain lisätä kolmannen osapuolen USB Hex ID (0x2836) adb_usb.ini -tiedostoon .android-hakemistossa ja käynnistää ADB uudelleen. Tarkemmat ohjeet myös Windows-koneille on katsottavissa videona OUYA developers -sivustolta. Tämän jälkeen OUYA-konsolisi näkyy Eclipsessä ja ADB:ssä samalla tavalla kuin mikä tahansa muu Android-laite.

Seuraavaksi lataa OUYA Development kit (ODK) osoitteesta https://devs.ouya.tv/developers/odk, kopioi libs\-hakemistosta ouya-sdk.jar ja lisää se omaan Android-projektiisi. Tämän jälkeen ohjaimen komennot saa kiinni oman Activity -luokkasi onKeyDown() ja onGenericMotionEvent() -metodeista.

Tein tätä artikkelia varten yksinkertaisen applikaation, joka käyttää ODK:ta siirtelemään ImageView:tä FrameLayoutin sisällä.

Ota ohjain käyttöön Activity-luokan onCreate()-metodissa:

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	OuyaController.init(this);
}

Tunnista ohjaimen komennot:

@Override
public boolean onKeyDown(final int keyCode, KeyEvent event) {
	switch (keyCode) {
		case OuyaController.BUTTON_O:
			Log.d(TAG, "OUYA button O");
			break;
		case OuyaController.BUTTON_U:
			Log.d(TAG, "OUYA button U");
			break;
		case OuyaController.BUTTON_Y:
			Log.d(TAG, "OUYA button Y");
			break;
		case OuyaController.BUTTON_A:
			Log.d(TAG, "OUYA button A");
			break;
	}
	return true;
}
@Override
public boolean onGenericMotionEvent(final MotionEvent event) {
// Joystick
	if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
		float LS_X = event.getAxisValue(OuyaController.AXIS_LS_X);
		float LS_Y = event.getAxisValue(OuyaController.AXIS_LS_Y);
	}
	return true;
}

Tämän jälkeen voit tehdä ohjaimen antamilla komennoilla mitä itse haluat.
Koko koodin ja Eclipse projektin saat ladattua Githubista:
https://github.com/Androidkehitys/OUYA

Onnea pelikehitykseen! Palataan leikkimään telkkujen kanssa, kun Cromecast saapuu postissa.

Testaus Androidilla

Testaus yleisesti

Testaus, tuo ohjelmistokehityksen välttämätön paha. Testausta ei koskaan voi suorittaa täysin kattavasti, eikä ole ohjelmistoa, jossa ei olisi yhtään virhettä, paitsi ehkä Nasalla. Testauksella kuitenkin kasvatetaan merkittävästi ohjelmiston laatua ja viimeistään työelämässä tämä osa-alue on hyvä hallita.

Testaus, niin kuin kaikki muukin välttämätön epämukavuus on hyvä suorittaa kehityksen ohella, kuin sen jälkeen. On paljon helpompaa testata se mitä on juuri tehnyt, kuin kaikki mitä on tehty kehitysvaiheen aikana. Testaus kehityksen yhdeydessä  tekee koodista myös helpommin testattavaa. Jälkikäteen testattaessa voi hyvinkin olla mahdotonta tehdä testejä ilman koodin muuttamista.

Tässä artikkelissa käymme läpi Androidin testivälineitä ja -käytäntöjä.

Testit on hyvä suunnitella yksinkertaisiksi, toistettaviksi ja mahdollisimman vähän aikaa vieviksi. Hyvä ratkaisu tähän on testikoodi, jotka voi sitten vain ajaa tarvittaessa. Jokaista loppukoodin luokkaa kohden on hyvä tehdä oma testiluokkansa, joka testaa luokan julkiset metodit “riittävällä” testijoukolla. Hyvä nyrkkisääntö on, ettei testimetodeita ole koskaan liikaa, eikä yhden metodin kannata kaikkea tehdä.

Yksikkötestaus JUnitilla

Eclipseen tulee Android SDK:n mukana valmis wizard Android JUnit testiprojektien luomiseen. Yksityiskohtainen ohje JUnit testien tekemiseen ja ajamiseen löytyy developer.android.com sivustolta: Hello, Testing. Käymme muutaman yksityiskohdan läpi, oman testikoodin ja testisalkun avulla. Testisalkku on kokoelma testiluokkia, jotka suoritetaan peräkkäin. Jokaisen testiluokan voi suorittaa myös erikseen.

Android developers sivuston esimerkissä on huonosti mainittu, että testi projektiin pitää muistaa lisätä linkki testattavaan projektiin. Voit lisätä tämän projektin asetuksista (properties), “Java build path” valikosta, “projects”-välilehdestä. Tai testiprojektia luotaessa heti toisessa valikossa, joten muista painaa “next” äläkä “finnish”. Developer sivuston esimerkki on myös hiukan vanhemmasta Android SDK:sta, mutta sisältö on sama, vain luonti wizard on yksinkertaistunut.

- Testisalkku:

package fi.androidkehitys.esimerkkiapp.test; import junit.framework.Test; import junit.framework.TestSuite; public class AllTests { /** * Testisalkku, missä kaikki testiluokat lisätään. * @return Test */ public static Test suite() { TestSuite suite = new TestSuite(AllTests.class.getName()); suite.addTestSuite(EsimerkkiTesti.class); return suite; } }

Testisalkun voi ajaa suoraan “run as” ja “Android JUnit test”.

- Testiluokka:

package fi.androidkehitys.esimerkkiapp.test;

import fi.androidkehitys.applikaatio.MyActivity;
import java.util.List;
import android.test.ActivityInstrumentationTestCase2;

public class RSSTest extends ActivityInstrumentationTestCase2<MyActivity> {

    public RSSTest() {
        super("fi.androidkehitys.applikaatio", MyActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    /**
    * Testi metodi.
    *
    */
    public void testPotenssiMetodiOne() {
        assertTrue(“Metodi parametrillä 1 palautti väärän arvon”, potenssiMetodi(1) == 1);
    }
    public void testPotenssiMetodiTwo() {
        assertTrue(“Metodi parametrillä 2 palautti väärän arvon”, potenssiMetodi(2) == 4);
    }

    @Override
    protected void tearDown() throws Exception {
        getActivity().finish();
        super.tearDown();
    }
}

Testiluokan kaikki julkiset metodit ovat testi tapauksia ja suoritetaan testauksessa. Tässä testiluokassa ei tarvitsisi käyttää aktiviteettiä vaan tehdä yksinkertainen TestCase-luokan ilmentymä, mutta usein Android-metodit voivat tarvita kontekstin tai pääsyn resursseihin, joten yleisin yleisimmissä testitapauksissa tarvitset aktiviteetin parametrien käyttöön.

Aktiviteettien testaus on hiukan ongelmallisempaa yksikkötesteissä, koska view-komponenttejä ei saa käsitellä UI-säikeen ulkopuolella. Ratkaisu tähän on seuraavassa kappaleessa esiteltävä black box testaus ja Robotium framework.

Black box testaus Robotiumilla

Black box testauksella tarkoitetaan testausta, missä ei tarvitse pääsyä koodiin, vaan painellaan laatikon nappuloita. Robotiumille riittää päästä käsiksi applikaation .apk pakettiin. Black box testauksella pystyy tekemään monimutkaisiakin käyttötapaustestejä, mutta yksinkertaisuus on yleensä parempi tavoite sillä monimutkaiset testit alkavat kaatua pienilläkin muutoksilla.

Android tarjoaa rasitustestaukseen oman Monkey Runner:in, joka simuloi satunnaisia, mutta toistettavia painalluksia applikaation näyttöön. Tällä on kuitenkin mahdotonta testata jotain tiettyä tarkasti määriteltyä ominaisuutta applikaatiossa.

Robotium on voimakas työkalu Andoridin black box testaukseen. Sen käyttö ei vaadi kattavaa tietoa applikaation koodista ja käyttö on hyvin suoraviivaista. Robotiumilla voi ActivityInstrumentationTestCase2-luokkaan luoda Solo-olion, joka käyttää ja testaa käyttöliittymäelementtejä.

@Override
protected void setUp() throws Exception {
    super.setUp();
    solo = new Solo(getInstrumentation(), getActivity());
}

public void testLogin() {
    solo.clickOnButton("Kirjaudu sisään");
    assertTrue(solo.waitForText("Kirjautuminen epäonnistui", 1, 120000));
}

@Override
protected void tearDown() throws Exception {
    try {
        solo.finalize();
    } catch (Throwable e) {
        e.printStackTrace();
    }
    getActivity().finish();
    super.tearDown();
}

Kun Solo:lle on annettu Instrumentaatio ja aloitus-aktiviteetti voi navigoinnin applikaatiossa hoitaa kokonaan Solo:lla. Voit myös mennä toisiin aktiviteetteihin ilman ongelmia, jos testitapaus tätä vaatii.

Lisää JavaDoc Robotiumiin

Robotiumin käyttö helpottuu huomattavasti, kun lisäät JavaDocin Robotiumin lähdekoodiin. Sekä lähdekoodin, että JavaDocin voit ladata täältä (uusimmat tiedostot listan alapäässä). Eclipsessä testiprojektin asetuksissa (properties), Java Build Path, Libraries ja lisättyäsi Robotium Solo .jar tiedosto avaa se vasemmassa laidassa olevasta nuolesta, valitse Javadoc location ja paina edit. Tämän jälkeen valitse ulkoinen tiedosto ja etsi Robotium javadoc .jar ja lisää se archive pathiin. Nyt näet Robotiumin JavaDocit Eclipsessä.

Nine-patch Androidissa

Graafinen käyttöliittymä vaatii paljon kuvaresursseja, ja mikäli on tarkoitus tukea erilaisia Android-laitteita, joudutaan tekemään samoista kuvista eriresoluutioiset versiot. Työ vähenee huomattavasti, jos kuvat venyvät sopivaan kokoon.

Nine-patch tarjoaa mahdollisuuden venyttää kuvia järkevästi, eli se venyttää vain määriteltyjä osia kuvasta. Muu osa kuvasta pysyy sellaisena, kuin se on kuvassa, eikä veny. Venyviä alueita voi kuvassa olla useita ja niiden kokojen suhteet pysyvät aina samoina.

Nine-patch-kuvaan on myös mahdollista määritellä alue, johon sisältö tulee. Tämä on erityisen käytännöllistä tehtäessä grafiikoita säiliöihin, kuten nappeihin. Kun napin kuvasta tekee pienen ja asettaa sen kasvamaan sisällön mukaan ja kun sisältö on määritelty napin keskelle, grafiikka tulee automaattisesti oikean kokoiseksi.

Kuinka tehdä 9-patch kuvia

Nine-patch kuvat ovat normaaleja png-kuvia, joissa on yhden kuvapisteen paksuinen reuna joka on joko täysin läpinäkyvä tai valkoinen. Tälle reunalle piirretään yhden kuvapisteen levyistä mustaa viivaa ja kahden eri sivuilla olevan viivan määrittämä leikkaava alue rajaa venyvän ja sisällön täyttävän alueen. Android laitteella nämä kuvat on talletettava muotoon “.9.png”, jotta Android tietää kuvien olevan nine-patchejä.

Vasemmalla ja ylhäällä olevat mustat viivat rajaavat venyvän alueen. Oikealla ja alhaalla olevat viivat taas rajaavat kuvan sisällön alueen.

Kuvat voi tehdä millä tahansa kuvankäsittelyohjelmalla, mutta helpoin tapa on käyttää Android SDK:n mukana tulevaa työkalua “draw9patch”. Ohjelma löytyy “tools” kansiosta.

Ohjelma lisää kuvaan yhden kuvapisteen kokoiset reunat ja antaa muokata kuvaa vain näiden reunojen alueelta. Ohjelma myös näyttää oikeassa laidassa miltä kuva näyttää eri tavoilla venytettynä.

Avattuasi ohjelman voit raahata haluamasi kuvan ohjelmaan. Tämän jälkeen näet kuvan venytyksen tuloksen oikealla ja kuvan muokattavana vasemmalla. Kuvassa kannattaa valita tasaisia – usein vain yhden pikselin mittaisia – alueita venyväksi, koska tällöin kuvan väritys ei muutu. On myös tapauksia, missä on järkevää venyttää väritystä niin että isommilla ko’oilla väritys muuttuu tasaisesti.

Voit asettaa kuvassa editorissa venyvän alueen näkyväksi “show patches” valinnalla. Venyvät alueet ovat violetit alueet, jossa vihreät viivat kohtaavat. Samalla tavalla saat sisällön alueen näkyviin “show content” valinnalla.

Huomaa miten kuvassa olevat yksityiskohdat pysyvät tarkkoina, vaikka muu kuva venyy täyttämään koko näytön.

Viime viikon animaatioartikkelissa on käytetty tässä esimerkkinä olevaa nine-patch kuvaa. Nine-patch kuvien käyttö onnistuu applikaatiossa täysin samalla tavalla kuin normaalien kuvien. Android itse hoitaa kuvan koon ja sisällön asettelun.

Esimerkkikuva ilman nine-patchiä.

Esimerkkikuva nine-patchin jälkeen.