Vyvíjíme pro Android: Nahraváme aplikaci na Google Play Store

Android logo

Dnešní díl seriálu „Vyvíjíme pro Android“ se bude týkat distribuce androidí aplikace. Ukážeme si, jak vytvořit .apk soubor, popereme se při tom s tvorbou ikon, krok za krokem si ukážeme, jak pracovat s Google Play a nahrajeme do něj naši aplikaci.

Seriál: Vyvíjíme pro Android (14 dílů)

  1. Vyvíjíme pro Android: Začínáme 15.6.2012
  2. Vyvíjíme pro Android: První krůčky 22.6.2012
  3. Vyvíjíme pro Android: Suroviny, Intenty a jednotky 29.6.2012
  4. Vyvíjíme pro Android: Bližší pohled na pohledy – 1. díl 13.7.2012
  5. Vyvíjíme pro Android: Bližší pohled na pohledy – 2. díl 13.7.2012
  6. Vyvíjíme pro Android: Fragmenty a SQLite databáze 20.7.2012
  7. Vyvíjíme pro Android: Preference, menu a vlastní Adapter 27.7.2012
  8. Vyvíjíme pro Android: Intenty, intent filtry a permissions 3.8.2012
  9. Vyvíjíme pro Android: Content providery 10.8.2012
  10. Vyvíjíme pro Android: Dialogy a activity 17.8.2012
  11. Vyvíjíme pro Android: Stylování a design 24.8.2012
  12. Vyvíjíme pro Android: Notifikace, broadcast receivery a Internet 31.8.2012
  13. Vyvíjíme pro Android: Nahraváme aplikaci na Google Play Store 7.9.2012
  14. Vyvíjíme pro Android: Epilog 14.9.2012

Napřed jako vždy zrekapitulujme, co jsme dělali v předchozím díle. Ten byl tentokrát hodně nabitý, vytvářeli jsme totiž aplikaci, která nás upozorní na nové články na Zdrojáku. Procvičili jsme si práci s notifikacemi, s Internetem, používali jsme broadcast receivery a naučili jsme se spouštět nějaké akce v určitý čas.

Vytvořená aplikace by se s trochou snahy dala předělat na univerzální upozorňovač a s větší trochou snahy na RSS čtečku. Protože na Play Store již jsou mnohem lepší RSS čtečky, nedělám si iluze, že by se naše aplikace nějak zvlášť používala. Ale protože se třeba i může pár lidem občas hodit (a hlavně se to dnes hodí nám), dáme ji k dispozici na Play Store.

Předtím nás ovšem čeká ještě docela dost práce. Musíme vytvořit všechny potřebné grafické materiály, musíme aplikaci zabalit a samozřejmě si musíme založit na Play Store vývojářský účet.

Dokončíme aplikaci

