Xamarin — C# va .NET yordamida Android hamda iOS uchun native application yaratishga mo‘ljallangan cross-platform development texnologiyasi. U umumiy business logicni bir codebase’da saqlab, platforma APIlariga C# bindinglar orqali murojaat qilish imkonini bergan. Xamarin tarixan Xamarin.Android, Xamarin.iOS va Xamarin.Forms qismlaridan tashkil topgan.
Zamonaviy .NET ekotizimida Xamarin yondashuvining davomchisi sifatida .NET MAUI rivojlangan. Shunga qaramay, Xamarin tushunchasi ko‘plab mavjud mobil loyihalarda uchraydi.
C# va .NET
Application logikasi C# tilida yoziladi.
.NET:
- type system;
- garbage collection;
- async/await;
- LINQ;
- base library;
- package ecosystem
imkoniyatlarini beradi.
Platforma-specific APIlar C# classlari orqali ochiladi.
Xamarin.Android
Android SDK APIlarini .NET binding orqali taqdim etadi.
Activity, Service, Intent, View va boshqa platforma tushunchalari saqlanadi.
Application Android package sifatida build qilinadi.
Developer manifest, permission va lifecycle’ni baribir bilishi kerak.
Xamarin.iOS
iOS UIKit, Foundation va boshqa frameworklarini C# orqali ishlatadi.
Application Apple toolchain yordamida native packagega build qilinadi.
iOS code signing, provisioning va App Store talablaridan ozod bo‘lmaydi.
Build uchun macOS va Xcode kerak bo‘lishi mumkin.
Xamarin.Forms
Bir xil UI abstraction orqali Android va iOS screenlarini yaratishga mo‘ljallangan framework.
UI XAML yoki C# bilan yozilishi mumkin.
Framework componentni platformadagi native controlga aylantiradi.
Platforma farqlari renderer yoki effect orqali boshqarilgan.
XAML
Declarative UI markup:
<Label Text="UzbekDevs" />
Code-behind yoki ViewModel bilan bog‘lanadi.
Binding state va UI property orasida aloqa o‘rnatadi.
XAML compile vaqtida tekshirilishi va optimallashtirilishi mumkin.
Native UI
Xamarin.Forms odatda native platform controlidan foydalangan.
Shu sababli button va navigation platformaga mos behavior beradi.
Biroq bir xil abstraction barcha platforma featurelarini to‘liq qamramasligi mumkin.
Custom renderer kerak bo‘lgan.
Shared code
Umumiy qatlamda:
- domain model;
- API client;
- validation;
- persistence abstraction;
- business rule;
- ViewModel
saqlanadi.
Camera, push va boshqa platforma-specific service interface orqali ajratiladi.
Dependency injection implementationni tanlaydi.
Binding
Native Java yoki Objective-C library C# binding project orqali ishlatilishi mumkin.
Binding metadata native type va methodlarni .NETga map qiladi.
Noto‘g‘ri ownership, callback yoki marshaling memory va crash muammosi yaratishi mumkin.
NuGet
.NET dependencylari NuGet package orqali boshqariladi.
Package mobile target framework va platformaga mos bo‘lishi kerak.
Eski Xamarin package zamonaviy SDK yoki AndroidX bilan mos kelmasligi mumkin.
Lock va central version management reproducibilityga yordam beradi.
Linking
Release build ishlatilmagan managed code’ni olib tashlashi mumkin.
Bu package hajmini kamaytiradi.
Reflection orqali topiladigan class linkerga ko‘rinmasa tasodifan o‘chirilishi mumkin.
Preserve attribute yoki descriptor ishlatiladi.
AOT va JIT
Platformaga qarab .NET code AOT yoki JIT bilan bajarilishi mumkin.
iOS dynamic code generationni cheklagani sabab AOT muhim.
Androidda boshqa compilation strategiyasi ishlatilishi mumkin.
Build va startup performance targetga bog‘liq.
Garbage collection
Managed objectlarni .NET garbage collector boshqaradi.
Native objectlar alohida reference counting yoki platforma lifecycle’iga ega bo‘lishi mumkin.
Managed wrapper mavjud bo‘lsa ham native resource vaqtida dispose qilinishi kerak.
Event subscription reference leak yaratishi mumkin.
Async
Network va file operationlar async/await bilan bajariladi.
Continuation UI threadga qaytishi kerak bo‘lishi mumkin.
Cancellation token screen yopilganda ishni bekor qiladi.
async void faqat event handlerga yaqin holatlarda ishlatiladi.
Architecture
MVVM Xamarin.Forms loyihalarida keng tarqalgan.
Asosiy qismlar:
ViewModel platforma UI objectlarini bevosita ushlamasligi kerak.
Navigation va dialog abstraction bilan berilishi mumkin.
Platform-specific code
Conditional compilation yoki platform projectlarda maxsus implementation yoziladi.
Masalan:
Android location service
iOS location service
Umumiy interface shared projectda joylashadi.
Platforma farqini yashirish uchun haddan tashqari abstraction ham murakkablik yaratadi.
Test
Shared business logic oddiy .NET unit test bilan tekshiriladi.
UI va platforma integration emulator yoki real qurilmada test qilinadi.
Mock platform service ko‘p behaviorni tekshiradi, ammo native lifecycle’ni to‘liq almashtirmaydi.
Performance
Cross-platform abstraction:
xarajatiga ega bo‘lishi mumkin.
Profiling Android va iOSda alohida bajariladi.
Debug build performance release bilan bir xil emas.
Xamarin’dan .NET MAUIga o‘tish
Migration project structure, target framework, namespace, renderer va dependencylarni yangilashni talab qiladi.
Custom renderer handler modeliga ko‘chirilishi mumkin.
Faqat project faylini almashtirish yetarli bo‘lmasligi ehtimoli bor.
Eski package supporti tekshiriladi.
Xamarin va native development
Xamarin C# code sharing va .NET jamoasi uchun qulay.
Native Kotlin va Swift platformaning eng yangi APIlarini avval olishi mumkin.
Tanlov mavjud team, lifecycle, UI murakkabligi va uzoq muddatli supportga bog‘liq.
Dependency service
Shared code platforma implementatsiyasini interface orqali oladi. Location, notification yoki secure storage har platformada alohida yoziladi. Service locator’dan haddan tashqari foydalanish dependencylarni yashiradi; constructor injection testabilityni yaxshilaydi.
Lifecycle farqi
Android Activity va iOS UIViewController lifecycle’i bir xil emas. Xamarin abstraction umumiy UI beradi, ammo background, permission va memory warning kabi holatlar platforma projectda boshqariladi.
Migration xavfi
End-of-support kutubxonalari security patch va yangi store SDK talablarini olmasligi mumkin. Mavjud Xamarin application uchun dependency inventarizatsiyasi va bosqichli migration rejalashtiriladi.
Bog‘liq tushunchalar
Xamarin, C#, .NET, Xamarin.Forms, Xamarin.Android, Xamarin.iOS, XAML, MVVM, .NET MAUI, Cross-platform development, Native binding