Xamarin
Türkiye [beta]
Konular

Powered by Rise Consulting


Xamarin Nasıl Çalışır?

Xamarin Nasıl Çalışır?

Herhangi bir soru ile karşılaştığınızda soruyu kimin sorduğu çok önemlidir. Çünkü vereceğiniz yanıtın niteliğini değiştirir. Yani aslında parametredir. Biraz daha toparlarsak soru metni ve soran kişi SoruYanıtlama() fonksiyonunuzun parametreleri, yanıt ise dönüş değeridir.

Üstteki paragrafı gözönüne aldığımızda ilk bölümü herkes tarafından anlaşılmaktadır fakat ikinci bölüm sadece daha teknik kişilere yöneliktir.

Dolayısıyla ben de "Xamarin Nasıl Çalışır?" sorusunu yanıtlayacak olan bu yazımı farklı kitlelere yönelik bölümlere ayırıyorum.

 

Geliştiriciler açısından Xamarin Nasıl Çalışır?

Xamarin'de uygulamanın tüm kodunu C# dili ile yazıyoruz. Yani Android için Java ya da iOS için objectiveC ya da Swift'e ihtiyaç duymuyoruz. Bu durum bizi sürekli olarak "Peki bu nasıl oluyor? Native mi?" sorularıyla karşı karşıya getiriyor.

Xamarin'in nasıl çalıştığını anlatmaya başlamadan önce, konuyu daha aşina olduğumuz bir platforma taşıyacak şu soruyu sormakta fayda var;

Windows'un C/C++ ile yazıldığını biliyoruz (kernel.dll, win32.dll). Peki C# ile yazdığımız bir program (.net application), Windows İşletim Sistemi üzerinde nasıl çalışıyor? Peki Windows Forms Application'ın Native olmadığını söyleyebilir misiniz? Native ne demek? Neye göre? Kime göre? Bu sorular bir kenarda sizi yoradursun :)

Bu soru, C#+Xamarin ile geliştirilen uygulamanın Android ya da iOS üzerinde çalışması ile ilgili bir benzerlik yakalamanızı sağlamış olmalı.

İşte kavramımız geliyor; PInvoke!

Doğrudan bilgimiz olmasa da Pınvoke'u sadece İşletim Sistemi ile haberleşmede değil aslında birçok yerde zaten kullanıyoruz; VOIP sistemler,  OpenCV, Speech To Text,…

