Skip to content

Android Projesi Nasıl Git Submodule Kütüphanesi Yapılabilir?

Android Projesi Nasıl Git Submodule Kütüphanesi Yapılabilir?

Bu yazıda Android Git Submodule kütüphanesi nasıl yapılabilir sorusuna cevap vereceğim ancak nereden başlayacağımı tam olarak bilmiyorum. Galiba “Bir Android Projesi başka bir Android projesine nasıl eklenir” sorusunu kendime ilk sorduğum zamandan başlasam iyi olacak. Böyle bir ihtiyaç neden ve ne zaman doğdu?

Tam geçen sene birkaç hafta önce başlamıştı her şey. Peakup’ta işe girme sürecim devam ederken Peakup Labs departman yöneticisi Emrah Uslu ile yaptığımız teknik görüşme esnasında “Kaç proje yapacağız? Nasıl projeler yapmayı düşünüyorsunuz? Takımda Native Mobil geliştirici var mı?(Bu soru Legacy kod var mı anlamına gelir ve sorulması gerekir) …” vb bir çok soruyla kendisini güzel darlamıştım. “Yapılacak çok proje var hiç merak etme” diyerek, seneler sürecek tek bir büyük proje yerine irili ufaklı birbirinden farklı bir çok proje yapacağımızı ekledi. Bir önceki iş yerimde aklıma düşmüş olan “farklı projeler arasında ortak olarak kullanılabilecek bir Kütüphane” fikri bir kez daha mantıklı geldi. Kendisine bundan bahsettim mi hatırlamıyorum. İş başı yaptığım ilk günden itibaren bu tarz bir ortak kütüphane yapmamı özellikle talep etmişti.

Java mı? Tabiiki biliyorum Emrah Bey.

Örneğin Login sayfası, Dil ayarları sayfası neredeyse her projemizde var ve aynı. Veya onlarca method, özelleştirilmiş buton, envai çeşit view(CustomView), Extension function, Web servis request mimarisi, DSL yazacağız ve bunların her projede de bulunması gerekiyor. Üstüne üstlük hepsi aynı. Kopyala yapıştır döngüsüne girip projeyi çöpe çevirmektense bu ortak sayfaları ve özellikleri ayrı bir kütüphaneye ekleyip oradan ortak bir şekilde kullanmak daha basit ve akla yatkın değil midir?

Kopyala yapıştırın çok büyük bir zararını daha önce şöyle yaşamıştım: Birbirinden forklanarak oluşturulmuş 8 10 tane proje vardı. En ufak servis değişikliği bu projelerin hepsinde aynı değişikliği tek tek tekrar tekrar amele amele yapmak anlamına geliyordu. Ne derseniz deyin bu iyi bir geliştiricilik örneği değildir. Yapmayın. Uzak durun. Fork özelliğini çok daha verimli kullanabilirsiniz ve kullanın.

Open/Closed Principle, Software Reuse Don’t Repeat Yourself, Hatta SOLID prensiplerinin hepsi kütüphane sistemlerini şöyle bir düşündüğünüz zaman göreceksiniz ki büyük oranda destekler, kod kopyala yapıştır yapmayı da sağlıklı bulmaz.

 

Teknik Olaraakk?

Ne olduğunu ve neden gerekli olduğunu yeterince anlattığımı düşünüyorum. Peki anladık da teknik olarak tam olarak nasıl yapacaksın gibi bir soru zihninizde oluştuysa buyrun. Kütüphane deyince aklıma başta direk JAR dosyaları geldi. Ancak gördüm ki JAR dosyaları sadece Java SDK’sındaki sınıfları barındırabilir. Android SDK’sındaki Activity, Fragment, SharedPreferences, WifiManager… gibi sınıfları barındıramaz. Benim istediğim Kütüphane yapısında Activity, SharedPreferences gibi yapılar bulunmak zorunda. Bu durumda aklımıza gelen bir diğer yapı ise AAR dosyaları. AAR dosyalarının birkaç dezavantajı var. Bunlardan bir tanesi ve en büyüğü herhangi bir kod ekleyişinizde yeni bir AAR uzantılı dosya yaratıp bunu asıl projenize eklemeniz gereğidir. Peakup’ta legacy kodun bulunmadığı, kütüphanenin de asıl uygulamaların da tamamen sıfırdan, birlikte ve paralel yazılacağı düşünüldüğünde AAR dosyaları ile uğraşmak gerçekten eziyet verici. Kütüphane önceden yazılmış ve hazırlanmış olsa tamam AAR daha küçük yer kaplayacağı için tercih sebebim olurdu tabiiki ama değil.

