A) Zase raz technický článok (ale sľubujem, že onedlho sa dokopem aj k niečomu, čo nie je samý bit a byte). B) Neviem, do akej miery som s týmto názorom v menšine, ale čo je moc, to je moc.
Včera večer mi píše šéf, že sa mu na stôl dostala taká drobnosť. IT oddelenie jednej firmy chce vyvíjať aplikáciu pre Android, ale z nejakých dôvodov sa im to nejak nedarí rozchodiť, tak či by som sa na to nepozrel. Aplikácia má vziať súbor vybraný používateľom a zašifrovať ho pomocou AES. Je v tom ale drobný háčik – z nejakých dôvodov chcú použiť na šifrovanie natívny kód, nie Javu. A že keď im s tým pomôžeme, urobíme si očko
Tak som sa do toho, aj cez nechuť (fakt nemám rád Javu a pri pohľade na Eclipse IDE sa mi dvíha žalúdok), pustil. Stiahol som JDK, Android SDK a Android NDK. Rozbalil, nastavil cestu, rozbalil dodané zdrojáky a začal písať.
So far, so good. A potom som chcel ten kód spustiť. Nastavil som emulátor a spustil ho. A čakal. A čakal viac. A čakal ešte trochu. Už som z toho mal pocit, že sa snáď nedočkám, keď mi naskočil home screen. Prečo to ale muselo trvať pomaly 5 minút? A nie, nebolo to mojím hardwareom – pracujem na workstation, čo má v sebe Intel i7-3770k (4 + 4 jadrá), 24 GB RAM (na frekvencii 2133 MHz) a grafický čip GeForce GTX 680.
A keď sa potom spustila mnou debugovaná aplikácia, skoro ma zhodilo zo stoličky, jak to bolo pomalé. Kliknutie na tlačidlo malo lag snáď pol sekundy. WTF, Google? Ja uznávam, že emulátor a všetko, ale AŽ TAK?
Keď som sa v tom začal hrabať, našiel som krásne malé zaškrtávatko “Use host GPU” v nastaveniach emulátora. Ktoré bolo samozrejme defaultne vypnuté, takže sa všetko renderovanie v tom virtuálnom strori robilo v software. Opäť – prečo? Máme rok 2014, väčšina developerov má procesory Intel alebo AMD so vstavanou grafikou, ktorá zvláda kde čo. A niektorí majú aj grafiky diskrétne. Tak PREČO je GPU rendering defaultne vypnutý?
Prepnutím na GPU rendering sa použitie emulátora zlepšilo – z nepoužiteľného sa stalo len neznesiteľným. Príklad – načítanie cca 4kB súboru trvalo v Jave cca 15 sekúnd. Trochu moc, nie? Keď si človek uvedomí, že emulátor beží lokálne a s IDE je spojený TCP spojením.
A to ani nebudem zabiehať do interoperability managed/native v podaní Android NDK. V momente, keď má signatúra metódy v sebe 4 podtržítka a je dlhá cez 150 znakov, niečo bude asi zle, povedal by som. Plus, kompilácia native kódu neprebieha ako build step v IDE, človek si to musí skompilovať manuálne pomocou command line.
Áno, Android je Linux-based platforma. Áno, je to založené na Jave. A áno, nástroje pre Windows sú pravdepodobne cross kompilované z Linuxovej verzie. Ale na takto pomalom a otravnom dev stacku sa fakt nedá poriadne programovať. Ak by som sa mal niečím podobným živiť, asi by ma čoskoro vystrelo.
Bottom line: môj názor na Android dev stack pre Windows je, že Android dev stack pre Windows je prudko neadekvátny. Rozhodne nekonečne zaostáva za štandardmi, na ktoré som v našej brandži zvyknutý a ktoré očakávam.
Pre zaujímavosť, nedávno som programoval pre Windows Phone 8.1 a to bol zážitok veľmi pozitívny – virtuálne stroje (manažované pomocou skutočného Hyper-V) štartovali v sekundách, odozva emulátora bola takmer okamžitá a deploy debug verzie bol okamžitý.
Nedá mi to nepovedať jedno – Visual Studio a spol. sa naďalej ukazuje ako najpokročilejšie IDE na planéte. Screw Eclipse.