Konuyu biraz derinleştirmek adına arkada neler dönüyor anlamaya çalışalım;

  1. *h/*hpp/*h++   Header dosyaları okunarak,  c/c++ API ve C# map edilir. (marshaling)
  2. *.c/*.cpp/*.c++  dosyaları nesne dosyalarına "Compile" (cross compile) edilir ve static iOS kütüphanelerine ya da dynamic Android kütüphanelerine link'lenir.
  3. Bu kütüphanaler (#2) .net projesine refere edilir
  4. C# dünyasının kullanımına açabilmek için C# wrapper oluşturulur.

Bu işleme  "Binding (or Wrapping, Bridging) native to c/c++." adı verilir.

Xamarin nasıl çalışıyor sorusunun yanıtı burada gizli. Xamarin,  java jar dosyalarını ve iOS objective-c static lib'lerini (*.a) bu yaklaşımla kullanımımıza sunarak C# geliştiricilerinin "CrossPlatform Native" mobil uygulama üretmelerini sağlamaktadır. (Xamarin Platformunda, C# dili ile yazılan kodun derlenme ve çalışma prensiplerinde (iOS ve Android için) bazı farklılar var, sonraki yazımda konuyla ilgili olarak AOT ve JIT kavramlarına da değineceğim.)

Biliyorsunuz Xamarin OpenSource bir platform. İnceleme şansı bulursanız siz de fark edeceksiniz; aslında içinde bugüne kadar bilinen ve kullanılan tekniklerden farklı bir şey yok (fakat hakkını da teslim etmek adına şunu belirtmekte yarar var; Xamarin hem iOS, hem Android hem de WindowsPhone dönüşümlerini sağlayabilmek adına içerisinde farklı bir çok tekniği kullanan ve üst seviye bir mühendislik yapılarak üretilmiş bir teknoloji. Projenin bugünk verisyonuna ulaşması yıllar sürmüştür).
Temelde birçok  iOS cihazınızda Objective-c ya da swift nasıl çalışıyorsa, java kodu Android cihazınızda nasıl çalışıyorsa, Xamarin compiler ile derlenen uygulamalar da cihazlarınız üzerinde aynı şekilde çalışıyor. Bahsi geçen tüm bu Bridge'lerin isimleri farklı olsa da temelde yaptıkları şey aynı; Bridge burada sadece bir terminolojiden ibaret. (java dünyası JNI diyor, microsoft PInvoke diyor) (P/Invoke olarak da karşınıza çıkacaktır).

Bu kadar derinlere indikten sonra, Xamarin ile üretilen uygulamanın Native olmadığını düşünen kimse kaldı mı oralarda? :)

Daha da derine inmek isteyenler için bir sonraki yazımda Android için JIT ve iOS için AOT anlatacağım.

 

Yöneticiler Açısından Xamarin Nasıl Çalışır?

Microsoft'un satın alması ve ardından OpenSource yapmasıyla birlikte birçok firma dikkatlerini çevirip Xamarin'i daha yakından izlemeye başladı. Yani Xamarin çok popüler bir başlık haline geldi!

Dolayısıyla Xamarin Türkiye'nin kurucusu olarak toplantılara katıldığınız zaman herkesin mutlaka soracak birşeyleri oluyor. Karşılaştığım sorular doğrultusunda farkettim ki;

  • Xamarin ile ilgili bilgilerin bir kısmı çok eski, Xamarin'in ilk çıktığı yıllardaki yorumlardan kalma
  • Bir kısmı C# dünyasındaki heyecandan dolayı abartılı
  • Bir kısmı da java/xcode fanatizminden dolayı oldukça çarpıtılmış, Native olmadığı söyleyenler bile var :)

Şimdi tüm bu hatalı bilgileri düzeltmek ve yöneticilerin, çalıştıkları firmalarda, mobil strateji olarak Xamarin platformunun üretmek istedikleri projeye uygun olup olmadığı konusunda sağlıklı verilere ulaşmalarını sağlamak amacıyla biraz irdeleyelim.

Soru 1: Xamarin Native'mi?

Sorunun yanıtı şüphe götürmez bir şekilde Evet Native.
iOS ve Android doğal ortamlarında üretilen çıktı ile Xamarin ile üretilen çıktı aynı.

Bu soruyla ilk karşılaştığımda, soruyu soran kişi teknik biri değilse şöyle diyorum;
Bir yönetici bu soruyu neden sorar? İşi yöneten kişi açısından bu sorunun yanıtının ne faydası var?

Aldığım yanıtlar benim sorumdan daha çarpıcı;

  • Ne bileyim ben, önce bunu soruyorlar. Native olunca daha mı iyi oluyormuş neymiş işte.
  • Bizim IT müdürü Native olsun diyordu, oradan aklımda kalmış.
  • Native olmayınca web sitesinden farkı olmuyormuş, Native daha hızlı diyorlar.
  • … :)

Aslolanın, ihtiyacı doğru belirleyip uygun çözümü ortaya koymak olduğunu hatırlatarak sorunun yanıtı ve yorumları size bırakıyorum.

Soru 2: Xamarin'in sağladığı bir avantajı var mı?

Ben yine bir soru ile yanıtı baştan vereyim;

Bir yönetici, "Enterprise" uygulamalar için her açıdan daha avantajlı olduğunu bilse, Xamarin ile aynı Native çıktıyı üreten, Native iOS ve Native Android uygulamalara daha fazla zaman, daha fazla enerji ve daha fazla para harcar mıydı sizce?

Önce Native olarak yazılan bir uygulamanın ne kadar yük getirdiğine bir bakalım;

  • Bir ekip/kişi iOS uygulamasının arayüzlerini üretiyor,
  • Bir ekip(ya da aynı ekip/kişi) iOS için işlemleri gerçekleştirecek kodu üretiyor,
     
  • Bir ekip/kişi Android uygulamasının arayüzlerini üretiyor,
  • Bir ekip(ya da aynı ekip/kişi) Android için işlemleri gerçekleştirecek kodu üretiyor,

 

  • Ekip(ler) sahadaki ihtiyaçlar doğrultusunda ortaya çıkacak ihtiyaçlara karşı iOS uygulamasını zaman zaman değiştirmek ve yaşatmak zorunda.
  • Ekip(ler) sahadaki ihtiyaçlar doğrultusunda ortaya çıkacak ihtiyaçlara karşı Android uygulamasını zaman zaman değiştirmek ve yaşatmak zorunda.

    (Not: Kısa bir süre sonra Windows Phone Uygulamaları da yaygınlaşarak bu konuda bir çarpan olarak karşımıza çıkacak)

Peki Xamarin kullanılsaydı;

  • Bir ekip/kişi iOS, Android, WindowsPhone uygulamalarının arayüzlerini aynı anda üretiyor
  • Bir ekip(ya da aynı ekip) iOS, Android, WindowsPhone için işlemleri gerçekleştirecek kodu üretiyor,
  • Ekip(ler) sahadaki ihtiyaçlar doğrultusunda ortaya çıkacak ihtiyaçlara karşı iOS, Android, WindowsPhone uygulamalarını zaman zaman değiştirmek ve yaşatmak zorunda.

Sanırım buradaki avantaj net bir şekilde görünüyor; Bir firma neden aynı işe iki kez zaman ve para harcasın ki? (Sizce uygulamayı kullanacak kişilerin hiçbir zaman fark edemeyecekleri bu detay karşısında fazladan harcanan zaman ve paraya yazık değil mi?)

Eğer firmanızın yazılım ekibi varsa ve uygulamalarınızı bünyenizde geliştiriyorsanız (hele bir de bu yazılımcılar halihazırda VisualStudio, C# tabanını kullanmaktaysa, Xamarin ile aynı ortam ve dil) Xamarin Platformunu kullanmak sizin için birçok lisans ve ekipman maliyetinden kurtulmak anlamına gelecektir.

Uygulamanın üretim süresi kısaldı, elde etme maliyeti düştü, tasarruf sağlandı.
Fayda, fayda, fayda…

 

Şirket Sahipleri Açısından Xamarin Nasıl Çalışır?

Burada yanıtı çok net vermek lazım. Öyle uzun uzun açıklamak olmaz.

Xamarin demek, aynı app'i daha kısa sürede, daha ucuza yapmak demek!

  • Evet daha kısa sürecek, ilk elde etme maliyetini düştü.
  • Daha hızlı ürettik ve kullanılmaya başlandı. Buradan elde edilecek gelir/fayda (?), daha çabuk hayata geçti!
  • Değişiklik ve bakım sürecinde daha az kaynak ile bu işi yürütebileceğiz, aynı işi hem Apple hem de Android için iki kez yapmaya gerek kalmadı. Yürüyen maliyet de düştü!

 

 

Related

Share

Yorumlar

  • Hakan Merhaba, Çok güzel bir soru, bu vesile ile bu yönde merakı olan meslektaşlarımızı bilgilendirelim. Xamarin'de Farklı kaydet ile Kodu çoklama ve bunun doğal bir sonucu olarak yönetilemez hale gelmesi gibi hatalı bir yapı yok. Xamarin'de tek dil, tek kod ile tüm platformlara yönelik Native uygulama üretiliyor. Nitekim bu yönüyle tüm dünyada büyük ses getiren bir teknoloji haline gelmiştir. Xamarin'i iki farklı şekilde kullanabiliyorsunuz; 1) Xamarin.Forms: Bu kullanım şeklinde tüm kod ortak yazılıyor ve Enterprise uygulamalarda %70-%95 civarı tüm platformlar için kodu ortaklaştırıyor. 2) Xamarin Traditional: Bu kullanımda ise, arayüzleri her platform için ayrı ayrı tasarlıyorsunuz, fakat kodlarınız ortak kullanılıyor.
    8/11/2016 12:11:39 PM Reply
  • Merhaba, Faydalı bilgiler için teşekkürler. Cevaplayabilirseniz sormak istediğim bir husus var. Xamarin kullanmaz isek; - 3 farklı platform için 3 dil bilmeli ve 3 farklı kod yazmalıyız. Burası tamam. Xamarin kullandığımız takdirde - 3 farklı platform için 1 dil bilmeli ve 3 farklı kod mu yazmalıyız? Yoksa C# ile sadece 1 kod yazıp bu kodu "Farklı Kaydet" gibi bir işlemle Android için, IOS için ve windows için 3 kere farklı kaydet yapmamız yeterli midir? Yani 1 dil olayı büyük avantaj ama bir dil ile 3 ayrı uygulama yazacaksak bu da zahmet verici bir durum.
    8/11/2016 11:15:00 AM Reply

Yorumunuz

  • Recent
  • Popular
  • Tag
Etkinlikler