2019. június 16., vasárnap

Gyorskeresés

Xamarin tapasztalatok

Írta: | Kulcsszavak: xamarin . szoftverfejlesztés . ios . android

[ ÚJ BEJEGYZÉS ]

Szívesen. Az elmúlt hónapokban eléggé meghatározó elem volt a hétköznapokban. Már régóta a célkeresztemben volt, de ugyanígy nem akartam saját zsebre belevágni... Végül sikerült a munkahelyemen elérni hogy kipróbáljuk - nagyon csábító lehetőség arra, hogy a háromplatformos fejlesztések ne igényeljenek 4x annyi időt, mint egy platformra.

Röviden én a következőket vártam egyszerre tőle:
1) A C# miatt hatékonyabb fejlesztést, mint Obj-C-vel és Javaval.
2) Közös üzleti logikát és adatkezelést, ezáltal kevesebb (és tisztább) nettó kódmennyiséget.
3) Az előző két pont következtében konzisztens, jobb minőségű végeredményt.

---

Ugye az alapkoncepció az, hogy leképezik (szinte) a teljes Android és iOS API SDK-t .NET osztályokra és nyelvi elemekre - ennek a megvalósítása önmagában is zseniális -, adnak egy Mono runtime-ot (saját GC-vel és mindennel), illetve oda-vissza áthidalást a "natív" világba. (Idézőjelben, mert Androidon JNI-n keresztül beszél a Mono a Java világgal, iOS-en meg az AOT fordító összefordítja a kettőt. A folytatásban a "natív" szó alatt az "őshonos" környezetet értem; vö. Mono.)

Az SDK azonosságán felül a két platform sajátosságait is integrálták.
Például Androidon ugyanúgy kell kezelni a resource-okat, mint natívan: ugyanúgy szerveződnek a mappák a különböző konfigurációkhoz, centire ugyanolyan layout XML-ek vannak (bár .axml a kiterjesztésük, és példányosíthatóak .NET osztályok is), az R.java megfelelőjét az IDE automatikusan generálja; de ugyanúgy van AndroidManifest.xml is, csak megspékelve egy olyan könnyítéssel, hogy az osztályokra rakott attribútumokból magától is ki tudja generálni a toolchain.
iOS-en ugyanúgy vannak XIB-ek és Storyboardok (előbbihez az XCode-ot indítja be a Studio, utóbbit tudja házilag szerkeszteni), ugyanúgy kell Plist fájlokat szerkeszteni (bár az IDE segít), aláírásokkal mókázni.

A lényeg, hogy a C# nyelv ismerete nem mentesít az iOS és Android platformok alapos ismerete alól, ugyanis pontosan ugyanazt az életciklust, ugyanolyan struktúrákban, ugyanazokból az elemekből kell összerakni. És a Mac vásárlástól se, mert az iOS app projektekhez kell XCode.

Az első pontom ettől függetlenül szerintem teljesül. A teljes .NET 4.5 frameworkben, ami elérhető mindkét platformon, van bőven okosság: például a LINQ, az async Taskok és az await kulcsszó sokkal kifejezőbb és tömörebb, mint a natív lehetőségekkel szórakozni.
Az Objective-C-vel szemben különösen rikít, hogy mennyit számít a generikus osztályok léte és az, hogy minden típusbiztos (vö. nincsenek és semmi sem az). Nem véletlenül sarokpontok ezek a Swiftben.

---

Viszont a második ponttól kezd bonyolódni a történet. Nem sokáig maradtunk a natúr Xamarinnál, mert önmagában nagyon lábbalhajtós a fejlesztés. Kell egy jó framework.

Az MVVM architektúra és a data binding nagyon jól működik Windowson, jó lenne a két új platformon is ezeket használni, és megosztani a VM rétegig mindent a három platform között. Windows Phone/Store fejlesztésnél azelőtt MvvmLightot használtam, ez sajnos nem elég. Viszont nem is keresgéltem sokáig, az MvvmCross azonnal szembejött, és miután megfejtettük a lelkivilágát (meg a viewmodel-first gondolkodást), remekül bevált.

Az MvvmCross struktúrája miatt minden képernyőhöz tartozik egy VM (és ezek VM-ek navigálnak egymás között), a hozzájuk tartozó UIViewController / Activity (Fragment) / Page osztályok pedig név alapján kapcsolódnak össze. Maga az adatkötés WP alatt kb. ugyanúgy megy, mint eddig (XAML binding); Androidon a layout XML-ben saját XML attribútumokkal vagy a C# kódban; iOS-en pedig a UIViewController C# kódjában lehet többféleképpen is felsorolni, melyik VM property hova menjen és milyen konverziókon essen át.

A felállás a következő lett: minden modell osztály, üzleti logika, viewmodel egy PCL (Profile 78) projektben lakozik. Emellett van a három alkalmazásprojekt. Ha van valami platformfüggő szolgáltatás, arra vagy NuGetről vadásztunk egy plugint, vagy írtunk sajátot - a megfelelő implementációt meg az IoC konténer tolja be a platformfüggetlen modulnak.

Persze egy ekkora framework tele van meglepetésekkel és kezelendő akadályokkal. Elég sokat bújtuk a StackOverflow-t, a forráskódot, alkalmanként a Xamarin bug tracking rendszerét (sajnos futottunk ezen a szinten is lyukra, de más is, ezért hamar patchelték), sikerült átvergődni rajtuk.

Azért elég jó élmény, amikor mindhárom platform egyszerre mozdul és ugyanazt csinálja, még ha vizuálisan el is tér a három felület.

