APK (Android Package Kit), Android işletim sistemi için uygulamaların dağıtımı ve kurulumu amacıyla kullanılan paket formatıdır. Bir APK, uygulamanın çalışması için gerekli olan tüm dosyaları (derlenmiş kod, kaynaklar, manifest dosyası, varlıklar, imzalama bilgileri vb.) tek bir arşiv halinde paketler. Mobil uygulama geliştiricileri, dağıtımcılar ve ileri seviye kullanıcılar için APK, Android ekosisteminin temel taşlarından biridir. Bu makalede APK’nin yapısı, nasıl oluşturulduğu, imzalama, güvenlik riskleri, analiz yöntemleri, yükleme yöntemleri, sık karşılaşılan sorunlar ve APK ile ilgili tarihsel gelişim adımları detaylandırılacaktır.
Ana Dosya ve Klasörler
- AndroidManifest.xml: Uygulamanın adı, paket adı, izinler (permissions), aktiviteler, servisler, receiverlar ve uygulamanın gerektirdiği minimum SDK bilgileri gibi kritik meta veriyi içerir.
- classes.dex: Java/Kotlin kodunun Dalvik/ART için derlenmiş hali (DEX formatı). Birden fazla DEX dosyası (classes2.dex vb.) olabilir (multidex durumunda).
- resources.arsc: Derlenmiş kaynak tablosu; uygulamanın string, layout referansları ve diğer kaynak indeksleri burada tutulur.
- res/: Derlenmiş olmayan kaynak dosyaları (genellikle derlenmiş biçimde, layout, drawable vb. halinde yer alır).
- lib/: Native (C/C++) kodlarının platforma özel paylaşımlı kütüphaneleri (.so dosyaları). ARM, ARM64, x86 gibi ABI dizinleri altında bulunur.
- assets/: Uygulamanın çalışma zamanında kullanacağı ham varlık dosyaları (medya, veritabanı örnekleri vb.).
- META-INF/: İmzalama ve imza sertifika bilgileri (MANIFEST.MF, CERT.SF, CERT.RSA veya CERT.DSA) burada saklanır.
- Derleme (Compile): Java/Kotlin kaynakları .class dosyalarına derlenir.
- DEX’e Çevirme (dexing): .class dosyaları Android Runtime’in anlayacağı .dex formatına dönüştürülür (dx veya D8/R8 araçları kullanılır).
- Kaynakların Derlenmesi: XML layoutlar, string kaynakları ve diğer kaynaklar aapt/aapt2 ile paketlenip resources.arsc oluşturulur.
- Paketleme: Tüm bileşenler belirli dizin yapısında ZIP (APK) içine konur.
- Optimizasyon ve Küçültme: R8/ProGuard ile kod küçültme, dead code elimination, minification yapılabilir; ayrıca kaynak sıkıştırma optimizasyonları uygulanır.
- İmzalama: APK, güvenlik için geliştirici anahtarlarıyla imzalanır. Google Play artık Android App Bundle (.aab) ile dağıtıma izin verse de yüklenebilen APK’lerin imzalanmış olması zorunludur.
İmzalama Türleri ve Anahtar Yönetimi
- Keystore & Keytool: Geliştirici, keystore (anahtar deposu) oluşturur ve özel anahtarı burada tutar. keytool ile keystore oluşturulur.
- V1 (Jar Signature) ve V2/V3/V4 İmzalama: Android’in farklı versiyonlarıyla gelen imzalama şemaları (V1: JAR imzası; V2: APK Signature Scheme v2 — daha kapsamlı bütünlük koruması; v3/v4 ek özellikler). Modern uygulamalarda en az V2 imzalama önerilir.
- Google Play App Signing: Google Play’e yüklenen uygulamalarda geliştirici isteğe bağlı olarak orijinal imzalama anahtarını Google’a devredebilir; Google, dağıtımı imzalama anahtarıyla yönetir. (Not: Bu açıklama kavramsaldır; dış bağlantı eklenmedi.)
- Yetkisiz kaynaklardan indirilen APK’ler kötü amaçlı yazılım içerebilir (troyan, casus yazılım, kripto madencisi vb.).
- Kullanıcılar genellikle “bilinmeyen kaynaklar” seçeneğini açarken sosyal mühendislik saldırılarına maruz kalır.
Güvenlik Kontrolleri ve İyi Uygulamalar
- İmzayı Doğrulama: APK’nin imzası ve sertifika bilgileri kontrol edilmelidir.
- Permissions İncelemesi: Manifestte istenen izinleri dikkatle inceleyin; gereksiz geniş izinler risk işaretidir.
- Statik Analiz: Kaynağı yoksa statik analiz araçlarıyla APK içeriği incelenebilir (dosya yapısı, suspicious stringler, native kütüphaneler).
- Runtime Davranış Analizi: Sandbox veya emülatör üzerinde davranış gözlemi, ağ istekleri ve sistem çağrıları izlenebilir.
- Kaynak Doğrulama: APK’yi yalnızca güvenilir kaynaklardan indirin ve mümkünse geliştirici/mağaza imzası doğrulanmış sürümleri tercih edin.
- APK Extract / Unzip: APK, ZIP olarak açılarak içeriği incelenir.
- DEX → Java Çevirme: dex2jar, jadx gibi araçlarla DEX dosyaları Java benzeri kodlara çevrilerek okunabilir hale getirilir.
- Manifest İncelemesi: AndroidManifest.xml içindeki izinler, exported aktiviteler ve intent filtreleri kontrol edilir.
- Sertifika ve İmza Bilgileri: META-INF içindeki imza dosyaları incelenir.
Dinamik Analiz Teknikleri
- Emülatör / Sandbox: Uygulama çalıştırılarak ağ trafiği, dosya sistemi erişimleri ve API çağrıları izlenir.
- Hooking ve Instrumentation: Frida, Xposed veya benzeri araçlarla runtime davranış manipüle edilip izlenebilir.
- Ağ Trafiği İzleme: HTTPS varsa TLS/SSL yapılandırması ve sertifika pinning var mı diye kontrol edilir; proxy ile trafik gözlemlenebilir.
- Kullanıcılar, uygulamaları doğrudan geliştiriciden veya üçüncü taraf mağazalardan .apk olarak indirip kurabilir. Bu işleme sideloading denir ve cihazda “bilinmeyen kaynaklara izin” verilmesini gerektirebilir. Sideloading güvenlik riskleri taşır; dikkatli olunmalıdır.
Kurulum Hataları ve Çözümleri
- “Parsing Error” / Paket Ayrıştırma Hatası: APK bozulmuş veya imza uyumsuz olabilir; APK’nın tam indirildiğinden ve cihaz ile uyumlu olduğundan emin olun.
- “App not installed” / Kurulmadı Hatası: İmza uyuşmazlığı (aynı paket adına farklı imza), yetersiz depolama, uyumsuz ABI veya hedeflenen SDK seviyesi nedeniyle olabilir.
- Permission İzinleri Sorunları: Android’in yeni versiyonlarında runtime permission yönetimi kurulum sonrası da uygulama işlevlerini etkileyebilir.
- Multidex Problemleri: Çok büyük uygulamalarda DEX sayısı yönetimi düzgün yapılmazsa runtime çakışmalar olabilir.
- APK içinde native kütüphaneler varsa (lib/armeabi-v7a, lib/arm64-v8a, lib/x86 vb.), cihazın CPU mimarisiyle uyumlu olmalıdır. Uyumsuz ABI, uygulamanın çökmesine veya kurulmasının engellenmesine neden olur.
API Seviyesi ve minSdk/targetSdk
- Manifest’te belirtilen minSdkVersion cihazın Android sürümüyle uyumlu olmalıdır. targetSdkVersion ise uygulamanın hangi Android davranış modeline göre optimize edildiğini gösterir. Yeni Android sürümlerinde davranış değişiklikleri olduğundan targetSdk dikkatlice yönetilmelidir.
- versionCode (tam sayı) ve versionName (gösterim için metin) aracılığıyla sürüm yönetimi yapılır. Google Play veya manuel dağıtımda versionCode artışı güncelleme olarak algılanır.
Güncelleme Stratejileri
- OTA veya mağaza güncellemesi ile dağıtım yapılır. Sideloaded uygulamalar için kullanıcının yeni APK’yi manuel olarak indirmesi gerekir veya uygulama içi güncelleme mekanizmaları (self-update) kullanılabilir — ancak bu, güvenlik politikaları ve mağaza kuralları açısından tartışmalı olabilir.
- R8/ProGuard ile kod küçültme, önemsiz kod silme ve ad değişikliği (obfuscation) yapılabilir. Bu hem performans hem de tersine mühendislik zorluğu sağlar.
Bölümlendirme (App Bundle ve Split APK’ler)
- Modern dağıtımda, uygulama boyutunu azaltmak için split APK’ler veya Android App Bundle (AAB) yaklaşımı kullanılır; bu sayede her cihaza özel gerekli parça sunulur. (Not: teknik ayrıntılar AAB formatı içinde ele alınır, fakat bu makalede dış bağlantıya girilmedi.)
Native Kütüphaneler ve Boyut Yönetimi
- Gereksiz native kütüphaneleri kaldırmak, sıkıştırma stratejisi uygulamak ve çoklu ABI desteğini minimumda tutmak APK boyutunu azaltır.
- Google Play ve diğer mağazalar, uygulamaların gizlilik, izin kullanımı, kullanıcı verileri işleme vb. konularda sıkı kurallar uygular. Geliştiriciler bu politikaları ihlal etmemelidir. Ayrıca telif hakkı ve lisanslı içeriklere dikkat edilmelidir.
Kullanıcı Gizliliği ve İzin Yönetimi
- Kullanıcı verilerinin toplanması, saklanması ve dışa aktarılması konusunda şeffaf olunmalı; gereksiz geniş izinler istenmemeli ve kullanıcı aydınlatılmalıdır.
- 2008–2010: Android ilk sürümleriyle birlikte APK temelli dağıtım mekanizması kullanılmaya başlandı; APK, temel paket formatı oldu.
- 2012–2014: İmzalama ve güvenlik mekanizmaları evrildi; performans ve DEX optimizasyonları önem kazandı.
- 2016–2018: Multidex ve native kütüphane yönetimi kritik hale geldi; mağazalar ek güvenlik kontrolleri uygulamaya başladı.
- 2018–2021: APK imzalama şemalarında V2 ve sonrası ortaya çıktı; Android App Bundle fikri geliştirildi ve dağıtım değişmeye başladı.
- 2022–Günümüz: App Bundle ve split-distribution teknikleri yaygınlaştı; güvenlik, kullanıcı gizliliği ve mağaza politikaları daha katı hale geldi.
- Geliştirici dağıtımı ve Play Store optimizasyonları için App Bundle daha avantajlıdır; ancak doğrudan kurulum ve üçüncü taraf dağıtım için APK gereklidir. Hangi yöntemin uygun olduğu dağıtım kanalına ve hedef kitleye göre değişir.
Bir APK’yi nasıl güvenli şekilde doğrularım?
- İmza sertifikasını kontrol edin, manifest izinlerini inceleyin, mümkünse geliştirici imzasının geçmiş sürümlerle uyumlu olduğuna dair kontrol yapın ve bilinmeyen kaynaklardan kaçının.
APK içinden kaynaklara erişebilir miyim?
- Evet; APK bir ZIP olduğu için açılarak res, assets, lib gibi klasörlere erişilebilir. Kodun okunabilirliği için jadx gibi araçlardan yararlanılabilir, ama tersine mühendislik hukuki/etik sınırlamalara tabi olabilir.
APK, Android ekosisteminin temel dağıtım birimidir ve hem kullanıcılar hem de geliştiriciler için kritik öneme sahiptir. Doğru imzalama, uygun ABI ve API hedeflemesi, güvenlik kontrolleri ve optimizasyonlar bir APK’nin başarılı ve güvenli çalışması için gereklidir. Üretim süreçlerinde R8/ProGuard, uygun imzalama şemaları ve paketleme stratejileri kullanmak performans ve güvenlik açısından olumlu sonuç verir. Kullanıcılar açısından en önemli nokta ise yalnızca güvenilir kaynaklardan APK indirmek ve cihaz izinlerine dikkat etmektir.

