Gelecegi yazanlar logo

Bloga geri dön

Android
Android Uygulama Derleme Süreçleri
Android uygulamalarının oluşturulması iki ana temel adımdan geçer: derleme ve paketleme, ardından da imzalama. Derleme süreci, genellikle Gradle üzerinden yönetilir. Bu süreçte Android Asset Packaging Tool (aapt veya aapt2), uygulama kaynaklarını derleyerek kodun kaynaklara referans vermesini sağlayan bir R.java dosyası oluşturur. Ardından Java kaynak kodları derlenir ve .class dosyaları üretilir. Bu dosyalar, gerekli kütüphaneler ve diğer kaynaklarla birleştirilerek Android Package (.apk) dosyası oluşturulur. Son işlem olarak ise APK dosyası imzalanır. Bu imzalama işlemi, uygulamanın güvenli bir şekilde paketlenmesini ve cihazlarda çalıştırılabilir hale gelmesini sağlar. Böylece uygulama, dağıtıma hazır bir hale gelir.
Blog image

 

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:

 

1

1. Kaynak Dosyaların Derlenmesi (Application Resources)

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:

  • aapt (Android Asset Packaging Tool): Kaynak dosyalar, aapt aracı kullanılarak işlenir ve bir R.java dosyası oluşturulur. Bu dosya, kaynak dosyalara Java kodu üzerinden erişmek için bir referans işlevi görür.

2

2. Kodun Derlenmesi

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 Dosyaları ve Processler

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:

  • Bir Activity, başka bir süreç içinde çalışan bir Service ile iletişim kurmak istediğinde.
  • Uygulama, farklı uygulamalar arasında belirli bir veri paylaşımı yapmak istediğinde.

3

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.

4

Derleme Süreci ve Araç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.

  1. Gradle :
    Gradle, uygulamanın tüm kaynaklarını ve kodlarını işleyerek gerekli yapı taşlarını oluşturur. Java kaynak kodları derlenerek .class dosyaları oluşturulur. Bu dosyalar, uygulamanın temel işlevselliğini içeren küçük yapı taşlarıdır. Gradle’ın en büyük avantajı, bağımlılık yönetimi ve yapı varyasyonlarını kolayca yönetebilmesidir.

3. DEX (Dalvik Executable) Dönüşümü

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.

5

DEX Dosyaları (.dex) Nedir?

  • Java kaynak kodları derlendiğinde .class dosyaları oluşturulur.
  • Bu .class dosyaları, Android cihazlarının çalışma ortamına uygun Dalvik Executable (DEX) formatına dönüştürülür.
  • DEX dönüşümü D8 veya R8 araçları ile gerçekleştirilir.
  • Tüm kodlar, bir veya birden fazla .dex dosyasında birleştirilerek paketlenir.

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.

DEX Dosya Formatının Sınırlamaları ve Çift DEX Dosyaları

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.

6

4.Kod Optimizasyonu ve Shrinking

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:

  • Kullanılmayan kodlar ve kaynaklar kaldırılarak uygulama boyutu azaltılır.
  • Kodun anlaşılmasını zorlaştırmak için kod karmaşıklığı (obfuscation) uygulanır.

5. Paketleme ve APK Oluşturma

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ı:

  • Derlenen .dex dosyaları,
  • Uygulamanın tüm kaynak dosyaları (resimler, XML vb.),
  • 3rd party kütüphaneler ve bağımlılıklar bir araya getirilerek Android Package (.apk) dosyası oluşturulur.

Dalvik ve Java’nın Farkları

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.

Modern Android’de ART Kullanımı

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:


7

  1. Ahead-of-Time (AOT):
    Uygulama yüklenirken, bytecode doğrudan makine koduna çevrilir. Bu sayede uygulama çalışırken ek bir dönüştürme işlemine gerek kalmaz ve daha hızlı çalışır.
  2. Just-in-Time (JIT):
    Uygulama çalışırken performansı optimize eder. Sık kullanılan kod parçalarını dinamik olarak optimize ederek uygulamanın daha hızlı ve verimli çalışmasını sağlar.

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 Dosyasının İçeriği

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:


