AOSP Deep Dive - AOSP System Architecture

Kerim Fırat
4 min readJun 28, 2021

AOSP kaynak kodlarını derin inceleme maksatlı çeşitli seviyelerde makale ve video paylaşacağım.
Serinin ilk makalesine buradan ulaşabilirsiniz.

AOSP üzerinde çalışmak isteyenlerin OS mimarisini çok iyi bilmeleri gerekmektedir. Kaynak kodlar üzerinde geliştirme yaparken,sistemin hangi parçasının nerelerle ilişkili çalıştığını ve neyi nerede bulabileceğimizi bilmemiz zaman yönetimi bakımından çok faydalıdır.

Android OS sistem mimarisi dört ana katmana ayrılmış haldedir. Aşağıdaki görselde sistem mimarisi görülmektedir.

https://source.android.com/

Görseli yukarıdan aşağıya doğru inceleyelim.

System Apps

Application(Uygulama) katmanı ilk sırada yer almaktadır. Bu katmanda hem sistem(system/internal application) hem de harici/sonradan(external application) kullanıcı tarafından yüklenen uygulamalar yer alır. Geliştiriciler tarafından geliştirilen,google uygulama marketi veya adb ile yüklenen uygulamalar harici(external) uygulamalardır. Sistem(system/internal application) uygulamaları ise,sistemin derleme aşamasında sisteme dahil edilen ve “system application” olarak etiketlenen uygulamalardır. External uygulamalar kullanıcılar tarafından sistemden kaldırılabilir-silinebilir. Ancak internal uygulamalar kullanıcılar tarafından sistemden kaldırılamaz-silinemez. Dolayısıyla kullanıcı ile etkileşimde olan uygulamalar bu katmanda yer alır. Bu katmanda yer alan uygulamalar AOSP kaynak kod “alps/packages/apps” dizin yolunda yer almaktadır.

Java API Framework

Bu katmanda uygulama geliştirme framework’u yer alır.Bu katman uygulama geliştiricilerine temel işlevlere erişmek için bir API ortamı sağlamaktadır. Dolayısıyla GUI yönetimi,data erişimi,uygulama paket yönetimi,telefon yönetimi,konum,batarya,wifi vb. gibi hizmetlere erişmek ve kullanıcıya sunmak için çeşitli servisler ve yönetim araçları bu katmanda yer almaktadır.
Bu katmanda esasen bulabileceğimiz modüller,parçalar aşağıda detaylandırılıyor.

Uygulama geliştirirken veya OS üzerinde çalışırken GUI tarafında kullanmamız gereken Lists,Grids,Text boxes,Buttons ve bunlarla ilişkili diğer tüm Views’lar bu katman tarafından sağlanır.
Bunları AOSP kaynak kod içinde “alps/frameworks/base/core/java/android/view/” yolunda inceleyebilirsiniz.

Uygulamaların başka bir uygulamadan veri alış verişi,veritabanı erişimleri ve yönetimi vb. gibi işlemleri Content Providers(içerik sağlayıcılar) aracılığıyla gerçekleştiririz. Content provider aynı şekilde bu katmanda yer almaktadır. Bunları “alps/packages/providers” yolunda,ve framework tarafından sağlanan apileri ise “alps/frameworks/base/core/java/android/provider/” yolunda inceleyebilirsiniz.

NOT: Java api framework katmanı tarafından sağlanan tüm apiler “alps/frameworks/base/api/current.txt” dosyasında yer almaktadır.

Kod dışı kaynaklara(Resource) erişim yine bu katman tarafından sağlanmaktadır. Ayrıca OS üzerinde çalışırken,Resource(R) tarafında geliştirme yapmak için “alps/frameworks/base/core/res/res” yolunda bulunan dosyaları inceleyebilirsiniz. Dolayısıyla sistem renkleri,animasyonlar,layoutlar,resimler vb. tüm kaynaklar bu yolda yer almaktadır.

Notification(bildirim) yöneticisi ve bu alanda geliştirmeler-özelleştirmeler yapmak için yine bu katmana başvurmamız gerekir. Örneğin bildirim sesleri ile ilgili dosyalar “alps/frameworks/base/data/sounds/notifications” yolunda yer almaktadır. Ancak bildirim pencereleri,renkler,boyutlar vb. üzerinde geliştirme yapmak istiyorsanız “alps/frameworks/base/core/res/res/” yolunda bulunan notification ile ilgili dosyaları incelemelisiniz.

Activity yöneticisi,uygulama lifecycle,activiy gruplama,yönetme,uygulama kısa yol oluşturma,Dialog,Fragment,Statusbar vb. activity ile ilgili tüm aşamaları “alps/frameworks/base/core/java/android/app/” yolunda inceleyebilir ve geliştirme yapabilirsiniz.

Dolayısıyla android uygulama geliştiricilerine,geliştirme standartlarını belli ilkelere bağlı kalması tamamen bu katman tarafından sağlanmaktadır.

