Android OS Temellerine Derinlemesine Dalış
Android Uygulamalarının temellerine baktığımızda dört temel bileşen bizi karşılar. Activities,Services,Broadcast receivers ve Content providers. Bileşenlere ve Android OS’a geçmeden önce bir android kullanıcısının yaptıklarına bakalım.
Android telefonumuzda bizi bir Uygulamalar listesi karşılar. Bir uygulama ikonuna tıklayarak uygulamanın açılması sağlanır. Navigation Bar’da ikonlara tıklayarak Geri,Ana Ekran,Son uygulamalar arasında gezinilebilir. Şimdi bu işlemlerin teknik tarafta nasıl olduğuna bakalım.
Android OS aslında Linux’un özelleştirilmiş farklı bir versiyonudur. Linux’da farklı kullanıcıların oluşturulması gibi her uygulama aslında bir kullanıcıdır. Her uygulamanın kendine ait özel alanları vardır. Bu özel alanlara izinlerle erişilebilir. Yüklenen her uygulamanın UID(User ID) ve GID(Group ID)’si vardır.
- UID : Uygulamanın dosya-klasör-kaynaklara erişim vs. kontrol eder
- GID : Belirli bir dizi kullanıcıyı bir araya getirmeyi sağlar. Grup içerisindeki kullanıcılar izinler dahilinde paylaşılan dosyalara erişim sağlayabilir.
Uygulamaların kullanıcı tarafından açılabilmesi için bir başlangıç noktası olmalıdır. Burada dört temel bileşenimizden birine ihtiyaç duyarız.
- Activity : Android uygulamalarının temel yapı taşlarıdır. Bulundukları alanın tamamını kaplarlar. Birbirleri üzerine istiflenirler(Stack)
- Services : Arkaplan süreçleridir(Background processes). Temel olarak bir service başka bir service gerektiğinde etkinleştirilir. Servisler bir uygulamanın dışındaki bileşenlere sunulabilir. Böylece o uygulamanın temel işlevlerinden bazıları diğer uygulamalara açık hale getirilebilir.
- Broadcast Receivers : Interrupt Handlers’a benzer, önemli bir olay oluştuğunda uygulamada işlemek için tetiklenir. Belirli bir olayı işlemezken etkin değildir.
- Content Providers : Bir uygulamanın verilerine başka bir uygulamadan erişmek istediğimizde kullanırız. Dosyaları veya diğer depolama bileşenlerini alabilir. Çoğunlukla SQLite’a güvenir.
Temel bileşenlerimizden uygulamada statik olarak kullanılacak olanlar AndroidManifest.xml de tanımlanmalıdır. Android OS uygulamaları başlatırken Manifest’i kontrol eder buna göre gerekli uygulamaların açılmasını ve uygulamanın ihtiyaçlarını anlar.
Android telefonumuzu açtığımızda Sistem tarafından bir Activity bizi karşılar burada uygulama ikonlarının listesi bulunur. Uygulamalardan herhangi birine temel bileşenlerimiz ile giriş yapabiliriz. Bu uygulama ikonuna tıklamak,notification veya diğer temel bileşenlerle olabilir. Uygulamıza bileşen sayısı kadar giriş noktası vardır.
Kullanıcı uygulama ikonuna tıkladığında sistem buna yanıt vermek için launcher da onClick()’i çağırır. Activity Manager’dan startActivity() çağırılır. Activity Manager Android OS altındaki startViaZygote()’u çağırır. Zygote çatallama(fork) yaparak uygulamanın ayağa kalkmasını sağlar ve sisteme iletir.
Activity Manager
Temel bileşenlerle ilgilenir. Uygulama geliştirirken ANR hatası aldıysanız bunu sağlayan Activity Manager’dır. Activity LifeCycle,OOM ve Low Memory’le de ilgilenir.
Kullanıcı uygulamalara tıkladığında uygulama backstack de bulunabilir veya ilk defa açılacak olabilir. Uygulamalar ilk defa başlatıldığında daha fazla sistem kaynağı yönetmeye başlar.
Donanımın belirli bir kapasitesi vardır bu süreç sonsuza kadar sürmez. Bir noktadan sonra sistemin yeni başlatılan bileşenler/uygulamalar için eski uygulamaları veya düşük öncelikli olanları öldürmesi/serbest bırakması gerekir. İşlemlerin kullanıcı tarafından algılanmaması için android bileşenlere birer LifeCycle sunar. Sistem tarafından LifeCycle CallBack’ler sunulur.
Android’de bellek yönetimi için Out Of Memory(OOM) ve Low Memory olarak iki yapı bulunmaktadır. OOM aslında Linux’da olan yapıdır. Belleği temizlemek için -17 ile +15 arasında bir puanlama sistemi oluşturur. Puan ne kadar yüksekse OOM tarafından öldürülme ihtimali o kadar yüksektir. Puanlama CPU süresi,çalışma süresi,bellek boyutu gibi parametreler ele alınarak hesaplanır. OOM bellek dolmaya başladığında devreye girer. Android geliştiricileri bellek üzerinde daha fazla kontrole sahip olmak istedikleri için Low Memory yapısını oluşturmuştur.
Low Memory’de Belirli eşik değerlerinde sistem tetiklenir. Sistemde arka planda çalışan işlemler alınarak kaydedilir. Eşik değerleri artmaya başladıkça OOM eşiklerde kaydedilmiş olan kritik olmayan arka plan işlemlerini ve ön plan uygulamalarını öldürür.
Zygote
Uygulamaları başlatan özel bir yapıdır. Tüm uygulamalar tarafından paylaşılan bileşenleri birleştirmek ve başlatma süreçlerini kısaltmak için merkezileştirir. Yalnızca yeni bir uygulama başlatılacağında etkindir. Uygulamanın çalışma zamanında potansiyel olarak ihtiyaç duyacağı kaynakları hazırlar.
Sistemde soket oluşturarak dinler ve bir uygulama başlatma isteği aldığında fork’lama işlemi yapar. Fork’lama işleminin avantajı uygulamanın ihtiyaç duyacağı tüm kaynaklar önceden yüklenmiş şekilde hazır olur. Fork işlemleri aslında kendi kopyasını kullanır. Bu yüzden uygulama sayısına bakmaksızın kaynakların tek bir kopyası RAM’de tutulur.
Zygote’un başlattığı ilk uygulama Sistem Sunucusudur(System Server) bu ayrı bir süreç olarak çalışır.
Jetpack Compose için farklı bir durum söz konusu. Jetpack Compose ayrı bir kütüphane olduğu için Zygote’dan faydalanamaz. Bunun yerine 1.0 dan itibaren derlemeler için Profile Installers kullanır.
Intent
Bileşenlerin/uygulamarın etkileşime girmesini sağlar. Intent pasif bir nesnedir. Gönderilmesinin etkileri içeriğine,kullanılan mekanizmaya , yüklü uygulamalara bağlı olarak değişebilir. Uygulamaların kendisi kendisi kullanıcı isteğini sağlamıyorsa diğer uygulamalarla etkileşime girerek bunu sağlayabilir. Örneğin Camera-Galeri işlemlerinde sistem tarafından sağlanan uygulamalarla etkileşime girerek işlemler yapılabilir.
Sistem tarafından sunulan Navigation Bar’da aslında geri,ana ekran,son uygulamalar da birer Intent çağırır. Örneğin Ana Ekran butonu Intent.CATEGORY_HOME’u kullanır.
Görüş, öneri veya eleştirileriniz için LinkedIn veya Twitter’dan ulaşabilirsiniz.