Gerekliliklere baktığımız zaman:

  • Dinamik bir yapı başta geliyor.
  • Sürekli değişime yatkın. Ve sürekli değişimde bana(geliştiriciye) çok iş çıkarmayacak bir yapı.
  • Open / Closed Principle’a tapınma derecesinde uyması gerekiyordu. Çünkü bir çok proje yapacaktık ve yeni projelerde kütüphaneye kod eklediğim zaman varolan projeleri de bozmamalıydım. Herhangi bir proje VSTS’ten indirildiği an çalışıyor vaziyette olmalıydı.
  • İşte burada devreye Git’in bir özelliği olan Submodule girdi.

Kütüphane ilk olarak her projede aynı şekilde kullanılacak bir Authenticator katmanı içermeliydi. Malum giriş yapma ekranı. Kütüphanenin en büyük işi bu olduğu için adını PeakAuth olarak belirledik. O günden sonra PeakAuth gel PeakAuth git resmen çocuğum gibi oldu. Sevdim iOS’a geçene kadar sürekli geliştirdim sürekli bir şeyler ekledim… Peakup’ta yazdığım ilk Android Uygulama EnviSense‘ti. Ve sürekli “aa bu extension function’ı ben başka projelerde de kullanırım PeakAuth’a ekleyeyim. Aaa ben bu tarih formatlarını her projede neden tekrar yazayım ki hemen PeakAuth’a ekleyeyim…” diye diye Kütüphaneye ortak kullanılacak özellikler ve kod parçacıkları zamanla eklene eklene büyüdü. Çocuk örneği verdim ya tam bir çocuktu yani.

Tamam kodu ver artık hadi çok konuştun içim şişdi.

Not: Android Git Submodule, Git’in bir özelliği olduğu için kütüphane de asıl projemiz de git içerisinde barınmak zorunda.

 

Bir Uygulamayı Nasıl Android Git Submodule Haline Getirebiliriz?

Ana projemize kütüphaneyi eklemeden önce PeakAuth’un bir kütüphane olması gerekmektedir. Bunun için yapmamız gereken 3 adım vardır ve çok basittir.

    1. Android’de bir kütüphane projesi, başlatıcı bir activity ye sahip olamaz. AndroidManifest dosyasındaki hiçbir activity Launcher etiketine sahip olamaz.
    2. Android’de bir kütüphane projesi, app level build dosyasında en yukarıda com.android.application etiketine değil com.android.library etiketine sahip olur.
    3. 2.madde ile aynı dosyada default config bölümü altında normalde uygulamalarda bulunan applicationId kütüphanelerde bulunmaz, silinmesi gerekir.

İşte bu kadar. Artık PeakAuth diğer projelerde de ortak olarak kullanılabilecek bir kütüphane haline geldi.

Bir Kütüphaneyi Başka Bir Android Projesine Nasıl Ekleyeceğiz?

