Bir APK dosyasında "Yükle"ye dokunduğunuzda veya Play Store'dan bir uygulama indirdiğinizde, sahne arkasında karmaşık bir işlemler dizisi başlar. Basit bir ilerleme çubuğu gibi görünen şey aslında paket ayrıştırma, kriptografik doğrulama, izin yönetimi, dosya çıkarma ve kod optimizasyonunu içeren düzinelerce adımı temsil eder. Bu süreci anlamak, kurulumların neden bazen başarısız olduğunu ve bu konuda neler yapabileceğinizi açıklamaya yardımcı olur.
Bu makalede, sistemin bir APK aldığı andan uygulamanın başlatılmaya hazır olduğu noktaya kadar Android kurulum hattının her önemli adımını inceleyeceğiz.
Adım 1: Kurulumu Başlatma
Yükleme işlemi kaynağa bağlı olarak farklı şekilde başlar:
- Oyun Mağazası: Play Store uygulaması APK'yı (veya bölünmüş APK'ları) indirir ve bazı kullanıcı onaylarını atlayan özel ayrıcalıklarla sistemin paket yükleyicisini çağırır.
- Yan yükleme: Bir APK dosyasını açtığınızda Android, paket yükleyici etkinliğini başlatır. Android 8.0 ve sonraki sürümlerde, yükleme uygulamasının kendi kaynağı için "Bilinmeyen uygulamaları yükleme" iznine sahip olması gerekir.
- ADB: adb install komutu, grafik yükleyiciyi tamamen atlayarak USB üzerinden paket yöneticisi hizmetiyle doğrudan iletişim kurar.
Kaynaktan bağımsız olarak tüm kurulumlar sonuçta aynı sistem hizmetine ulaşır: Paket Yöneticisi Hizmeti (PMS). Bu, Android'deki tüm paket işlemlerinin merkezi otoritesidir.
Adım 2: Paket Ayrıştırma
Her şeyden önce sistemin ne yükleyeceğini anlaması gerekir. PackageManagerService, APK dosyasını okumak ve meta verilerini çıkarmak için Paket Ayrıştırıcı'yi çağırır.
Ayrıştırıcı AndroidManifest.xml dosyasını APK içinden okur. Bu ikili XML dosyası kritik bilgiler içerir:
- Paket adı: Uygulamanın benzersiz tanımlayıcısı (ör). com.example.myapp
- Sürüm kodu ve adı: Bunun bir yükseltme mi yoksa yeni bir yükleme mi olduğunu belirlemek için kullanılır
- Minimum ve hedef SDK sürümleri: Cihazla uyumluluğu belirler
- Bildirilen izinler: Hem uygulama isteklerine hem de tanımladığı özel izinlere izin verir
- Bileşenler: Uygulamanın kaydettiği etkinlikler, hizmetler, yayın alıcıları ve içerik sağlayıcıları
- Donanım ve yazılım özellikleri: Kamera, GPS veya belirli OpenGL sürümleri gibi gereksinimler
Manifest hatalı biçimlendirilmişse veya APK yapısı geçersizse bu aşamada kurulum "Ayrıştırma hatası" mesajıyla başarısız olur. Bu, yandan yüklenen APK'ların yüklenememesinin en yaygın nedenlerinden biridir.
3. Adım: Uyumluluk Kontrolleri
Bildiri ayrıştırıldıktan sonra sistem bir dizi uyumluluk kontrolü gerçekleştirir:
- SDK sürümü: Uygulamanın minSdkVersion'si cihazın API seviyesinden yüksekse kurulum reddedilir.
- ABI uyumluluğu: APK yerel kitaplıklar içeriyorsa sistem bunların aygıtın CPU mimarisiyle eşleşip eşleşmediğini kontrol eder. Yalnızca armeabi-v7a kitaplıklarına sahip bir APK, yalnızca x86 içeren bir cihaza yüklenmez.
- Gerekli özellikler: Uygulama gerekli donanım özelliklerini (android.hardware.telephony gibi) bildirirse sistem, cihazın bunları desteklediğini doğrular.
- Mevcut depolama alanı: Sistem, ayıklanan yerel kitaplıklar ve optimize edilmiş DEX dosyaları için alan da dahil olmak üzere, uygulamayı yüklemek için yeterli boş alan olup olmadığını kontrol eder.
Adım 4: İmza Doğrulaması
Bu, kurulum sürecindeki en kritik adımlardan biridir. Android, bütünlüğünü ve orijinalliğini sağlamak için APK'nın kriptografik imzasını doğrular.
Doğrulama süreci hangi imzalama şemalarının mevcut olduğuna bağlıdır:
V1 İmzası (JAR İmzası)
Sistem şunları kontrol eder: dosyaları dizini (.SF,). APK'daki her dosya manifestte listelenen özetlere göre doğrulanır. Bu yavaştır çünkü her dosyanın ayrı ayrı hashlenmesi gerekir. META-INF/ .RSA .DSA
V2 İmzası (APK İmza Şeması v2)
Android 7.0'da tanıtılan bu şema, APK'nın tamamını ikili bir blob olarak imzalar. İmza bloğu, ZIP merkezi dizini ile merkezi dizin sonu kaydı arasına eklenir. Doğrulama çok daha hızlıdır çünkü tek tek girişlerin sıkıştırmasını açmaya gerek kalmadan ham baytlar üzerinde çalışır.
V3 İmzası (Anahtar Döndürme)
Android 9.0'dan itibaren mevcut olan V3, anahtar döndürme desteğiyle V2'yi genişletiyor. Eski ve yeni imzalama anahtarlarını birbirine bağlayan, geliştiricilerin güncelleme uyumluluğunu korurken imzalama anahtarlarını değiştirmelerine olanak tanıyan bir rotasyon kanıtı yapısı içerir.
V4 İmzası (Artımlı)
Android 11, artımlı kurulumlar için V4'ü tanıttı. Cihaza aktarılırken ayrı ayrı blokların doğrulanmasına olanak tanıyan Merkle ağacı tabanlı bir imza sağlar.
İmza doğrulaması herhangi bir nedenle başarısız olursa kurulum derhal iptal edilir. APK Doğrulayıcı aracı ürünümüzü kullanarak kurulumdan önce bir APK'nın imzasını kontrol edebilirsiniz.
İmza Eşleşmesini Güncelle
Aynı paket adına sahip bir uygulama zaten yüklüyse sistem ek bir kontrol gerçekleştirir: Yeni APK'nin imzalama sertifikası mevcut kurulumun sertifikasıyla eşleşmelidir. Bu, kötü niyetli bir tarafın meşru bir uygulamayı tahrif edilmiş bir sürümle değiştirmesini önler. İmzalar eşleşmiyorsa "Uygulama yüklenmedi: Paket, aynı adı taşıyan mevcut bir paketle çakışıyor." hatasını görürsünüz.
Adım 5: Kullanıcı Onayı
Yandan yüklenen kurulumlar için sistem aşağıdakileri gösteren bir kurulum onay iletişim kutusu görüntüler:
- Uygulama adı ve simgesi (APK kaynaklarından alınmıştır)
- Uygulama isteklerine izin verir (eski Android sürümlerinde)
- Bunun yeni bir kurulum mu yoksa güncelleme mi olduğu
- Uygulamanın kaynağı veya potansiyel riskleri hakkında her türlü uyarı
Android 12 ve sonraki sürümlerde, çalışma zamanı izinleri yükleme sırasında değil, uygulama onlara ilk ihtiyaç duyduğunda ayrı ayrı verildiğinden onay ekranı daha basittir.
Adım 6: Dosya Çıkarma ve Yerleştirme
Kullanıcı onayladıktan sonra (veya Play Store yüklemeleri için otomatik olarak), sistem dosyaları çıkarmaya ve yerleştirmeye başlar:
APK Depolama
APK dosyasının kendisi /data/app/[package-name]-[random]/base.apk'ye kopyalanır. Bölünmüş APK kurulumları için split_config.arm64_v8a.apk gibi ek dosyalar temel APK'nın yanına yerleştirilir. İndirilenler klasöründeki orijinal APK değiştirilmez veya silinmez.
Yerel Kütüphane Çıkarma
APK yerel kitaplıklar içeriyorsa (lib/ dizininde), bunlar /data/app/[package-name]-[random]/lib/[abi]/'ye çıkarılır. Daha yeni Android sürümlerinde uygulamalar, yerel kitaplıkları APK içinde sıkıştırılmış halde tutmayı ve bunları doğrudan android:extractNativeLibs="false" kullanarak yüklemeyi tercih edebilir, bu da depolama alanından tasarruf sağlar.
Veri Dizini Oluşturma
Sistem, uygulamanın özel veri dizinini /data/data/[package-name]/ (veya çok kullanıcılı cihazlarda /data/user/0/[package-name]/ konumunda oluşturur). Bu dizin, uygulamaya atanan benzersiz bir Linux UID'sine aittir; bu, başka hiçbir uygulamanın root ayrıcalıkları olmadan bu dizine erişemeyeceğini garanti eder.
Adım 7: DEX Optimizasyonu
Bu adım, Android'in uygulamanın bayt kodunu cihazın özel donanımı için optimize edilmiş bir formata dönüştürdüğü yerdir. Süreç, Android'in geçmişi boyunca önemli ölçüde gelişti:
Dalvik Dönemi (Android 4.4 ve öncesi)
Orijinal Dalvik sanal makinesi Tam Zamanında (JIT) derlemesini kullanıyordu. Kurulum sırasında classes.dex dosyası, doğrulanmış ve optimize edilmiş bayt kodunu içeren bir ODEX dosyasına optimize edildi. Bu nispeten hızlıydı ancak çoğu kod hâlâ yorumlandığı için uygulamanın çalışma zamanında daha yavaş çalıştığı anlamına geliyordu.
AOT ile ART (Android 5.0 - 6.0)
Android Runtime (ART), Dalvik'in yerini aldı ve Zamanın Ötesinde (AOT) derlemesini tanıttı. Kurulum sırasında DEX bayt kodunun tamamı yerel makine koduna derlendi. Bu, uygulamaların daha hızlı çalışmasını sağladı ancak kurulum süresini ve depolama kullanımını önemli ölçüde artırdı. Bazı uygulamaların yüklenmesi birkaç dakika sürdü.
Profil Kılavuzlu Derleme (Android 7.0+)
Modern Android hibrit bir yaklaşım kullanıyor. Kurulum sırasında yalnızca kritik başlangıç yolları derlenir. Kullanıcı uygulamayı çalıştırdıkça sistem, sık kullanılan kod yollarını tanımlayan yürütme profillerini toplar. Boşta bakım sırasında (genellikle gece boyunca şarj olurken), sistem bu etkin yolları yerel koda derler. Bu, kurulum hızını, depolama kullanımını ve çalışma zamanı performansını dengeler.
Derlenen kod /data/dalvik-cache/'de veya APK'nın yanında .odex, .vdex ve .art dosyaları olarak saklanır. .vdex dosyası doğrulanmış DEX kodunu içerir, .odex dosyası derlenmiş yerel kodu içerir ve .art dosyası daha hızlı başlatma için önceden başlatılmış yığın görüntülerini içerir.
Adım 8: İzin Kaydı
PackageManagerService, uygulamanın belirtilen izinlerini ve bileşenlerini sisteme kaydeder:
- Yükleme zamanı izinleri (INTERNET veya VIBRATE gibi) kullanıcı etkileşimi olmadan otomatik olarak verilir.
- Çalışma zamanı izinleri (CAMERA veya LOCATION gibi) kayıtlıdır ancak verilmemiştir. Uygulamanın bunları çalışma zamanında istemesi gerekir.
- Niyet filtreleri, sistemin hangi uygulamaların hangi eylemleri (URL açma veya içerik paylaşma gibi) gerçekleştirebileceğini bilmesi için kayıtlıdır.
- İçerik sağlayıcılar, diğer uygulamaların bunları sorgulayabilmesi için yetkililerine kayıtlıdır.
Adım 9: Sistem Entegrasyonu
Son adımlar uygulamayı Android sistemine entegre eder:
- Paket veritabanı güncellemesi: Sistemin paket veritabanı (/data/system/packages.xml), atanmış UID, izinler ve bileşen bildirimleri de dahil olmak üzere yeni uygulamanın bilgileriyle güncellenir.
- Başlatıcı bildirimi: Ana ekran başlatıcısı, uygulama simgesini görüntüleyebilmesi için yeni uygulama konusunda bilgilendirilir.
- Yayın: Sistem bir PACKAGE_ADDED yayını göndererek diğer uygulamaların yeni kuruluma tepki vermesini sağlar (örneğin, yedekleme uygulamaları bir yedekleme planlayabilir).
- SELinux bağlamı: Uygulamanın dosyaları, hedef SDK sürümüne ve bildirilen izinlere göre uygun SELinux güvenlik bağlamıyla etiketlenir.
Kurulumlar Neden Başarısız?
Kurulum hattını anlamak, yaygın arızaların teşhis edilmesine yardımcı olur:
- "Ayrıştırma hatası": APK bozuk, eksik veya hatalı biçimlendirilmiş bir bildirime sahip. Bu genellikle eksik indirmelerde veya hatalı şekilde dönüştürülmüş dosyalarda meydana gelir.
- "Uygulama yüklenmedi" (imza uyuşmazlığı): Bir uygulamayı farklı bir anahtar tarafından imzalanmış bir APK ile güncellemeye çalışıyorsunuz. Önce mevcut sürümü kaldırmalısınız.
- "Yetersiz depolama": APK, çıkarılan kitaplıklar ve DEX optimizasyon çıktısı için yeterli alan yok. İhtiyaç duyulan gerçek alan genellikle APK boyutunun 2-3 katı kadardır.
- "Paket mevcut paketle çakışıyor": Aynı paket adı ancak farklı imza. Play Store ve yandan yüklenen sürümler arasında geçiş yaparken yaygındır.
- Sürüm düşürme engellendi: Varsayılan olarak Android, eski bir sürümün yenisinin üzerine yüklenmesini engeller. ADB bunu adb install -d ile geçersiz kılabilir.
Bölünmüş APK Kurulumu
Bölünmüş APK'ları (Uygulama Paketlerinden) yüklerken süreç biraz farklıdır. Sistem bir oturum tabanlı kurulum API kullanır:
- Yeni bir kurulum oturumu oluşturuldu
- Her bölünmüş APK oturuma yazılır
- Oturum tamamlandı ve tam doğrulama hattı tetiklendi
- Tüm bölmelerin eşleşen paket adlarına, sürüm kodlarına ve imzalama sertifikalarına sahip olması gerekir
Bu, XAPK yükleyicileri ve APKS'den APK'ya birleşme gibi araçlarımız tarafından çoklu dosya kurulumlarını gerçekleştirmek için kullanılan mekanizmadır.
ADB aracılığıyla kurulum
adb install kullandığınızda işlem grafik yükleyiciyi atlar ancak aynı dahili hattı takip eder. ADB, paket yöneticisi hizmetiyle bir soket bağlantısı aracılığıyla iletişim kurar. GUI aracılığıyla kullanılamayan ek bayrakları destekler:
- -r: Mevcut uygulamayı değiştirin (yeniden yüklemeye izin verin)
- -d: Sürüm düşürmeye izin ver
- -g: Tüm çalışma zamanı izinlerini hemen verin
- -t: Yalnızca test amaçlı APK'ların yüklenmesine izin ver
- --install-multiple: Bölünmüş APK'ları tek bir oturumda yükleyin
Kaldırma Sırasında Ne Olur?
Eksiksiz olması açısından, bir uygulama kaldırıldığında şunlar olur:
- Uygulamanın süreçleri sonlandırıldı
- APK ve çıkarılan kitaplıklar /data/app/'den silinir
- Uygulamanın özel veri dizini kaldırılır (kullanıcı verileri saklamayı seçmediği sürece)
- Derlenmiş DEX önbellek dosyaları silinir
- Paket veritabanı güncellendi
- Bir PACKAGE_REMOVED yayını gönderilir
- Başlatıcı uygulama simgesini kaldırır
Kapsamlı depolama uygulaması sayesinde harici depolamadaki uygulamaya özel dosyaların (/Android/data/[package]/ ve /Android/obb/[package]/ Android 10 ve sonraki sürümlerde de silindiğini unutmayın).
PackageManager'ı Anlamak Neden Hata Ayıklama Zamanından Tasarruf Sağlar?
Android kurulum süreci, dikkatlice düzenlenmiş bir güvenlik kontrolleri, dosya işlemleri ve sistem entegrasyonları dizisidir. Her adım, kullanıcıları kurcalanmış uygulamalara karşı korumaktan belirli donanım için performansı optimize etmeye kadar bir amaca hizmet eder. Kurulumlar başarısız olduğunda hata genellikle bu işlem hattındaki belirli bir adıma işaret eder ve süreci anlamak, sorunları hızlı bir şekilde tanılamanıza ve çözmenize yardımcı olur.
Play Store'dan yüklemek, bir APK'yı elle yüklemek ve ADB ile bir derlemeyi aynı temel boru hattı üzerinden itmek, cihazınızdaki her uygulamanın doğrulandığından, doğru şekilde yerleştirildiğinden ve donanımınız için optimize edildiğinden emin olmanızı sağlar.