Przejdź do głównej zawartości

Xamarin Forms Jest Wielki




Pisanie aplikacji na iOS jest przyjemne, Xcode jest wyśmienitym środowiskiem a praca w nim jest zabawą. Mam apkę na iOS, którą chciałbym przenieść również do Androida. Myślałem o przepisaniu jej w Xamarin.Forms. Okazało się, że apki pisane w Xamarinie (obecnie część Visual Studio), też są przyjemne do pisania. Wybrałem Xamarin.Forms, żeby zminimalizować rozmiar kodu specyficznego dla platformy. Apka jest dostępna na githubie: https://github.com/jaropawlak/MyExpenses.Xamarin i ma większość funkcjonalności, którą miała moja oryginalna aplikacja. Jest jednak pewien problem, DUŻY problem. To rozmiar binarki. Podczas gdy moja oryginalna aplikacja na iOS zajmuje mniej niż 2MB na urządzeniu, wersja Xamarin.Forms zajmuje około 100MB. To jest nie do zaakceptowania dla tak małej aplikacji. Nie przeszkadza mi kiedy jest jakiś powód dla dużego rozmiaru paczki, zniósłbym to też, gdyby nie sprawiało, że apka wolniej się ładuje. Ale sprawia. Zobacz tu:

Fajne, co? Natywna jest super szybka. Jakie są dokładnie ich rozmiary?



Natywna ma 1.1 MB







  Xamarin.Forms ma 101.2 MB




Pytanie brzmi: czy mogę zmniejszyć binarkę do jakichś rozsądnych rozmiarów? Pierwszy pomysł, jaki miałem to budować bez symboli debugowania. Spróbujmy:









Nie za bardzo pomogło. A co z ustawieniami linkera żeby linkował tylko biblioteki sdk? To trochę zmniejszyło aplikację ale spowodowało też wybuch na starcie. Potrzebowałem dużo googlać żeby znaleźć właściwą konfigurację LinkDescription.xml, ale apka w końcu ruszyła. Co dalej? 80MB to wciąż dużo. Spróbujmy z bardziej ekstremalnymi ustawieniami:

Zaznaczyłem Link All oraz “Use the LLVM optimizing compiler”. To dało mi najlepszy rozmiar aplikacji jaki byłem w stanie wywalczyć w Xamarin.Formsach:
Ale... apka znowu przestała się uruchamiać. Bez względu na ustawienia linkera jakie ustawiałem i na wybróbowanie wszystkich wyguglanych rad, nie byłem w stanie uruchomić aplikacji. Czytając ten artykuł możesz tego nie zauwaćyć :) ale próby trwały kilka dobrych dni i było to bolesne doświadczenie serii prób i błędów i gasnącej nadziei. Apka albo była duża, albo ciągle dość duża i nie działająca. Ustawienie linkera na LinkAll wpędzało mnie w niekończące się cykle wpisów w LinkDescription i oglądania niedziałającej aplikacji. Poszedłem dalej i usunąłem autofaca i zastąpiłem go moim bieda-DI, to też nie pomogło. EntityFrameworkCore też używa reflection i linker nadal przestrzelał z optymalizacją. W końcu odpuściłem sobie z LinkAll.
Mój ostateczny, najlepszy działający wynik jest taki:

z takimi ustawieniami:


I z LinkDescription.xml, który znajdziesz na githubie w repozytorium tego projektu. Połowa oryginalnego rozmiaru. Aplikacja wciąż ładuje się wolniej niż oryginał pisany w Xcode ale i tak jest lepiej niż na początku. Zobacz:
Jeśli też zmagasz się ze zmniejszeniem swojej aplikacji Xamarin.Forms, to może przydadzą Ci się wnioski, które wyprowadziłem z moich prób:
  • Ustaw Link Framework and SDK, a później jeśli nie działą to wszystkie odpowiedzi są w LinkDescription.xml.Nie trać czasu na LinkAll.
  • Usunięcie autofaca nie dało dużej poprawy, nie warto było, lepiej mieć czystszy kod.
  • Nie dotykaj “incremental build” bo apka urośnie bardziej :) 
  • Jeśli aplikacja, którą piszesz musi być szybka (lub mała, lub i to i to): Zastanów się czy na pewno potrzebujesz ją pisać w Xamarinie.
  • I w końcu: zmniejszanie aplikacji jest bolesnym doświadczeniem, postaraj się mieć przy tym jakąś frajdę.

Bonus: rozmiar apki z ustawionym "incremental build":

Baw się dobrze zmniejszając swoje binarki!

Komentarze