---

És akkor a harmadik ponttal visszatérek az eredeti kérdésre, a licencelésre.

- Az ingyenes verzió semmire se jó, pont. Az a 32KB IL kód korlát már arra is kevés, hogy a Xamarin példakódokat kipróbálja az ember... Nem is értem, mi ezzel a céljuk, több szót nem érdemel.

- Az Indie licenc, amit szeptemberben állítottak át éves díjról havi díjra, elég jó ár/érték aránnyal bír, hiszen már bármit le lehet vele fordítani, és az eredmény publikálható.

De azért vannak hiányosságai, amik a végeredmény minőségének a rovására mennek. Egyrészt a fejlesztést nagyon lassítja a Visual Studio támogatás elvétele - nem lehet egy gépen, egy IDE-vel mindhárom platformot kezelni, váltani kell a Mac és Windows között, és a VS-ben még külön szórakozni kell az iOS/Android projektek unloadolásával egy WP buildhez. Három platformon egyszerre refaktorálni is lehetetlen így...

A másik érvágás a continuous integration teljes hiánya. Csak a Xamarin Studion belül indítható build, így már automatizáltan fordítani is lehetetlen a projekteket, nemhogy teszteket futtatni rajtuk... Ez a négy fős csapattal folyamatos ütközésekhez és kiszámíthatatlan minőségi problémákhoz vezetett, amit lassan, intenzív erőfeszítésekkel tudtunk csak korrigálni.

Ettől függetlenül lehet vele dolgozni, privát/kiscsoportos használatra némi fogszívás mellett.

- A Business verzió az aduász, de nem egyszerű évi nettó 2000 dollárt kitermelni a két platformhoz. Az előző problémák megszűnnek, nem lesz ez az ad-hoc, garázs- és izzadtságszagú jellege a munkának.

Ezt csak azért tudom kijelenteni, mert a Trial mód ennek a szintnek felel meg azzal a megkötéssel, hogy az így készült buildek 24 óráig működnek, aztán nem indulnak el többet. Célszerű a Trialt jókor kezdeni és kimaxolni a hasznosságát.

Ha van a környezetben egyetemista, akkor a diákkedvezmény elég vonzó alternatíva lehet - tizedáron kaphatják meg a full Business csomagot egy évig.

- Az Enterprise-ról nem tudok nyilatkozni.

---

Remélem hasznos volt, ha van még kérdés, hozzászólásban válaszolok.

Hozzászólások

(#1) alevan


alevan
(PH! addikt)

Ha van a környezetben egyetemista, akkor a diákkedvezmény elég vonzó alternatíva lehet - tizedáron kaphatják meg a full Business csomagot egy évig.

Semmiség minden évben találni egy egyetemistát, pl gyakornokot.

"Ezért lovagol a pokolba a konzumer IT piac. A hülye igények... . Azt sem tudod, hogy mit akarsz de az jöjjon havonta frissités formájában."

(#2) beleszólok


beleszólok
(senior tag)

Jól értem a wiki-t? Xamarin = monodevelop kicsit kicsinosítva?
Hosszas (lelki ;) ) küzdelem után rávettem magam, hogy felrakjak egy mono környezetet a linuxomra és igencsak meglepett, hogy a monodevelop induláskor a xamarin blogot tolja az arcomba... :)

Mono neked mennyire ismerős úgy egyébként?

[ Szerkesztve ]

Tiszavirág: http://youtu.be/YdcsiW0kfso

(#3) Karma válasza beleszólok (#2) üzenetére


Karma
(PH! félisten)

A Xamarin Studiora gondolsz? Mert az pontosan így van, egy kibővített változata a MonoDevelopnak. A Xamarin.iOS, Xamarin.Android és Xamarin.Mac termékek a nyílt forráskódú Mono projektre épülnek, amit a Xamarin, mint cég gondoz. Gyakorlatilag ugyanaz a gárda, az eredeti fejlesztők, szakosodva és felfejlődve.

Valamennyit játszottam vele még évekkel ezelőtt, de semmi igazán komoly. Elvileg nagyrészt kompatibilis az aktuális .NET frameworkkel desktopon is.

“All nothings are not equal.”

(#4) beleszólok válasza Karma (#3) üzenetére


beleszólok
(senior tag)

Studio? Úgy nem láttam emlegetni. A wikit átfutva csak azt láttam, hogy a monodevelop cikket össze kellene vonni a Xamarinról szólóval, kicsit lejjebb meg írják, hogy a Xamarin a monodevelopra épül, csak helyenként, a felhasználói élmény és hasonlók javítása érdekében, platform specifikus kód is van benne.
Csak hát az angol tudásom nem épp anyanyelvi szintű, így felmerült, hogy esetleg félreértek valamit.

Kíváncsi vagyok, mire jutok vele, mert eddig szinte mániákusan ragaszkodtam a pythonhoz.
Viszont a mai próbálgatás alapján egyelőre úgy tűnik, ez sem olyan vészes. (sok éve, még a mono megjelenését követően egy-két évvel próbálkoztam vele, de akkor nagyon gyenge volt a mono a windows-os környezethez képest, ráadásul teli volt bugokkal)

Tiszavirág: http://youtu.be/YdcsiW0kfso

(#5) sirszevenap


sirszevenap
(PH! addikt)

Kár, hogy ennyire halott a téma...

Mindent IS!

További hozzászólások megtekintése...
Copyright © 2000-2019 PROHARDVER Informatikai Kft.