Azi a apărut oficial Android versiunea 4 – Ice Cream Sandwitch. E drept că a apărut într-o demonstrație publică și nu în magazine sau pe vreun website care găzduiește surse (scuzați ironia în amintirea întîmplării Android / Open Source / Honeycomb). Bun prilej să mă uit din nou la starea mașinațiunii.
Acum cîteva zile citeam prin Wikipedia despre Dalvik și subiecte conexe. Ce e Dalvik? Foarte pe scurt e mașina virtuală din Android, responsabilul cu execuția programelor (aplicațiilor). Fiecare aplicație care se execută pe telefoanele sau tableturile cu Android de fapt este executată de Dalvik. De cît de bun sau prost, rapid sau lent, scalabil sau… nu e Dalvik depinde cam tot ce mișcă în Android. Ai spune că e o componentă fundamentală a sistemului de operare, e cărămida de bază (sau cu mîner?), nimic nu se întîmplă fără ea. Ai spune că e o componentă căreia i s-a acordat o atenție deosebită pentru că de eficiența ei depinde cît de repede sau frumos sau fluent se mișcă întregul sistem și tot de ea depinde cît hardware trebuie să îi dai sistemului pentru o experiență rezonabilă a utilizatorului. Prin hardware și experiență mă gîndesc și la volum, greutate, baterie, autonomie. Te-ai gîndi că o companie cu imaginea și banii pe care îi are Google și-ar fi permis ca în inima Sistemului Lor De Operare (gluma ChromeOS e altceva) să pună o componentă de calitate, concepută și implementată bine de către oameni serioși care-și cunosc meseria. Google avea tot ce era necesar, inclusiv momentul apariției pe piață care le permitea să fi învățat din toate erorile posibile și imposibile în materie, ca în inima Androidului să planteze un Dalvik fără cusur. Mda. Dacă ar fi făcut asta și-ar fi trădat întreaga tradiție și moștenire în materie de microhackuri, minicîrpeli și mici furtișaguri de proprietate intelectuală care stau la baza culturii lor corporatiste. Fideli idealurilor lor tradiționale au făcut un dalvik după chipul și asemănarea Lor.
Să intrăm puțin în amănunte. Dalvik este menit să execute bytecode provenit din compilarea de cod sursă scris în Java. Frumos. Are o arhitectură bazată pe regiștrii și nu pe stivă – detalii nesemnificative. Deci aplicațiile destinate Android / Dalvik sunt scrise în Java. Da, dar nu orice fel de Java. Mai exact Android și Dalvik nu au avut niciodata cea mai vagă intenție să ruleze aplicații J2ME sau mai știu eu ce aromă demodată de Java. GWT cineva? Altă jumătate de Java călare pe jumătate de iepure șchiop. Google a vrut să o rupă cu trecutul și să creeze absolutul. Dalvik nu suportă același format de fișiere, nu suportă nici măcar biblioteca de clase din Java SE sau Java ME deci nu poți avea compatibilitate măcar aproximativă nici la nivel de surse.
Cînd alegi să renunți la compatibilitatea cu atîta amar de aplicații existente probabil că asta nu e o decizie ușoară și trebuie ca pierderea considerabilă să fie compensată de avantaje majore. Sau poate că o faci pentru că nu vrei să dai banii pe licențe. Asta a fost și nefericita situație de la Google, catalizată de incompetența și amatorismul definitorii.
Java e un animal ciudat. Destul de open-source și free ca să atragă pe cei care nu au răbdare să citească textul scris cu litere mici, controlat draconic atunci cînd Interesul o cere. Primul exemplu care trebuia să le dea și altora de gîndit a fost procesul Sun – Microsoft în urma căruia cei de la Microsoft au fost obligați să agreeze că Java e controlat complet de Sun și ei trebuie să elimine mașina lor virtuală din Windows. Bine au și făcut, oricum era proastă – păcat că au trebuit forțați de judecători să o elimine și nu au aruncat-o la gunoi din spirit autocritic.
Google s-a gîndit că fiind o organizație cu aparențe onorabile, destul de legată de idealurile open-source pînă cînd asta ar putea avea un impact cît de mic asupra profitului, va fi scutită de soarta celor de la Microsoft și a luat pe Java în brațe dar cu precauții. Google a pretins că implementarea lor e una pură, scrisă de la zero de ei, că genialitatea le-ar permite să facă treaba bine. Contabilii lor au socotit că nu merită să dea bani la SUN (acum Oracle) pentru o implementare de o calitate rezonabilă, relativ cizelată de ani și ani de dezvoltare. Oracle nu i-a crezut și acum se bat în tribunale pentru miliarde, cu Oracle avînd în mînecă nu doar patente încălcate (o prostie despre care nici nu îmi vine să povestesc dar cu efecte cît se poate de palpabile din păcate) ci și cod sursă furat cu nerușinare & paste, ba chiar și e-mailuri interne de la Google în care angajații arătau că sînt în cunoștință de cauză în ce privește infracțiunea. Greu să pierzi procesul ăsta dacă ești Oracle.
Deci Google au renunțat la compatibilitate, au renunțat la siguranța dată de o mașină virtuală exemplară în privința compatibilității, de fapt norma în materie de Java fiind implementarea etalon a celor care controlează standardul, toate astea ca să facă un Dalvik mai bun și mai ieftin. Au furat pe ici pe colo dar cîți nu fură și scapă neprinși, a fost un risc asumat. Așa s-a ajuns ca Android să fie pentru Microsoft o sursă de venituri mai mare decît Windows Phone 7 pînă la un moment dat, prin licențe pe care Samsung sau HTC au agreat să le plătească la Microsoft pentru fiecare telefon vîndut cu Android, fiind conștienți că nu ar avea cîștig de cauză în instanță cu furăciunea la subsiori. La ospăț s-a prezentat și Oracle care bănuiesc că în momentul în care va cîștiga procesul cu Google, va da în judecată fiecare producător care folosește Android și va obține banul pentru licența per unitate vîndută exact ca Microsoft. Google nu oferă nimănui vreo protecție în ce privește patente încălcate de ei în Android. Privind în urmă, era o afacere mult mai avantajoasă pentru Google să cumpere complet SUN decît să plătească miliarde acum la Oracle. Dacă o făceau, acum controlau ei Java, nu aveau nevoie de cîrpeli și furtișaguri, aveau o mașină virtuală compatibilă în urmă și o tonă de patente de pe urma cărora acum suferă dar atunci ar fi suferit mama la dușmanu lor. Și încă un amănunt: aveau o mașină virtuală relativ perfomantă, nu un…. dalvik. Și iată-mă revenind la motivul inițial al postării: calitatea mașinii virtuale din Android.
Un dezvoltator nefericit se plîngea cam așa la aflarea noutăților despre Android 4:
When are we going to see method inlining, lock elision, escape analysis, peephole optimisation, monomorphic method detection, something like a G1 garbage collector, bounds check hoisting, common subexpression elimination, etc., which give us all the performance we need?
Cîte fițe dom’le. Bucură-te dezvoltatorule că măcar bootează și rulează browserul! Cine are nevoie de mai mult?
Dincolo de virgula care-l precede nefericit pe etc, pare că omul știe el ceva.
Unele lucruri care lipsesc din Dalvik erau considerate comune în 1995 prin medii de dezvoltare de la Microsoft sau Borland de exemplu. Altele au apărut mult mai tîrziu la îndemîna publicului călător cam prin 2000-2002. În 2011 ele nu se află încă în cel mai promițător sistem de operare mobil, de la cea mai promițătoare companie de publicitate de pe planeta – Google. Sigur toate lipsurile astea plus cele incluse generos în prescurtarea “etc” trebuie că au motive foarte întemeiate. Bănuiesc că performanța pe care cei de la Google o iubesc mult i-a obligat la compromisuri ca în alte cazuri notabile precum Chrome pe care ar trebui să-l numim minimalist dacă am reuși să nu-i spunem rudimentar și asta aparent din cauza nevoii de performanță. Android trebuie să zboare, să nu aibă absolut deloc lag, să fie fluid, rapid și să răspundă instantaneu. Android trebuie să aibă debit. Android trebuie să-ți servească minim 15k reclame pe secundă! Pentru un motiv atît de nobil poți ierta 147 de omisiuni. Singura problemă cu Android e că indiferent cît hardware îi dai, nu e nici rapid nici fluid nici lipsit de lag. Pe hardware net superior față de iPhone, iei cîte o pauză în mijlocul tranzițiilor care erau planificate să fie spectaculoase, în plin scroll, fade, slide, cînd ți-e lumea mai dragă sau muzica mai plăcută la auz.
Apropos – am spus deja că vaișamarnicul de player media din Android nu știe nici azi gapless playback? Dacă asculți un concert sau un album de muzică electronică în care între melodii nu este pauză, Android te ajută să te odihnești o secundă la trecerea de la o piesă la alta. Asta fără nicio legătură cu subiectul dacă tot m-am enervat.
O vreme am crezut că devină pentru performanța penibilă a execuției codului în Android / Dalvik e colectorul de gunoi care chiar și atunci cînd e implementat bine face astfel de probleme din principiu, dar mai implementat fiind de Google… Dacă ar fi fost doar asta… Dar se pare că Dalvik în ansamblu e o catastrofal în ce privește performanța. Niște oameni de la Oracle au fost curioși cum se comportă Dalvik comparativ cu mașina lor virtuală pe procesoare ARM rulînd niște benchmarkuri standard, care nu le aparțineau deci probabil nu erau scrise special pentru a arăta ceva anume. Bănuiam că Dalvik o fi cu un 30% acolo mai lent și că deși uneori merge mai prost, are cazuri pe care Google le-ar cita ca esențiale, cazuri în care mașinuța lor virtuală ar merge chiar bine, măcar pentru palmares. Adevărul e mult mai negru decît cele mai pesimiste intuiții ale mele. Mașina virtuală de la Oracle rulează cu 200% – 300% mai rapid decît Dalvik. Nu 20%-30% ci dublu spre triplu! Și Java SE nu e în niciun caz un campion al vitezei. Asta în implementarea din Android 2.2 care e prima care în fine avem compilator just-in-time. Vă amintiți cum Google se fălea că în Android 2.2 aplicațiile rulează chiar și cu peste 400% mai rapid decît în versiunea anterioară? Unii erau în extaz. UAU! Google trebuie să fie țara minunilor, doar în Oz se mai aude așa ceva. Pesimistul de serviciu din mine a înțeles din comunicatul de presă cu totul altceva: îți dai seama cît de monstruos de prost a fost Android pînă la 2.2 dacă la o revizie aplicațiile rulează de 4 ori mai rapid. Dacă s-a putut face așa ceva înseamnă că înainte codul ăla era de un penibil inimaginabil și dacă respectul de sine al profesioniștilor care iau cecul lunar de la Google le-a permis să țină pe piață pînă în v2.2 așa un cod de rahat, îți dai seama ce e încă acolo? Că doar ei sînt tot ăia care au făcut și Android 1.6. Oare ce i-a determinat să închidă sursele pentru Android 3? Sper că rușinea de a le arăta public, ar fi motivul cel mai scuzabil pentru gest.
Nu pledez pentru cod scris în C în 2011 – doamne ferește, cel puțin nu pentru aplicațiile tipice de prin telefoane, discut doar despre calitatea implementării mașinii virtuale din Android. Android pre 2.2 era destul de “performant”. Versiunea 2.2 reușește să fie cu abia 300-600% mai rapidă, mici optimizări pe ici pe colo la un cod deja perfect. Java SE care oricum e destul de lent față de alte soluții reușește ca prin diferite mici trucuri să fie doar cu 200-300% mai rapid decît deja uluitorul Android 2.2. Și asta în telefoane unde există constrîngeri mai mari decît pe desktop ca viteză a procesorului, memorie, energie disipată, autonomie, baterie. Să te mai miri că iPhone 4 cu 800MHz, 512MB de memorie RAM și un singur nucleu în CPU rulează aplicațiile mai rapid și mai fluid decît Android 2.3 cu procesor dual-core la 1.2GHz și 1GB de memorie RAM? Oricît hardware arunci într-un software de cacao, rezultatul e doar ceva mai multă căldură disipată în univers, nu ajută cu nimic în final pentru o experiență onorabilă în mîna clientului.
Își mai aduce aminte cineva de BeOS unde pînă și meniurile pe ferestre erau desenate pe mai multe fire de execuție? Aur curat pentru cîte nuclee stau azi degeaba în procesoarele pe masa fiecăruia din noi. Mort, îngropat demult. Sau poate de puțin cam urîțelul OS2 de la IBM care se învîrtea în cerc în jurul lui Windows 95? Sau poate de WebOS? Perfecțiunea nu se vinde bine, impostura e aproape întotdeauna rețeta pentru un succes garantat. Clientul de azi știe puțin. El are nevoie de Facebook, simbolul solicitării mintale minime în materie de IT – un fel știrile-de-la- ora-5.com, eventual de un client de instant messaging și de un browser fără nicio pretenție. Nevoia lui chiar e redusă, pe măsura posibilitățile intelectuale tipice. Copii care scot banul gros din buzunarul părinților pe telefoane odată pe an, vor facebook și mess. Angry Birds e oh atît de 2010. Dincolo de asta totul devine prea complicat și provoacă somnolență. Povestea despre cîți gigaherți sau cum le zice are procesorul meu și nu are al tău, despre cît de mare e a mea în comparație cu a ta – memoria RAM bineînțeles, despre megapixelul meu mai mare ca al tău și a lu’ taică-tu la un loc, asta vinde la copii. Codul eficient, viteza, viața bateriei, lucrul bine făcut, alea e pentru specialiști să scrie ei articole acolo pe net la iei.
Un inginer mecanic spunea odată că motorul cu ardere internă e un triumf al execuției asupra designului. Ceva atît de prost în principiu cum e motorul cu ardere internă, cu ulei care se amestecă fumegînd printre pistoane, unde benzina ia foc de zeci și sute de ori pe minut, plin de fum și de mizerie e ceva ce ai zice că nu poate funcționa niciodată în parametri rezonabili. Cu toate astea uite că un milion de lemingși care au lucrat 100 de ani să facă lucrurile din ce în ce mai bine l-au făcut să funcționeze aproape corect, în ciuda principiului constructiv care nu pare să-i dea vreo speranță.
Android e un succes clar, garantat și definitiv. Cu destulă tracțiune, cu un milion de lemingși care să comită acte de eroism în a-l suporta și perfecționa, va funcționa din ce în ce mai bine și probabil peste 100 de ani, exact ca motorul Otto, va merge deja aproape binișor, în ciuda principiilor constructive. Să trăiască la mulți ani!
uau, o gramada de cuvinte :) dar se citeste foarte usor postarea.
mai conteaza ceva cind compari telefoanele: cite applicatii sint in itunes sau android app market; mie mi-a fost greu sa inteleg de ce conteaza asta mai ales ca nu foloseam nicuna dintre ele.
500.000 de aplicații sunt un lucru impresionant mai ales cînd vrei să găsești ceva printre ele și 99% (nu se știe care) sunt pur gunoi.
pe internet mi-a zis ca in iTunes sint 2.5 mil aplicatii si in android market sint „doar” 1.5 mil
deci inchipuie-ti 1 mil aplicatii in plus … ce mai astepti?