8

9

!! Ö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.

AndroidManifest.xml Dosyası 

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.

1. Min SDK ve API Versiyon Bilgisi

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:

10

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.

2. İzinler (Permissions)

İzinler, uygulamanın cihazda hangi kaynaklara erişebileceğini belirtir. Örneğin, external storage reading izni şu şekilde tanımlanır:

11

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:
12

3. Paket Adı (Package Name)

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:

13

4. Uygulama Bileşenleri: Activity, Service ve Broadcast Receiver

Manifest dosyası, uygulamanın içerdiği bileşenleri tanımlar. Bu bileşenler, uygulamanın farklı işlevlerini temsil eder:

  • Activity: Uygulamanın ekranlarını temsil eder. Örneğin, bir giriş ekranı veya profil sayfası.
  • Service: Uygulamanın arka planda çalışan görevlerini temsil eder. Uzun süren işlemler burada yapılır.
  • Broadcast Receiver: Uygulama, sistem veya diğer uygulamalardan gelen mesajları dinler. Örneğin, yeni bir SMS alındığında bir bildirim gösteren broadcast receiver.
  • Content Provider: Uygulama, verileri başkalarına sunar veya başkalarından alır. Genellikle veritabanlarıyla etkileşime girer.

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.

5. Özel İzinler (Custom Permissions)

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:

14

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.

6. Güvenlik Yapılandırmaları (Network Security Config)

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:

15

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.

Assets Klasö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.


16

/res Dizini

/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.


17

APK’nın İmzalanması

18

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 İmzalama Yöntemleri

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) Android Studio ile Otomatik İmzalama

  • Android Studio, debug ve release yapılandırmaları için uygulamaları otomatik olarak imzalayabilir.
  • Debug imzası, geliştiricilerin uygulamayı cihazlarına hızlıca yüklemelerine yardımcı olur.
  • Release imzası ise uygulamanın Play Store gibi platformlarda yayınlanması için gereklidir.

2) Manuel Olarak APK İmzalama

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:

  • -genkeypair: Yeni bir anahtar çifti oluşturulmasını sağlar.
  • -alias myaliastcb: Anahtar çifti için tanımlanan takma ad (alias). Birden fazla anahtar tutmak için kullanabilirsiniz.
  • -keyalg RSA: Anahtarın oluşturulacağı algoritmayı belirtir. 
  • -keysize 2048: Anahtar uzunluğu 2048 bit olarak belirlenmiştir. 
  • -validity 10000: Anahtarın geçerli olacağı süreyi gün cinsinden belirtir. 
  • -keystore keystore.jks: Anahtar çiftinin saklanacağı keystore dosyasıdır. Bu dosya içinde farklı aliaslarla birden fazla anahtar saklayabilirsiniz.

Komutu Çalıştırdığınızda Girmeniz Gereken Bilgiler:

  1. Şifre: Keystore dosyasını koruyacak bir şifre belirlemeniz istenir.
  2.  CN - Common Name: Örneğin, "Bugra".
  3. OU - Organizational Unit: Örneğin, "Geliştirme Ekibi".
  4. O - Organization: Örneğin, "Şirket İsmi".
  5. L - Locality: Örneğin, "İstanbul".
  6. ST - State: Örneğin, "Marmara".
  7. C - Country: İki harfli ülke kodu (TR, US, GB, vb.).

19

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:

  • jarsigner: Java'nın sunduğu, dosyaları dijital olarak imzalamak için kullanılan bir araçtır.
  • -sigalg SHA1withRSA: İmza algoritmasını belirtir.
  • -digestalg SHA1: Hash algoritmasını belirtir.
  • -keystore foo.keystore: Keystore dosyasının adı ve yolunu belirtir.
  • test.apk: İmzalanacak APK dosyasının adı.
  • myalias: İmza için kullanılan alias.

Ö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/


Ahmet Buğra Demirel

|

15 Nisan 2025