APK Nedir? İçinde Ne Var?
Telefonunuza Yüklediğiniz Şeyin Gerçek Yüzü
Bir Android uygulaması indirdiğinizde aslında tek bir dosya indiriyorsunuz: APK. Android Package Kit'in kısaltması olan bu dosya, uygulamanın çalışması için gereken her şeyi içinde barındırır. Ama "her şey" derken tam olarak ne kastediyoruz?
APK dosyasını bir zarfa benzetebilirsiniz. Dışarıdan sıradan bir dosya gibi görünür, ama içi son derece düzenli ve katmanlı bir yapıya sahiptir.
APK Aslında Bir ZIP Dosyasıdır
APK'nın en temel gerçeği şudur: Sıradan bir ZIP arşividir. Uzantısını .zip olarak değiştirip açmayı denerseniz, içindeki tüm dosyaları görebilirsiniz. Bu yapı hem dağıtımı kolaylaştırır hem de içeriğin doğrulanmasına imkân tanır.
İçine girdiğinizde karşınıza birkaç temel bileşen çıkar.
classes.dex: Uygulamanın Beyni
APK'nın en kritik bileşeni classes.dex dosyasıdır. Yazdığınız tüm Kotlin ve Java kodunun derlenmiş hali burada yaşar. DEX, Dalvik Executable formatının kısaltmasıdır ve Android Runtime'ın (ART) anlayıp çalıştırabileceği bytecode formatıdır.
Büyük uygulamalarda tek bir DEX dosyası yetmez. Android'in eski sürümlerinde bir DEX dosyası en fazla 65.536 metot referansı tutabiliyordu. Bu sınırı aşan uygulamalar için classes2.dex, classes3.dex gibi ek dosyalar oluşturulur. Bu sorunu çözmek için geliştirilen mekanizmaya MultiDex denir ve özellikle büyük kurumsal uygulamalarda sıkça karşılaşılan bir gerçekliktir.
res Klasörü: Görseller, Layout'lar, Değerler
res klasörü uygulamanın tüm kaynak dosyalarını barındırır. Layout XML dosyaları, görseller, renkler, string değerleri, animasyonlar — bunların tamamı bu klasörün altında organize edilmiş halde durur.
Buradaki dosyalar derleme sırasında işlenmez, olduğu gibi paketlenir. Ancak derleme sürecinde bir R.java dosyası üretilir ve her kaynağa benzersiz bir tamsayı ID atanır. Kodunuzda R.layout.activity_main ya da R.string.app_name yazdığınızda aslında bu ID'leri kullanıyorsunuzdur.
AndroidManifest.xml: Uygulamanın Kimlik Kartı
Her APK'nın içinde bir AndroidManifest.xml dosyası bulunur. Bu dosya uygulamanın kimlik kartıdır. Uygulama adı, paket adı, minimum desteklenen Android sürümü, gerekli izinler, tanımlı Activity'ler, Service'ler ve BroadcastReceiver'lar burada bildirilir.
Android sistemi bir uygulamayı yüklemeden önce bu dosyayı okur. Manifest'te bildirilmemiş bir Activity'yi başlatmaya çalışırsanız sistem sert bir hatayla sizi geri çevirir. Manifest, Android ile uygulamanız arasındaki resmi sözleşmedir.
lib Klasörü: Native Kodlar
Uygulamanız NDK kullanıyorsa, yani C ya da C++ ile yazılmış native kodlar içeriyorsa, bunların derlenmiş halleri lib klasöründe işlemci mimarisine göre ayrılmış alt klasörlerde durur. arm64-v8a, armeabi-v7a, x86 gibi klasör isimleri her birinin farklı bir işlemci mimarisini hedeflediğini gösterir.
assets Klasörü: Ham Dosyalar
res klasöründen farklı olarak assets klasörü derleme sürecinde hiç işlenmez, ID atanmaz. Oyun motorları için asset dosyaları, özel font dosyaları, yapılandırma dosyaları ya da uygulama içi veritabanları burada tutulur. Bu dosyalara kod tarafından AssetManager aracılığıyla erişilir.
META-INF: İmza ve Güven
META-INF klasörü uygulamanın dijital imzasını barındırır. Her APK yayınlanmadan önce bir anahtar çiftiyle imzalanmak zorundadır. Bu imza üç kritik işlevi yerine getirir: dosyanın bütünlüğünü doğrular, yayıncının kimliğini kanıtlar ve güncellemelerin aynı geliştirici tarafından geldiğini garanti eder.
İmzasız ya da geçersiz imzalı bir APK sisteme yüklenemez. Bu güvenlik mekanizması, sahte uygulama güncellemelerinin önündeki en temel engeldir.
Geliştirici Perspektifinden Bakış
APK yapısını anlamak günlük geliştirme pratiğinde pek çok şeyi netleştirir.
Derleme sürenizin neden uzadığını araştırırken hangi bileşenin zaman aldığını anlamak için bu yapıyı bilmeniz gerekir. Uygulama boyutunu küçültmek istediğinizde hangi klasörde ne bulunduğunu bilmek doğru araçları kullanmanızı sağlar. Ve Play Store'da android:extractNativeLibs gibi manifest ayarlarını değiştirirken ne yaptığınızı kavramak için bu yapıya hakim olmanız gerekir.