NOT:Aşağıdaki özellikler android sürümüne göre farklılık(kaynak kod yolu,özellikler) gösterebilir.

  • android.app: Uygulama modeli ve temel işletim ortamı sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/app” yolunda yer alır.
  • android.content: Verilere ve cihazlara erişim sağlayıcı ortamı sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/content” yolunda yer alır.
  • android.database: Veritabanı erişimi ortamı sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/database” yolunda yer alır.
  • android.graphics: Ekrana çizilebilen grafik,dikdörtgen,renk,tuval vb. işlemlerini sağlar. İlgili kaynak dosyaları “alps/frameworks/base/graphics” yolunda yer alır.
  • android.location: Konum hizmetlerini sağlar. İlgili kaynak dosyaları “alps/frameworks/base/location” yolunda yer alır.
  • android.media: Sesleri ve videoları yönetmek için arayüzler sağlar. İlgili kaynak dosyaları “alps/frameworks/base/media” yolunda yer alır.
  • android.net: Ağ erişimini sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/net” yolunda yer alır.
  • android.os: Sistem hizmetleri ve IPC mekanizmaları sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/os” yolunda yer alır.
  • android.opengl: OpenGL araçlarını sağlar. İlgili kaynak dosyaları “alps/frameworks/base/opengl” yolunda yer alır.
  • android.provider: Content provider sağlayıcı. İlgili kaynak dosyalar “alps/frameworks/base/core/java/android/provider” yolunda yer alır.
  • android.telephony: Arama-Çağrı işlemleri sağlayıcı. İlgili kaynak dosyaları “alps/frameworks/base/telephony/” yolunda yer alır.
  • android.view: Temel kullanıcı arabirimleri sağlar. İlgili kaynak dosyaları “alps/frameworks/base/core/java/android/view” yolunda yer alır.
  • android.webkit: Varsayılan sistem browser arayüzü. İlgili kaynak dosyalar “alps/frameworks/base/core/java/android/webkit” yolunda yer alır.
  • android.widget: Widget sağlayıcı. İlgili kaynak dosyalar “alps/frameworks/base/core/java/android/widget” yolunda yer alır.

Ve dahası için Android API dökümantasyonunu inceleyebilirsiniz.

Native C/C++ Libraries

ART,Dalvik ve HAL gibi birçok temel Android sistem bileşeni ve hizmetleri C/C++ ile yazılmıştır. Android platformu,bu bileşen ve hizmetleri üst katman uygulamalarına sunmak için native kütüphaneler geliştirmiştir ve bunlar aracılığıyla sağlamaktadır. Üst katmanda,yani Java API Framework katmanında ise bu bileşen ve hizmetlere erişmek için java api tasarlamıştır. Örneğin geliştiriciler OpenGL’yi kullanmak istediklerinde,framework katmanında kullanacakları apilerle OpenGL’ye erişebilirler. Dolayısıyla CC++ ile geliştirilmiş sistem bileşenleri Native Libraries(kütüphaneler) aracılığıyla geliştiricinin erişimi sağlanmaktadır. Aynı zamanda Android NDK(Native Develpment Kit) kullanarak bu kütüphanelerle direkt erişebiliriz. Yani Android platformundaki CC++ katmanı NDK ile geliştiriciye ve Java Api fremwork katmanına açılır. Native katmanının framework kısmı “alps/frameworks/native” yolunda yer alır.

Hardware Abstraction Layer (HAL)

Donanım soyutlama katmanı(HAL),aygıt donanım özelliklerini Java Api Framework’a sunan standart arabirimler sağlar. Örneğin Java framework katmanından kamera veya bluetooth donanımına erişim isteği geldiğinde,HAL katmanı ilgili donanıma ait kütüphane modülünü yükler ve erişimi gerçekleştirir. HAL katmanına ait kaynak kodlar “alps/hardware” yolunda yer alır.
Dolayısıyla HAL, cihaz üzerindeki donanımları NDK ve Java Api Framework katmanına bağlar. Yani Linux Kernel ile NDK ve Framework katmanını birbirine bağlayan ara katmandır.
Örneğin “Java Api Framework” ile “HAL” katmanında bulunan Kamera etkileşim kaynak kod dosyaları “alps/frameworks/base/core/java/android/hardware” ve “alps/hardware/libhardware/modules/camera” yollarında yer alır.

Linux Kernel

Android platformu linux çekirdeği üstüne inşa edilmiştir. Örneğin Android Runtime(ART,Dalvik),iş parçacığı oluşturma ve low level bellek yönetimi gibi temel işlevler bu katmanda ve bu katmana bağlantılı çalışır. Ayrıca linux kerneli kullanmak,Android’in temel güvenlik özelliklerinden yararlanmasına ve cihaz üreticilerinin iyi bilinen bir kernel için donanım sürücüleri geliştirmesine olanak tanır.

Linux kernel mimarisi,driver-modül ekleme ve diğer kernel geliştirme ile ilgili makaleleri hazırlayacağım için bu katmanın mimarisi hakkında detaylara girmiyorum. Ayrıca AOSP kaynak kodlarını derinlemesine inceleyeceğimiz makaleler hazırlıyorum. Her makalede bir modül veya modülün küçük bir parçasını veya bir kod parçasını ele alarak işleyişini inceleyerek ilerleyeceğiz.

AOSP Deep Dive makaleleri seri halinde devam edecektir.

KAYNAKLAR
https://source.android.com/

-end of

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet