Bilmekte Fayda Var: Android Geliştirirken Karşımıza Çıkan Önemli Detaylar

Murat YÜKSEKTEPE
6 min readDec 13, 2023

Build, Run, Debug, Gradle, JDK, SDK, NDK ne işe yarar?

Gradle

Gradle; çok dilli projelerde de kullanılmakla beraber genellikle Java tabanlı projelerde kullanılan, açık kaynak kodlu bir yapım otomasyon aracıdır. Projenin; derlenmesi, bağımlılık yönetimi, test ortamlarının ayarlanması, paketlenmesi ve dağıtılması gibi önemli işlemleri yürütür.

build.gradle isimli yapılandırma dosyası içerisinde ilgili modüle ait;

  • Kullanacak eklentiler,
  • Temel ayarlar (Örn: minSdk, appId),
  • Derlenme türleri (Örn: release, dev),
  • Derlenme özellikleri (Örn: dataBindig, viewBinding),
  • Java ve JVM ayarları,
  • Modül ve kütüphane bağımlılıkları

Gibi önemli detaylar yer alırken daha geniş kapsama sahip olan settings.gradle dosyası ise;

  • Projenin genel bağımlılıkları,
  • Projenin temel bilgileri,
  • Ve projede yer alacak modüllerin listesi ve bağımlılıkları

Gibi verileri içermektedir.

Gradle’ın temel özelliklerini şöyle açıklayabiliriz:

1 - Değişiklik İzleme: Gradle, derleme sürecini hızlandırmak için sadece değişikliğe uğramış dosyaları izler ve sadece bu dosyaları derleme işlemine tâbi tutar. Bu sayede tüm dosyaların yeniden derlenmeye girmesinin önüne geçmiş olur.

2 - Modüler Yapı Desteği: Büyük projelerde karmaşıklığı azaltmak için kullanılan -kullanılmasını önerdiğimiz- modüler yapılar için destek sunar. Her modül için ayrı gradle dosyası oluşmakta ve bu sebeple her modül için farklı ayarlama seçenekleri kullanılabilmektedir.

3 - Bağımlılık Yönetimi: Projenizin sahip olduğu; harici kütüphaneler ve dış kaynaklar gibi entegrasyonları veya modüllerinizin birbiri arasındaki bağımlılıklarını yönetebilirsiniz.

4 - Script Diller için Destek: Kotlin veya Groovy gibi dilleri kullanarak gradle için yapılandırma dosyaları hazırlayabilirsiniz. Bu, global değişkenler tanımlama özgürlüğü sağladığı için ayar dosyalarınızda daha düzenli ve daha esnek yapılar kurabileceğiniz anlamına gelir.

5 - Plug-in’ler: Gradle’nın desteklediği plug-in dünyası oldukça zengindir. Projeniz için gerekli olan birçok kütüphaneyi kolayca entegre edebilirsiniz.

Java ile hazırlanmış bir uygulamanın bir cihaz üzerinde çalışabilmesi için gerekli olan 3 temel bileşen bulunmaktadır. Bunlar; JDK, JVM ve JRE’dir.

1. JDK (Java Development Kit)

Java diliyle geliştirme yaparken kullandığımız pakettir. Geliştirme, derleme ve çalıştırma başta olmak üzere test etme ve yayınlama aşamaları için de ilgili araç ve kütüphaneleri içerir. JDK’nın temel bileşenlerini şu şekilde sıralayabiliriz;

1.1 - JavaC (Java Compiler): Java kaynak kodlarını analiz edip, JLS (Java Language Specification)’e uygun olanları kabul ederek, JVM (Java Virtual Machine) üzerinde çalıştırabilecek olan Java Bytecode’u, JVMS (Java Virtual Machine Specification)’e uygun şekilde çeviren derleyici araçtır.

1.2 - Jar (Java Archive): Birden fazla Java dosyasını, meta verilerini ve resim, metin gibi kaynak dosyalarını sıkıştırıp tek bir paket yapmaya yarayan araçtır.

1.3 - JavaDoc (Java Documentation): Kodun anlaşılabilir dokümanlarını oluşturmakla görevlidir. Java kaynak kodlarından, HTML tipinde belgeler oluşturabilen araçtır.

1.4 - JDB (Java Debugger): Java kodlarında hata olup olmadığını kontrol eden bir hata ayıklama aracıdır.

1.5 - * JRE (Java Runtime Environment): Temel olarak Java ile hazırlanmış bir uygulamanın düzgün şekilde çalışmasından sorumludur. Bunu, bytecode’un makine diline çevrilip çalıştırılmasını sağlayarak gerçekleştirir.

Farklı işletim sistemleri üzerinde çalışabilen JRE; Java’nın derlenmesi için gerekli yardımcı araçları barındırır. Java kodu ile işlemci arasındaki köprüyü kurma görevindedir diyebiliriz. JRE, 3 temel bileşenden oluşmaktadır.

1.5.1 - ClassLoader: Java ile uygulama geliştirenlerin kullandığı en temel görevler birer kütüphane olarak JRE içerisinde bulunmaktadır. ClassLoader bu temel dosyaları, talepleri geldikçe JVM içerisine yüklemek ile sorumludur.

1.5.2 - Bytecode Doğrulayıcı: JDK içerisinde yer alan Java Compiler’ın, Java dilinde yazdığınız kodu bytecode’a çevirdiğinden bahsetmiştik. JRE içerisinde yer alan bytecode doğrulayıcı ise hazırlanmış olan bu bytecode’u; yapısal doğruluk, sistem bütünlüğü veya erişim hakları yönünden inceler ve eğer bir hata varsa işlemi keser.

1.5.3 - Yorumlayıcı: Eğer bytecode’da hiçbir sorun yoksa, Yorumlayıcı; JVM’i oluşturarak kodun çalıştırılması işlemini başlatır.

Bu temel bileşenler dışında JRE;

- Uygulama kalitesini arttırmak,

- Ara yüz kullanımı kolaylıkları sağlamak,

- 2D grafikler çizdirmek,

- Animasyon ve özel efektler sağlamak,

- Java ile diğer dillerin iletişimi geçmesini kolaylaştırmak,

- Veri tabanı bağlantısı ve yönetimi sağlamak,

- Log kayıtları tutmak,

- Uygulamanın dosya boyutunu azaltmak için sıkıştırma işlemleri sağlamak

ve benzeri gibi bir çok işlemlere sahip birçok yardımcı bileşen de içermektedir.

1.6 - * JVM (Java Virtual Machine): JRE’in 3. Maddesinde kısaca “yorumlayıcı” olarak bahsetmiş olsak bile JVM için ayrı bir başlık açmak gerekmektedir. JVM, işletim sisteminden bağımsız çalışabildiği için Java’nın temel ilkesi olan “bir kez yaz, her yerde çalıştır”ı gerçekleştirebilmek adına çok önem arz etmektedir.

JVM, Java kodlarının bytecode’a çevrilmesinden -yani .class dosyalarının oluşturulmasından- sonra satır satır yürütülmesinden sorumludur. JVM’in temel görevlerini şöyle sıralayabiliriz;

1.6.1 - Bytecode Çalıştırma: JVM, derleyici (JavaC) tarafından oluşturulmuş Java Bytecode’ları, işlemcinin anlayıp kolayca çalıştırabileceği makine diline çevirir. Java’yı platform bağımsız kılan şey tam olarak budur.

1.6.2 - Bellek Yönetimi ve Garbage Collection:
JVM, Java uygulamaları çalışırken belleği dinamik olarak yönetebilmesine olanak tanır. Ayrıca artık kullanılmayan nesneleri “çöp toplama” özelliği sayesinde bellekten silerek daha optimal bir bellek yönetimi sağlar. Garbage Collection (Çöp Toplama) sayesinde Java geliştiriciler “bu nesnenin görevi tamamlandı, artık yok edilmesi gerekir” endişesi taşımak zorunda kalmazlar.

3- Eş Zamanlılık Yönetimi: JVM, birden fazla iş parçasının (thread) aynı zamanda kullanılması ve yönetilmesine olanak sağlar.

Build

Bir Android projesinin; kaynak kodlarının, harici ve dahili bağımlılıkların derlenmesi ve çalıştırılabilir bir paket haline getirilmesini sağlar. Build aşaması devam ederken bir hata alınırsa bunlara build-time hataları denir ve projenizde çalıştırılmaya engel bir sorun olduğunu anlamına gelir.

Bu tarz hatalar genellikle syntax (yazım yanlışları), import ederken karşımıza çıkan yanlış veya hatalı bir dosyanın adreslemesi, çok belirgin olan veri tipi uyumsuzlukları veya değişken erişimlerinin yanlış planlanması gibi durumlardan kaynaklanır.

Build işlemi genel olarak şu 4 adımdan oluşur;

1 - Derleme: Android projenizi oluşturan; XML, JSON, Groovy, Java veya Kotlin dilinde yazdığınız kaynak kodların derlenmesi.

2 - Bağımlılık Yönetimi: Projemiz içerisinde kullandığımız dahili ve harici bağımlılıkların uyumluluk kontrolleri ve entegrasyon işlemleri.