Kütüphane projemizi oluşturduktan sonra sıra geldi bunu kullanacağımız Android projelerine nasıl ekleyeceğimize. İsterseniz bunu Git’teki README dosyasına yazın ki ekip halinde çalışıyorsanız diğer arkadaşlarınıza kolaylık olsun. Hem bu tip önemli noktaların şirketteki tek bir geliştiriciye bağlı olmaması gerekir. Ayrıca sadece yapanın değil diğer geliştiricilerin de çok basit bir şekilde anlayabilmesi, ekleyebilmesi ve ihtiyaç olduğunda kullanabilmesi gerekir. Yazıda da pek çok kere bahsettiğim, Peakup’ta kullandığımız PeakAuth isimli Android ortak kütüphanesinin README dosyasında nasıl ekleneceği açık bir şekilde yazıyor. Çok önemli olan bir noktayı en başından belirtmem lazım. Aşağıda yazdığım son adıma kadar sync işlemi yapılmaması gerekmektedir. Tüm bağlantı ve ayarlar tamamlandıktan sonra sync yapılacaktır.

    1. Terminalden kütüphaneyi eklemek istediğiniz proje cd komutu çalıştırılarak açılır. İçerisine aşağıda gösterilen kod yazılır ve kütüphanenin linki eklenir.
      git submodule add https:…Veya çok daha basit bir şekilde SourceTree üzerinden de ekleyebilirsiniz. Projenize Git Submodule ekleyecekseniz hele benimki gibi dinamik bir amacı varsa bence mutlaka SourceTree kullanın. Proje içerisindeki submodule’ün yönetimi çok çok daha basit olacaktır. Projeyi SourceTree’de açtığınızda alttaki ekran görüntüsünde de gördüğünüz gibi Submodule seçeneğine sağ tıklayın ve Add Submodule seçeneğine tıklayın.
    2. Açılan pencerede gerekli bilgileri ve Submodule’ün linkini girin. Eğer Submodule’de birden fazla branch varsa da Advanced Options seçeneği ile hangi branche bağlamak istediğinizi yazabilirsiniz. Ardından tabiiki OK butonuna basmanız gerekiyor. Burada eklediğiniz dosyaya verdiğiniz isim çok önemlidir. Biz Peakup Labs mobil geliştiricileri olarak PeakAuth kütüphanesinin bulunacağı dosyaya haliyle “peakauth” ismini veriyoruz.

      Bu adımın ardından asıl projenize .gitmodule dosyası otomatik olarak eklenecektir.
    3. Projenin settings.gradle dosyasına girilerek şu satırlar eklenir
      :include ':peakauth'
      project(':peakauth').projectDir = new File('peakauth/app')
      
      

    4. Projenin application level gradle dosyasına şu satır dependency olarak eklenir
      implementation project(":peakauth")
    5. Sync yapılır. Yukarıda da söylediğim gibi bu adıma kadar sync yapılmaması gerekmektedir.

Eğer herhangi bir ara adımda yanlışlıkla sync yaptıysanız tüm değişiklikleri Git üzerinden Reset/Discard yapıp eklenen dosyaların tümünü silip sürece baştan başlamanız gerekmektedir. Son commit’e dönün yani. Ben birkaç kere yaptım ve baştan başlamaktan daha temiz bir yol bulamadım. Ayrıca kütüphane ekleme sürecine başlamadan önce de bir commit atmanızı tavsiye ederim. Başka değişiklikler olmasın ki toplu reset yaptığınızda kod kaybına uğramayın.

Projeniz yukarıdaki ekran görüntüsündeki gibi iç içe görünüyorsa Android Submodule kütüphanesi kullanıma hazır demektir. Gördüğünüz üzre içinde istediğiniz gibi gezebilirsiniz. Ki bu da AAR tipi kütüphanelerde olmayan bir özellik. Baştaki icon da önemli. Alttaki ekran görüntüsünde de SourceTree üzerinde projenizin nasıl görünmesi gerektiğini iletiyorum.

 

PeakAuth’a yani submodule olan kütüphanenize commit/push attığınızda SourceTree’de asıl projenizin altında duran Submodule’e tıkladığınızda nasıl görüneceğini de alttaki ekran görüntüsünde görebilirsiniz.

 

Hayat Kurtarıcı Not: Submodule’ü sadece kendi Repositorysinden kendi içinden güncelleyin. EnviSense’in içindeki PeakAuth’u güncellersek eğer bu asıl PeakAuth’a da yansıyacaktır ve kütüphaneyi kullanan diğer tüm projelerimizi bozabilir. Submodule’ü Dikkatli kullanmazsanız ortalığı fena karıştırabilirsiniz. Her ne kadar tatlış olsa da yönetimi projeler ilerledikçe zorlaşacaktır.

Android’de Submodule kütüphane kullanımı hakkında daha fazla bilgi istiyorsanız alttaki 2 kaynak benim için çok faydalı olmuştu. Onları da buraya ekliyorum.

https://medium.com/@deepakpk/how-to-add-a-git-android-library-project-as-a-sub-module-c713a653ab1f
https://proandroiddev.com/creating-a-library-for-android-ea976983db1

Blogumuzdaki diğer android yazıları için tıklayınız

İyilik ve Sevgi dolu, Bol okumalı günler dilerim.