Bu yazıda android işletim sisteminin çalışmaya başlamasından, bir uygulamanın nasıl başlatıldığından ve zygote prosesinden bahsedeceğiz.
Öncelikle tamamen kapalı bir telefonun açma tuşuna bastığımızda neler olduğuna bakalım.
Bir android sistem ilk başlatılırken arka planda gerçekleşen olaylar aşağıdaki gibidir.
Bu küçük parça işlemci içerisine yerleştirilmiş yazma korumalı küçük bir rom bellek parçasıdır. Görevi ise bootloaderi başlatmaktır.
Görevi çekirdek başlatılmadan önce sistem dosyalarının çalışma alanına yüklemektir.
Kernel kurulum önbelleği, korumalı belleği ve sürücüleri yüklemek gibi görevleri üstlenir. Kısaca görevi sistem kurulumunu yapmaktır diyebiliriz. Bu işlemlerden sonra kernel dosyalardaki init fonksiyonlarını çalıştırarak ilk işlemleri yapmış olur.
Init fonksiyonunun iki görevi vardır. Birisi dev, sys, proc gibi dizinleri bağlamak, diğeri Service Manager gibi işlemleri başlatan init.rc scriptini başlatmaktır. Zygote Proseste bu aşamada başlarılır.
Dalvik bir sanal makinedir. Uygulamaları dalvik tam zamanında derleme yaparlar.
Android sistemde her uygulama kendi dalvik sanal makinesi içerisinde çalışır. Buna kendi containeri de diyebiliriz. Ana zygote prosesin görevi uygulamalar tarafında kullanılacak olan temel java kütüphanelerini bellek üzerine yüklemek ve ilgili uygulamaların bu kütüphaneleri kullanımını yönetmektir. Android sistemi zygote prosesin main fonksiyonunu çağırarak bu işlemlerin gerçekleştirilmesini sağlar.
Her yeni zygote işlemi ana zygotenin bir alt prosesidir. Bir uygulama başlatılacağında ana zygote den kendini kopyalayarak kendi container yapısına sahip olur.
Bir uygulama başlatılırken ana zygote prosesinden kullanacağı java kütüphanelerine nasıl erişeceğini gösteren bir map alır.Tüm uygulamalar ortak kaynak kullandığı ve bütün java sınıflarını kendi içine kopyalamadığı için sistem performans kazanmış olur.
Ana zygote Activity Managerden uygulama başlatma isteği almadan önce sistem serveri başlatır.
System server zigot tarafından başlatılan ilk prosestir ve başlatıldıktan sonra ayrı bir proses olarak yaşar. En önemli görevlerinden birisi System Managere başlatılan her uygulamayı yazmak ve Activity Manageri başlatmaktır.
Activity Manager uygulamaların arayüzleri ile ilgili işlemleri yöneten servistir.
Burada zygote prosese biraz ara verip telefon penceresinde bulunan bir uygulamanın ikonuna tıklanıldığında arka planda gerçekleşen olaylara bakalım.
Bir uygulamanın ikonuna tıklanıldığında bu olay bir intente (Start Activitye) dönüştürülür. Binder IPC aracılığı ile ActivityManagerService yönledirilir burada aşağıdaki işlemler yapılır.
İlk olarak ıntent nesnesi hakkında bilgi toplamaktır. Bu işlemi PackageManager resolIntent methodu ile yapılmaktadır.
İkinci aşamada ise istenilen uygulama için kullnıcının gerekli izinlere sahip olup olmadığını kontrol etmek için grandUriPermissionLocked fonksiyonu çağrılır.
Üçüncü aşamada kullanıcı yeterli izinlere sahip ise ActivityManagerService de başlatılan uygulamanın yeni bir container içerisinde başlatılıp başlatılmayacağını denetler. Bİr uygulama diğer uygulamalar tarafında çağrılarak diğer uygulamanın containeri içersinde basit olarak çalıştırılabilir. Bu denetimi yaparken FLAG_ACTIVITY_NEW_TASK ve FLAG_ACTIVITY_CLEAR_TOP gibi flaglardan faydalanır.
Bu aşamadan sonra ProcesRecord boş ise Activity Manager servisin için yeni bir proses oluşması gerekir. Application başlatılmasını gösteren resmimiz de olduğu gibi bunun üç safhası vardır.
İlk safhada ActivivtyManagerService soket bağlantısı üzerinden Zygote prosesine argüman gönderen startProcessLocked methodunu çağırarak yeni bir proses oluşmasını sağlar. Zygote yukarıda bahsettiğimiz gibi kendini kopyalar ve Activity Thread nesnesi oluşturan ve yeni bir proses id oluşturan ZygoteInt.main fonksiyonunu çağırır.
Her proses kendi iletilerinin yönetilmesi için bir Looper nesnesine sahiptir her tetiklendiğinde Looper.loop() öğresini çağrılır.
İkinci safhada yeni oluşturulan prosese uygulamayı eklemektir. Bu işlem bindApplication fonsiyonu ile yapılır bu fonksiyon İleti sırasına BIND_APPLICATION mesajını göndererek makeApplication fonksiyonunun tetiklenmesini ve uygulama claslarını zygote tarafından oluşturulan containerin hafızasına yüklenmesini sağlar.
Son safhada ise realStartActivity fonksiyonu ile ileti sırasına LAUNCH_ACTIVITY mesajı gönderilir. Bu mesaj handleLaunchActivity ile işlenerek uygulamadaki onCreate methodu başlatılır.