Bloga geri dön
Aşağıdaki görsel bir Android uygulamasının derleme sürecini gösteren bir akış şemasıdır. Bir uygulamanın derlenme süreçleri şu şekildedir:
Android uygulamalarının temel yapı taşlarından biri kaynak dosyalarıdır. Bu dosyalar, uygulamanın tasarımını, görüntülerini, XML dosyalarını ve diğer statik içeriklerini içerir. Bu süreçte:
Uygulama kaynak kodlarının derlenmesiyle birlikte çalıştırılabilir hale gelir. Bu aşamada, Java kaynak kodları, otomatik olarak oluşturulan R.java dosyası ve varsa AIDL (Android Interface Definition Language) dosyaları işlenerek uygulamanın temel bileşenleri hazırlanır.
AIDL (Android Interface Definition Language), Android'de farklı süreçler (IPC - Interprocess Communication) arasında veri paylaşımını sağlamak için kullanılan bir araçtır. Özellikle farklı süreçlerde çalışan servislerle etkileşim kurmak için kullanılır.
Örneğin:
Normalde, process’ler arası doğrudan iletişim mümkün değildir, çünkü Android'de her process, kendi bellek alanına sahiptir. İşte bu noktada AIDL devreye girer ve farklı process’ler arasında veri paylaşımını mümkün kılar.
Android uygulamalarını derlemek için birden fazla yöntem ve araç kullanılabilir. Güncel olarak android projelerinde genellikle Gradle tercih edilir, ancak alternatif araçlar ve yöntemler de mevcuttur.
Android uygulamalarında, Java kaynak kodları doğrudan çalıştırılamaz. Bunun yerine, Android cihazlarının çalışma ortamına uygun hale getirilmesi için Dalvik Executable (DEX) dönüşümü yapılır.
Bu dönüşüm, Android cihazlarının Dalvik Sanal Makinesi (DVM) veya Android Runtime (ART) üzerinde uygulamaları verimli bir şekilde çalıştırmasını sağlar.
Dalvik Executable (DEX) Dosya Formatı
Android uygulamaları, normal Java uygulamalarından farklı olarak Dalvik Executable (DEX) formatında derlenir. Bu format, Java bytecode’unun Android cihazlarında daha verimli çalışması için özel olarak tasarlanmıştır. Bellek kullanımını optimize eder ve enerji tüketimini azaltarak mobil cihazların batarya ömrünü uzatır.
DEX dosyalarının en büyük avantajı, Android cihazlarındaki ARM mimarisi için optimize edilmiş olmasıdır. ARM, düşük enerji tüketimi sağlamak için tasarlanmış bir işlemci mimarisidir. Bu sayede Android cihazlar, daha az güç harcayarak daha verimli çalışır. Dalvik bytecode, bu mimariye uygun şekilde derlenir ve cihazların enerji tasarrufu yapmasını destekler.
Bir classes.dex dosyasında en fazla 65.536 metot referansı olabilir. Bu sınır, Dalvik formatındaki method ID alanının 16-bit olması nedeniyle oluşur. Android uygulamalarında çok sayıda metot kullanılması durumunda, uygulamanın birden fazla classes.dex dosyasına bölünmesi gerekir. Bu özellikle büyük uygulamalarda veya çok sayıda harici kütüphane içeren projelerde sıkça karşılaşılan bir durumdur.
Android 5.0 (Lollipop) ve üzeri sürümlerde ART (Android Runtime) sayesinde Multidex desteği varsayılan olarak sunulmaktadır. Daha eski sürümlerde ise Multidex desteği manuel olarak yapılandırılmalıdır.
Birden fazla DEX dosyasının kullanılması, tersine mühendislik süreçlerinde de önemli bir faktördür. Uygulama içindeki tüm DEX dosyalarının analiz edilmesi gerekebilir.
Derleme sürecinde kodun optimize edilmesi ve gereksiz bölümlerin temizlenmesi, uygulamanın performansını ve boyutunu doğrudan etkileyen önemli bir adımdır. Bu süreçte ProGuard veya R8 gibi araçlar kullanılarak kod küçültme (shrinking) ve optimizasyon işlemleri gerçekleştirilir.
Kod optimizasyonu sürecinde:
Uygulamanın çalıştırılabilir bir dosyaya dönüştürülmesi için kaynak kodları, kaynak dosyaları ve 3rd party kütüphaneler tek bir dosyada birleştirilir.
APK Dosyasının Oluşturulması:
Android uygulamaları, geleneksel Java uygulamalarından farklı bir derleme süreci ve çalışma ortamına sahiptir. Bunun temel nedeni, Android cihazlarının taşınabilir, sınırlı kaynaklara sahip birer donanım olmasıdır. Bu cihazlarda enerji verimliliği ve performans öncelikli olduğundan, Android uygulamaları daha optimize bir şekilde çalışacak şekilde tasarlanmıştır.
Java uygulamaları, kaynak kodlarının .class dosyalarına derlenmesiyle Java bytecode oluşturur. Bu bytecode, Java Virtual Machine (JVM) üzerinde çalıştırılır. JVM, platform bağımsızlığı sağlayarak uygulamaların farklı işletim sistemlerinde sorunsuz çalışmasını mümkün kılar.
Android ise Java bytecode yerine, Dalvik Executable (DEX) formatında bir bytecode kullanır. Android uygulamaları, DEX dosyalarıyla birlikte paketlenir ve .apk formatında dağıtılır.
Dalvik Virtual Machine (DVM), Java sınıf dosyalarını doğrudan çalıştırmaz. Bunun yerine, Java bytecode önce DEX (Dalvik Executable) formatına dönüştürülür ve ardından Dalvik VM üzerinde çalıştırılır. Dalvik, sınırlı donanım kaynaklarına sahip Android cihazlar için optimize edilmiş birer sanal makinedir.
Android 5.0 (Lollipop) sürümüyle birlikte Dalvik, yerini Android Runtime (ART) sistemine bıraktı. ART, Dalvik’ten farklı olarak iki önemli teknoloji kullanır:
ART (Android Runtime) sayesinde Android uygulamaları, hem daha yüksek performans sunar hem de batarya tüketimi açısından daha verimli hale gelir.
APK (Android Application Package) dosyaları, Android uygulamalarının dağıtım formatıdır. Aslında, bir tür sıkıştırılmış dosya yapısına sahiptirler ve içlerinde uygulamanın tüm bileşenlerini barındırırlar.
APK dosyasını incelemek için, uzantısını “.apk” yerine “.zip” olarak değiştirebilirsiniz. Ardından, WinRAR, 7-Zip veya macOS Finder gibi araçları kullanarak bu sıkıştırılmış dosyayı açabilir ve içerdiği dosya yapısını detaylı bir şekilde inceleyebilirsiniz.
Genellikle apk paketlerinde aşağıdaki dosya ve klasörlere rastlanır:
!! Özellikle lib ve classes.dex dosyaları uygulamanın davranışlarını anlamada oldukça önemli bir rol oynar. Bu dosyalar ile apk içeriklerini daha iyi anlayabilir ve kolaylıkla uygulamaları analiz edebilirsiniz.
Android Manifest dosyası, bir Android uygulamasının temel yapı taşlarını içerir. Uygulamanın hangi izinlere sahip olduğu, hangi bileşenleri içerdiği (activity, service, broadcast receiver) ve güvenlik yapılandırmalarını belirten bu dosya, bir uygulamanın ne yapabileceği hakkında önemli bilgiler sunar. Bu dosya olmadan bir Android uygulaması çalışamaz.
Manifest dosyasının başında, uygulamanın hedeflediği Android sürümü ve API versiyonunu gösteren bilgiler yer alır. Örneğin:
Bu, uygulamanın Android 11 (API seviyesi 30) ile uyumlu olduğunu gösterir. Ayrıca, uygulamanın daha eski sürümlerde çalışabilmesi için gerekli olan minimum SDK seviyesinin 16 olduğunu belirtir. Bu, uygulamanın güvenlik özelliklerinin hangi Android sürümleriyle uyumlu olduğunu belirlememize yardımcı olur.
İzinler, uygulamanın cihazda hangi kaynaklara erişebileceğini belirtir. Örneğin, external storage reading izni şu şekilde tanımlanır:
Bu izin, uygulamanın harici depolamaya (örneğin, fotoğraflar veya belgeler gibi dosyalara) erişmesini sağlar. Güvenlik açısından kritik bir öneme sahiptir, çünkü zararlı bir uygulama bu izin sayesinde kullanıcı verilerine veya hassas bilgilere erişebilir.
SMS gönderme, kamera erişimi, internet erişimi:
Paket adı, uygulamanın benzersiz bir tanımlayıcısıdır. Bu, cihazda yalnızca bir kez kullanılabilen bir isimdir ve Android cihazdaki her uygulama, benzersiz bir paket adına sahiptir. Örneğin:
Manifest dosyası, uygulamanın içerdiği bileşenleri tanımlar. Bu bileşenler, uygulamanın farklı işlevlerini temsil eder:
Bu bileşenlerin her biri, uygulamanın ne tür işlemler gerçekleştirebileceğini ve hangi verilerle etkileşime girebileceğini anlamamıza yardımcı olur.
Android, uygulamaların özel izinler tanımlamasına da izin verir. Bu izinler, uygulamanın belirli işlevleri paylaşmasına olanak tanır. Örneğin:
Bu, diğer uygulamalara belirli verilere erişim izni verir, ancak bu izin sadece kullanıcı tarafından onaylanırsa geçerlidir.
Özel izinler, özellikle zararlı yazılımlar tarafından kötüye kullanılabilir, bu yüzden bunları analiz etmek çok önemlidir.
Uygulamanın ağ güvenliği yapılandırmaları, genellikle SSL Pinning gibi güvenlik önlemleriyle sağlanır. SSL Pinning, kötü niyetli bir saldırganın, sahte bir sertifika kullanarak uygulamanın ağ trafiğine müdahale etmesini engellemeye yardımcı olur.
Örneğin, network_security_config XML dosyası, ağ üzerinden yapılan güvenli iletişimi sağlamak için kullanılabilir:
Android Manifest dosyası, bir Android uygulamasının güvenliğini anlamada önemli bir kaynaktır. Bu dosya, uygulamanın hangi izinleri istediğini, hangi bileşenlere sahip olduğunu, hangi güvenlik özelliklerini kullandığını ve hangi verilerle etkileşime girebileceğini gösterir. Bu yüzden bir uygulama üzerinde güvenlik analizi yaparken, ilk bakılması gereken dosya Android Manifest dosyasıdır.
Teorik olarak, assets klasörüne neredeyse her türlü dosya depolanabilir. Genellikle bu klasörde HTML belgeleri, fontlar, MP3 ses dosyaları, metin dosyaları ve görseller gibi dosyalar yer alır. Bu klasörün önemi, içerdiği dosyaların amacına ve nasıl kullanıldığına bağlıdır.
Assets klasörü, geliştiricilere, uygulamalarına kod dışında kaynaklar ekleme esnekliği sunarak, uygulamanın işlevselliğini ve kullanıcı deneyimini özelleştirmede önemli bir bileşen haline gelir. Bu esneklik, kaynakların düzenli bir şekilde yönetilmesini sağlarken, aynı zamanda uygulamanın davranışını özelleştirmeye olanak tanır.
/res dizini, bir uygulamanın dosya yapısının önemli bir parçasıdır ve resimler, düzenler (layouts) ve diğer görsel öğeler gibi tüm kaynakları içerir. Bu kaynaklar, resources.arsc dosyasının dışında tutulur ve doğrudan bu dizinde saklanır. Genellikle uygulamanın görünümünü ve tasarımını belirlemek için kullanılırlar.
Güvenlik açısından, /res klasöründeki kaynaklar genellikle düşük risk taşır çünkü çalıştırılabilir kod veya hassas veriler içermez. Bu nedenle, bu dosyaların güvenlik üzerindeki etkisi sınırlıdır ve uygulamanın diğer kritik dosyalarına kıyasla daha az ayrıntılı incelemeye ihtiyaç duyar.
Android uygulamalarının derleme sürecinin ardından, .apk dosyalarının mutlaka imzalanması gerekir. Android cihazları, normal şartlarda imzalanmamış (unsigned) APK dosyalarını çalıştırmaz. Ancak geliştirme aşamasında veya belirli özel durumlarda imzalanmamış APK'ların yüklenmesi mümkün olabilir.
Android 7.0 (Nougat) ve sonraki sürümlerde, sistem imzalanmamış APK'ların yüklenmesini daha da kısıtlamıştır. Bu nedenle, ister test ister dağıtım amacıyla kullanılıyor olsun, APK dosyasının imzalama süreci tamamlanmalıdır. Bu işlem, APK’nin imzalandığından bu yana değiştirilmediğini veya bozulmadığını garanti eder.
Android uygulama imzalama işlemi, Android Studio tarafından otomatik olarak yapılabilir. Ancak manuel olarak işlem yapmak için aşağıdaki adımlar izlenebilir:
1. Keystore Oluşturma
Java'nın keytool aracı, güvenli bir şekilde anahtar çifti oluşturmak ve yönetmek için kullanılır. Aşağıdaki komut, bir RSA anahtar çifti oluşturur ve bunu belirli parametrelerle bir keystore dosyasına kaydeder:
keytool -genkeypair -alias myaliastcb -keyalg RSA -keysize 2048 -validity 10000 -keystore keystore.jks
Parametreler:
Komutu Çalıştırdığınızda Girmeniz Gereken Bilgiler:
2. Jarsigner ile APK'yi İmzalama
APK dosyasını imzalamak için jarsigner aracını kullanabilirsiniz. Aşağıdaki komutu çalıştırarak APK dosyanızı imzalayabilirsiniz:
jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore foo.keystore test.apk myalias
Parametreler:
Örnek Kullanım:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.jks example.apk myaliastcb
Bu komut, keystore.jks içinde saklanan myaliastcb aliasını kullanarak example.apk dosyasını imzalar.
3. APK İmzasını Doğrulama
APK dosyasının doğru şekilde imzalandığından emin olmak için yine jarsigner aracını kullanabilirsiniz. Aşağıdaki komutu çalıştırın:
jarsigner -verify -verbose -certs example.apk
Bu komut, APK dosyasındaki imzayı doğrular ve sertifikalar hakkında bilgi verir.
Kaynakça: https://www.inovex.de/de/blog/concurrent-kotlin-apis-in-android-services/