3 - Kaynak Dosya Yönetimi: Projemiz içerisinde kullandığımız; görseller, videolar, sesler, yazı tipleri, kural metinleri veya metin dosyaları gibi kaynakların işlenmesi, kontrolleri ve pakete dahil edilmesi.

4 - Paket Dosya Oluşturma: Bütün bu aşamalar başarıyla tamamlandıktan sonra Android işletim sistemine sahip sanal veya fiziksel cihazlarda çalıştırılmak üzere -genellikle- APK (Android Package) dosyasının oluşturulması işlemi.

Build işlemi; geliştiricinin, proje üzerinde build-time hatalar olup olmadığını kontrol etmesini sağlar. Yine de tek başına kullanımı çok yaygın değildir. Geliştiriciler olarak bizler genelde “run” işlemini kullanırız.

Run

Türkçe karşılığı olan “çalıştır” kelimesinden de anlayabileceğimiz gibi run; bir Android projesinin derlenip, sanal veya fiziksel bir cihaz üzerinde çalıştırılmasını ifade eder. Projenin doğru şekilde çalıştığı, uygulamanın cihaz üzerinde nasıl tepki verdiğini görmemizi sağlar.

Run app

Run komutu; build işlemini otomatik olarak başlatıp, tamamlanmasının ardından ekstra olarak şu 2 aşamalı işlemler sırasını başlatmış olur:

1 - Yükleme: Oluşturulan APK dosyası, hedeflediğiniz bir fiziksel veya sanal cihaza yüklenir.

2 - Çalıştırma: APK dosyası, belirlediğiniz cihaza yüklendikten sonra uygulamanız çalıştırılır. Böylece uygulamanızı görüntüleme, test etme, hata olup olmadığını yakalama aşamasına geçebilirsiniz.

Debug

Hepimizin bildiği üzere projemizde var olan hatalara “bug” diyoruz. Debug kelimesi ise hataların ayıklanması ve çözülmesi sürecini ifade etmektedir. Android Studio’da bulunan “debug” butona bastığımız zaman bütün proje sıfırdan derlenir ve debug modda -yani hata ayıklama modunda- çalıştırılır.

Debug app

Hatayı uygulamanın başlangıcından sonuna kadar bütün senaryo içerisinde arıyorsak veya kullandığımız base yapılardan şüpheleniyorsak bu yönteme başvururuz.

Attach Debugger To Android Process

Attach Debugger to Android Process

Eğer hata araması yapmak istediğimiz ekranın tam olarak neresi olduğunu biliyorsak uygulama normal akışına devam ederken, debug modunu başlatmak istediğimiz an bu seçeneği kullanarak hata ayıklama modunu sonradan başlatabilmemiz mümkündür.

BreakPoint

BreakPoint

Hataya sebep olduğunu düşündüğünüz bir kod satırı varsa, debug modun tam bu satır üzerinde duraklaması ve o anki değişkenlerin; bellekteki referansları, içerdiği değerler, null olup olmamaları gibi durumları kontrol edebilmenizi sağlayan kesim noktalasıdır.

SDK (Software Development Kit)

Android SDK, Android uygulamalar geliştirirken kullandığımız geniş çaplı ve çok içerikli bir araçtır. İçerisinde; örnek kodlar, örnek projeler, kütüphaneler, uygulamalarımızı çalıştırabilmemiz için bir sanal cihaz (emulator), debug araçları, dokümanlar ve eğitimler bulunmaktadır.

Kotlin için standart kütüphaneler, syntax’ı kontrol eden lint aracı, ekranlarımızı oluştururken kullandığımız XML’ler için bazı araçlar, Kotlin’in şahane bir özelliği olan “reflection”, JSON verilerimizi daha verimli kullanmak için tercih ettiğimiz GSON kütüphanesi ve daha birçok araç Android SDK içerisinde yer almaktadır.

Android SDK / lib klasörünün içeriği

Tabii bu kütüphane ve yardımcı araçlar, standart olarak geldiği gibi sizin sonradan indirdiğiniz kütüphaneleri de kapsamaktadır.

NDK (Native Development Kit)

Kısaca; Android uygulama geliştirirken, Java -veya Kotlin- dışında C veya C++ gibi yerel bir dil kullanmanız gerektiğinde başvurduğumuz bir araç setidir. İşlemciye daha yakın çalışan C ve C++ gibi diller, Java’ya göre; grafik işleme, ses işleme ve yüksek hesaplamalar gibi işlemlerde çok daha performanslı olabilir. Ayrıca NDK, cihazın donanımsal yapısına Java’dan daha fazla erişme özelliği sağlar. Bu sebeple, örneğin daha yüksek işlemci gerektiren görevler için tercih edilebilir.

--

--