Z minula mám ještě jeden rest – musím vytvořit ikony notifikace pro Android 2.3 a pro Android < 2.3. Nejsem grafik, takže se tomu nijak zvlášť věnovat nebudu. Pouze původní čistě bílé j pro Android 2.3 obarvím šedým přechodem (90°, z #828282 na #919191). Pro Android < 2.3 je to složitější. Odněkud si musím opatřit čtverečkové pozadí a na něj potom čistě bílé j (samozřejmě s alphou) vložit.

Čtverečkové pozadí se mi s trochou práce podařilo extrahovat ze souboru /icon_templates-v1.0/statusbar-notification/Status-Icon-template.psd, který se nachází v zipu na této adrese.

A mimochodem, pokud vás to zajímá, Icon Templates Pack pro Android 2.3 si můžete stáhnout odsud, pro Android 4.0 odsud a odkaz na nejnovější verzi (v tuto chvíli je to právě 4.0) je ve článku Icon Design Guidelines.

Když mám ikony vytvořené pro všechny verze a ve všech rozlišeních, musím samozřejmě ještě vytvořit složky drawable-xhdpi-v11, drawable-hdpi-v11, drawable-mdpi-v11, a drawable-ldpi-v11 s ikonou pro Android >= 3.0; složky drawable-xhdpi-v9, drawable-hdpi-v9, drawable-mdpi-v9, a drawable-ldpi-v9 s ikonou pro Android 2.3 a složky drawable-xhdpi, drawable-hdpi, drawable-mdpi, a drawable-ldpi pro Android < 2.3.

Více to rozpitvávat nebudu. A jak se můžete přesvědčit na následujících obrázcích, vypadá to lépe než předtím:

Android 4.1

Android 2.3

Android 1.6

Máme hotovou aplikaci. A co dál?

Nevím, jak vy, ale já vždycky, když něco dokončím, mám pocit takového prázdna. Ta část, která mě baví, je pryč, ale pokud chci, aby můj výtvor někdo používal, je přede mnou ještě dlouhá cesta.

Testování

Unit testy, pokud používáte, byste měli vytvářet simultánně se psaním kódu. Stejně tak testy funkčnosti uživatelského rozhraní už máte – o těch mimochodem do budoucna plánuju článek. (Ano, hrubě jsem to zjednodušil, netřeba více pitvat.)

Ale předtím, než zveřejníte aplikaci, by to chtělo vyzkoušet ji na hardwarovém zařízení. Zkuste, jak se chová při změně prostředí, tedy například:

  • změňte orientaci displeje, (To je asi nejdůležitější bod, u jedné dřívější aplikace jsem na to zapomněl a hned jsem vás krmil nesprávnými informacemi, omlouvám se a napravím to v posledním článku.)
  • zkuste vypnout internet (pokud ho vaše aplikace potřebuje),
  • zkuste ji celou projít, proklikat a schválně se chovat neobvykle,
  • zkuste aplikaci vypnout tlačítkem zpět,
  • zkuste aplikaci „vypnout” tlačítkem domů a pak se na ni zase vrátit. Je vše v pořádku?

A takhle bych mohl pokračovat dál. Nedělá widget problémy, když se zvětší? Jsou v seznamu aplikací všechny správné ikony a názvy? Nejsou ony názvy příliš dlouhé?

Samozřejmě je také potřeba aplikaci vyzkoušet na všech podporovaných verzích Androidu, určitě se hodí alespoň jeden tablet (či emulátor velikosti tabletu).

Použitelnost

Bohužel jsem nedostal darem cit pro estetiku, použitelnost uživatelského rozhraní ani nic takového. A co jsem nedostal darem, to mě nebaví. Takže když si dělám utilitku pro sebe, moc neřeším, jak vypadá, jestli je někde tlačítko navíc nebo jestli je jasné, že je potřeba klepnout sem.

Na druhou stranu bych se ale rozhodně styděl něco takového zveřejnit.

Proto se já (a doporučuji to i vám, pokud to neděláte) vždy pokusím vytvořit nějakou podobu aplikace, se kterou jsem spokojen (nemyslím teď barvičky a design, ale spíše použitelnost – názvy a rozmístění položek, ovládací prvky, nastavení, chybové hlášky atd.), a tu potom dám k vyzkoušení kamarádům reprezentujícím cílovou skupinu. Podívám se, jak s aplikací zápolí, oni povídají, o čem přemýšlí, co je mate, co by čekali jinak. Na základě toho aplikaci přizpůsobím a upravím.

V podstatě provádím primitivní uživatelský test. Rozhodně všem, obzvláště vývojářům, kterým použitelnost nebo UX nic neříká, přečíst si knížku Webdesign – Nenuťte uživatele přemýšlet od Steva Kruga a praktického průvodce testováním od téhož autora. Zabývají se sice webem, ale jsou to knihy opravdu čtivě napsané a samotná myšlenka testování je univerzální.

Jméno aplikace

Možná máte jméno jasné už od začátku, možná se ale aplikace nejdříve jmenovala Asdasd a potom třeba Články. Ale takhle ji přece do světa vypustit nemůžeme.

Je potřeba rozhodnout se, jestli chceme vytvářet značku, a tedy aplikaci pojmenovat nějakým novým jménem, které si lidé přímo spojí s naší konkrétní aplikací, anebo jestli aplikaci nazveme obecně, podle toho, co dělá.

A ve skutečnosti může mít aplikace dokonce tři jména.

Jedno z nich je to, které vidíte v seznamu aplikací (tom, z nějž se aplikace spouští, který je součástí launcheru). To je jméno příslušné Activity (aplikace může mít v seznamu aplikací i více ikonek). Mělo by být krátké, aby určitě nebylo nikdy oříznuto. (Například Gameloft u Modern Combat 3 používal, pokud si dobře pamatuji, jen MC3.)

Druhé je jméno celé aplikace. S tím se setkáte například v seznamu aplikací v nastavení, kde je můžete přesunout na paměťovou kartu, odstranit nebo odstranit všechna jejich data. Nebo také třeba při (od)instalačním dialogu.

A třetí, poslední, je titulek aplikace v Play Store (ten se vás samozřejmě netýká, pokud Play Store nepoužíváte). Ten by měl být víceméně shodný s názvem aplikace, nicméně, pokud máte místo, může mít smysl například přidat na konec slovo SLEVA atp.

Ikony

Chcete-li aplikaci šířit mezi lidi, určitě by měla mít ikonu, která ji odliší od ostatních. Rozhodně tedy nepoužívejte takového toho zeleného Androida, kterého vygeneroval ADT plugin v < 20 při tvorbě nového projektu, a nedoporučuji ani modrý text na bílém pozadí, který generuje ADT v20.

Ikona by měla splňovat všechny požadavky a být k dispozici ve všech potřebných rozlišeních pro všechny možné DPI. Na androidím telefonu je ikona hlavním vizuálním identifikátorem vaší aplikace, dovolím si tvrdit (ač to nemám podloženo), že málokdo v launcherovém seznamu aplikací skenuje jejich názvy. Udělejte ji proto jednoduchou, jasnou a takovou, aby se nepletla s jinými aplikacemi.

Při tvorbě ikony doporučuji ideálně udělat ji vektorově a pak ji exportovat do rozlišení okolo cca 512×512 px, méně ideálně udělat bitmapově v rozlišení 512×512 px. Potom vytvořte nový projekt a při vybírání ikony zvolte Image, vyberte příslušný obrázek a jako Shape zvolte None. ADT plugin samostatně vytvoří všechna potřebná rozlišení ikony a umístí je do příslušných složek (plus vytvoří i jednu velikou ikonu pro Play Store, o té později). Pokud jste už předtím vytvořili projekt s nějakou dočasnou ikonou, ikony prostě překopírujte.

Překlad

Zkontrolovali jste, že všechny řetězce z UI jsou umístěné do surovin? I když to neplánujete, nikdy nevíte, jestli se vaše aplikace nestane populární a někdo vám nenabídne její překlad.

Zároveň bývá u aplikací, které necílí pouze na český (československý) trh (ani taková blbost, jako jednoduchý TODO list, na český trh necílí, zatímco naše aplikace pro Zdroják anglické ambice už z principu nemá), zvykem nabídnout jako výchozí jazyk angličtinu, zatímco češtinu dát do složky values-cs (eště raz sa ospravedlňujem slovenským čitateľom, lebo zabudám na slovenčinu).

Permissions

Zkontrolujte, jestli vaše aplikace vyžaduje ( <uses-permission>) jen ta oprávnění, která opravdu používá. Kalkulačka s oprávněním zjišťovat polohu je prostě divná.

A nejen z toho důvodu (mj. také trochu pochybuji o jejich efektivitě) mi jsou velmi nesympatické různé reklamní systémy, neboť obvykle vyžadují mnoho různých oprávnění, mezi nimi právě i zjištění polohy telefonu.

Min a Target SDK version

Předtím, než aplikaci vypustíte mezi lidi, zkontrolujte, jestli je Min SDK version nastavena opravdu na tu nejnižší možnou, na níž by měla vaše aplikace fungovat, anebo případně jestli máte dost dobrý důvod činit jinak.

Pokud jste neprováděli testování na různých verzích Androidu, dejte si také pozor na různé záludnosti Target SDK version. Pokud ji máte nastavenou na nějaké nízké číslo (a explicitně neřeknete jinak, jde-li to vůbec), i na nových verzích Androidu bude aplikaci používat starý motiv, místo šedého ICS „seznamového” menu se zobrazí černé „tabulkové” menu s ikonkami a tak podobně.

Naopak pokud máte vysokou cílovou verzi API, na starších zařízeních bude aplikace vypadat jinak.

Debugovací věci

Tahle poznámka se netýká jen Androidu, ale přesto ji řeknu, protože se mi to občas stává a je to otravné. Než aplikaci někam nahrajete, zkontrolujte, jestli jste odstranili/zakomentovali/vypnuli všechnu debugovací funkcionalitu. V lepším případě na uživatele vyskočí nějaká vulgarita symbolizující, že se program dostal na určité místo kódu, v horším případě jste třeba zapomněli přidat vašemu content provideru potřebná oprávnění.

Jak dostat aplikaci k lidem?

Dobrá, aplikaci máme hotovou (ve skutečnosti ji ještě musíme zabalit, ale před balením ještě potřebuji něco ukázat a před tím ukázáním potřebuji říct tohle). Jak ji dostaneme k lidem?

Na rozdíl od Applu Android umožňuje uživatelům používat i aplikace odjinud než z Play Store. (Ačkoliv to musí uživatel explicitně povolit, na Nexusu S s Jelly Bean v angličtině jde o nastavení  Security → Unknown sources.)

Distribuce APK souboru svépomocí

Za chvíli se k tomu dostaneme, ale pro případ, že nevíte, soubor .apk je zabalená androidí aplikace.

Nejjednodušší možnost je nabídnout někde na svých stránkách soubor .apk volně ke stažení. Kromě nutnosti, aby měl uživatel povolenu instalaci z neznámých zdrojů, je tu problém s aktualizací, kterou, pokud se nepletu, musíte vyřešit sami (tím myslím kontrolu nové verze programu).

Já .apk soubory rozesílám jen při testování aplikace (rozuměj pošlu pár kamarádům, aby mi řekli, co oni na to).

Alternativní obchody s aplikacemi

Existuje mnoho alternativních Marketů, na něž můžete nahrát svou aplikaci. Hanbaté obrázky si seženu jinde, takže jsem nikdy alternativní market nepoužil ani jako uživatel, natož jako vývojář.

Play Store

Google Play Store, dříve Android Market, je googlovský obchod s digitálním zbožím. U nás jde jen o androidí aplikace, ale v USA tam lze nakupovat i písničky, knihy, filmy nebo seriály.

Pro nás jako androidí vývojáře má Play Store několik výhod:

  • Je jako výchozí na většině Androidů a používá ho nejvíce lidí.
  • Ze všech marketů má punc toho nejméně nebezpečného.
  • Nabízí i prodej aplikací (dokonce i u nás).
  • Má klientskou aplikaci (a je i hlouběji integrován) na většině telefonů.
  • Nabízí jednoduchý způsob aktualizace aplikace na novou verzi.
  • Filtruje aplikace pro každého uživatele podle toho, jaké schopnosti telefonu aplikace vyžadují (např. fotoaparát). To detailněji za chvíli.

Nevýhodou Play Store pro někoho může na druhou stranu být, že i když budete zveřejňovat jen aplikace zdarma, musíte při registraci zaplatit 25 USD.

Co ještě můžeme přidat do manifestu?

Jak jsem se před chvílí zmínil, Play Store umí filtrovat podle dat zadaných v manifestu. Například aplikaci nezobrazí zařízením, která mají verzi Androida nižší než je min SDK version. Možností je ale daleko více, neuvedu všechny.

<support-screens>

Element <support-screens> vám umožní definovat požadavky aplikace na displej uživatelova telefonu. Nemyslím, že ho použijete nějak často.

<uses-configuration>

<uses-configuration> slouží k definovaní některých potřebných hardwarových vlastností telefonu, jako je typ hardwarové klávesnice, dotykový displej či trackpoint.

Elementů <uses-configuration> můžete mít v manifestu více, telefon vyhovuje požadavkům aplikace, pokud splňuje všechny požadavky uvedené (nejméně) na jednom z nich.

<uses-feature>

Díky elementu <uses-feature> můžete definovat, které vlastnosti telefonu aplikace používá či přímo vyžaduje. Jejich kompletní tabulku si můžete prohlédnout tady.

Používá-li má aplikace například fotoaparát, ale dokáže se obejít i bez něj (třeba nějaký správce kontaktů), deklaruji to v manifestu takto:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Pokud naopak nemá vůbec smysl, aby byla například na telefonu bez bluetooth, dám to najevo takto:

<uses-feature android:name="android.hardware.bluetooth" android:required="true" />

Vynechám-li atribut android:required, jeho výchozí hodnotou je  true.

<uses-feature> se týká i elementu <uses-permission>. Pokud jsme si například požádali o android.permission.CAMERA, Play Store automaticky předpokládá, že aplikace vyžaduje fotoaparát ( android:required="true"). Pokud tomu tak není (a aplikace může fungovat i bez fotoaparátu), musíte to explicitně říci:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Žádný z předchozích elementů není samotným telefonem nikdy použit, slouží pouze jako informace pro Play Store (a ostatní, kteří analyzují .apk balíček), aby zjistili bližší informace o aplikaci. To ovšem nic nemění na tom, že znemožní zkompilovat aplikaci, je-li target SDK version nastavené na nižší verzi API, než ve které se příslušný element/atribut objevil. Týká se to například i atributu android:required, který přibyl až v API 5.

VersionCode a versionName

Samotný element <manifest> má dva teď důležité atributy: android:versionCodeandroid:versionName.

Oba se týkají verzí aplikace, ale zatímco versionCode musí být celé číslo, které obvykle s každou novou verzí zvýšíte o jedničku a které Play Store používá pro kontrolu nové verze, versionName je jakýkoli řetězec, který se ukáže jako verze uživateli. Může být jak ve formátu 1.1.27, tak třeba v3 beta, nebo Condor. Záleží na vás. Jediné, co je důležité, je, aby nová verze měla vyšší versionCode než verze předchozí.

Balíme a podepisujeme aplikaci

Pokud máme vytvořené všechny ikony, aplikaci pořádně otestovanou a nastavené všechny manifestové elementy, můžeme zkompilovanou aplikaci zabalit, podepsat a zveřejnit. Zabalení a podepsání probíhá v Eclipse s ADT pluginem najednou.

Stručný návod

Klikněte pravým tlačítkem na projekt v seznamu projektů, vyberte Android Tools → Export Signed Application Package, pokud nemáte vytvořený klíč, zvolte Create new keystroke, vyberte cílové umístění souboru s klíči (ten si určitě schovejte), zvolte nějaké alespoň 6 znaků dlouhé heslo (to si také zapamatujte) a klikněte na Next >. Do Alias něco napište, opět zvolte alespoň 6 znaků dlouhé ideálně jiné heslo (a to si zase zapamatujte), Validity nastavte alespoň na 25 let a do First and Last Name napište své jméno a příjmení. Klikněte na Next >, tam vyberte, kam se .apk soubor uloží, a stiskněte Finish. Hotovo!

Ale pozor! Když budete chtít aplikaci updatovat, musí mít stejný namespace a musí být podepsaná stejným aliasem. Jinak vás Play Store nenechá.

Mimochodem, stejně tak nefunguje, pokud chcete z Play Store stáhnout aplikaci, která má stejné namespace a dokonce je i třeba stejně podepsaná, pokud jste ji předtím nahráli odjinud. Nejprve je potřeba předchozí verzi smazat.

Mně to zajímá detailněji!

Pak vás odkážu na dokumentaci, a pokud vás zajímá, proč keystroke a ještě aliasy, vizte tyto dvě otázky na StackOverflow.

Z určitých důvodů, které nebudu rozebírat, se doporučuje podepisovat všechny své aplikace stejným klíčem a stejným aliasem.

Play Store

Máme .apk soubor, ale ještě ho musíme nahrát na Play Store. Pokud na něm ještě nemáte založený vývojářský účet, běžte na stránku https://play.google.com/apps/publish/ a postupujte podle pokynů (není to složité). Jen vás to bude stát jednorázový poplatek 25 USD.

Mimochodem, Play Store asi někdy v budoucích týdnech či měsících projde změnou designu. Proto jsem řešil, jestli návod ukázat na novém nebo starém designu (k novému mám přístup). Nakonec jsem se rozhodl pro starý, protože bůhví, kdy nový bude a jak bude vlastně vypadat. Kromě toho mezi nimi až tak velký funkční rozdíl není.

Aktualizace: Návod pro novou vývojářskou konzoli najdete v článku Nová Vývojářská konzole v Google Play.

Běžte na https://play.google.com/ap­ps/publish/Home a klikněte na tlačítko  Upload Application.

Vyberte .apk soubor a stiskněte Upload. Pokud je někde nějaká chyba, Google vás na ni upozorní.

Namespace nemůže začínat na com.example

Pokud je vše v pořádku, klikněte na Save.

Tím se vám zobrazí další nastavení aplikace. Ke každé aplikaci musíte dodat alespoň dva screenshoty a velikou ikonu pro Play Store. Ta se vytvořila také při vytváření projektu (soubor ic_launcher_web.png přímo v rootu projektu), anebo můžeme vytvořit vlastní, jinou, lepší.

Promotional graphic je obrázek, který Google ukáže například v seznamu doporučených aplikací v mobilním Play Store. Tím se zatěžovat nebudeme, stejně tak jako feature graphic, která by se zobrazila v téměř záhlaví webového Play Store (vedle bloku s názvem, ikonou a tlačítkem  Nainstalovat).

Promotional video nemáme, Privacy policy také ne a Google by nás stejně nikde nepropagoval.

Jazykem naší aplikace je čeština, takže klikneme na add language, vybereme češtinu a pod angličtinou pak klikneme na  Remove English listing.

Title necháme totožný s titulkem aplikace, do Description napíšeme nějaký popis, Recent changes necháme prázdné, protože jsme aplikaci právě přidali, Promo text vyplňovat nemusíme, neboť jsme neposkytli Promotional graphic a zvolíme ještě Application typeCategory.

Copy protection nepotřebujeme (a stejně je deprecated), aplikace není nijak škodlivá a mohou ji používat kdekoli na světě.

Dál už nic měnit nebudeme, jen potvrdíme souhlas s podmínkami atp.

Pak vyjedeme nahoru a pro jistotu klikneme na Save. Potvrdíme, že aplikaci opravdu chceme dávat zadarmo a že víme, že to už nepůjde změnit.

Potom klikneme na záložku APK files a ten jediný, co tam teď máme nainstalovaný, aktivujeme (odkaz Activate). Pak aplikaci znovu uložíme a nakonec klikneme na Publish (a do třetice potvrdíme, že nechceme odírat chudou dělnickou třídu).

Tím je aplikace hotová a zveřejněná.

Chvíli trvá, než se na samotném Play Store objeví, ale bude k dispozici na odkazu https://play.google.com/sto­re/apps/details?id=namespa­ce.nasi.aplikace.

Safryš, já nechal dlouhý název Activity v seznamu aplikací.

Tak to si můžeme rovnou vyzkoušet, jak aplikaci updatovat.

V první řadě je potřeba chybu opravit. Potom musíte zvýšit android:versionCode (na to pořád zapomínám, Play Store mi pak vždycky vynadá). Pak musíme aplikaci znovu exportovat, použít stejný klíč i alias a znovu jít na https://play.google.com/ap­ps/publish/Home.

Tam vyberte vaši aplikaci, kde jste udělali chybu, přepněte na APK files a zvolte Upload APK. Tam zase vyberte soubor, klikněte Upload a pak Save. Najednou máte v záložce APK files dvě položky.

Vyberte tu nejnovější a klikněte na Activate.

Pak to zase uložte, přejděte na Product details, najděte Recent Changes a tam zapište změny v nové verzi.

Pak klikněte na Save a máte hotovo.

Závěr

Dnes jsme se naučili aplikaci zabalit, podepsat a nahrát na Play Store. Opět jsme nestihli všechno, ale tentokrát věřím, že si s dalšími možnostmi Developer Console poradíte sami. Šikovné jsou například uživateli nahlášené chyby, kde vidíte backtrace výjimky a případně další data, která vám pomohou chybu opravit.

Příště, v posledním dílu seriálu, uvedu na pravou míru některé nesrovnalosti, jichž jsem se dopustil, zrekapitulujeme, co všechno jsme se naučili, a odkážu vás na další zajímavé materiály.

Aplikace, kterou jsme na Play Store dnes uploadovali, je dostupná zde.

Tip na konec

To, že uděláte nějakou změnu ve vývojářské konzoli, neznamená, že se ta změna hned objeví v celém Play Store. Jak uploadu nové aplikace, tak updatu nové verze může nějakou chvíli trvat, než si je budete moci i stáhnout do telefonu.

Matěj začal programovat ve třinácti v PHP, pak v JavaScriptu a Lispu. Nakonec si koupil Androida, a tak programuje hlavně pro něj.

Čtení na léto

Jaké knihy z oboru plánujete přečíst během léta? Pochlubte se ostatním ve čtenářské skupině Zdrojak.cz na Goodreads.com.

Komentáře: 13

Přehled komentářů

Zopper Re: Vyvíjíme pro Android: Nahraváme aplikaci na Google Play Store
Lukáš Zadražil Reklama
Tom Atom Tutorial
marwyn Poděkování
Palo M. Orientacia displeja
joozef Moznost zarobku z reklamy
Matěj Konečný Re: Moznost zarobku z reklamy
raven4 Re: Moznost zarobku z reklamy
joozef Re: Moznost zarobku z reklamy
Matěj Konečný Re: Moznost zarobku z reklamy
msx Re: Vyvíjíme pro Android: Nahraváme aplikaci na Google Play Store
Matěj Konečný Re: Vyvíjíme pro Android: Nahraváme aplikaci na Google Play Store
homolka01
Zdroj: http://www.zdrojak.cz/?p=3710