IPC Yöntemleri 1 - AIDL

IPC (Inter Process Communication), process'ler arası haberleşme anlamına gelen genel bir kavramdır.


Android özelinde ise,

  • Uygulamalar arası haberleşme

  • Multi-process bir uygulamadaki process'lerin haberleşmesi (Activity, Service vb. bileşenleri farklı process'lerde çalıştırılmış uygulama)

anlamlarına gelebilir. Bu yazıda uygulamalar arası haberleşme üzerine örnekler oluşturacağız.


Android'de IPC için kullanılan 3 temel yöntem var:

  1. AIDL

  2. Messenger

  3. Broadcast

IPC için Linux sistemlerde kullanılan geleneksel yöntemleri (socket haberleşmesi, paylaşımlı dosyalar gibi) kullanmak da mümkün fakat güvenlik sebebiyle iletişim kurmak isteyen uygulamaya kimlik doğrulaması yapabiliyor olmamız gibi artılarından dolayı yukarıda saydığımız Android'e has yöntemleri tercih etmemiz öneriliyor.


Bu yazıda 3 yöntemin de nasıl kullanılacağına bakacağız.


 

AIDL


Bu yöntemi, multithreaded bir IPC yapısına ihtiyaç duyuyorsanız kullanmalısınız. Eğer concurrent (eş zamanlı) işlemler yapmayacaksanız AIDL yerine Messenger'ı tercih edebilirsiniz.


Bu yöntemde, bir uygulama aynı cihazdaki bir başka uygulamadaki metodu çağırır, yani RPC (Remote Procedure Call) yapar. Bu metotlar birçok farklı process/thread'den eş zamanlı olarak çağrılabileceği için, çağrıları ele alacağımız mekanizmanın thread-safe olmasına özen göstermemiz gerekir.


Peki AIDL nedir? IPC kavramına aşina iseniz AIDL dosyasını Android-IDL (Interface Definition Language) olarak düşünebilirsiniz. Kurulacak iletişim için tarafların el sıkıştığı arayüz AIDL dilinde oluşturulduğu için bu yöntem AIDL olarak bilinir. AIDL, Java syntax'ına benzer bir dildir.


Temel kullanıma bir örnek vermek için IPCServer ve IPCClient isimli iki uygulama oluşturup bunları nasıl haberleştireceğimizi ele alalım. Yazının devamında, sadelik olması açısından bu uygulamalardan sunucu ve istemci diye bahsedeceğim. Uygulamaların kaynak kodlarına yazının sonundaki linkten ulaşabilirsiniz.


İki fonksiyonalite içeren bir senaryoyu kodlayalım;

  • İstemci, sunucunun PID'sini ve sunucuya kaç bağlantı isteği geldiğini sorsun.

  • İstemci, sunucu uygulamasına kendi PID'si ve paket adı gibi bilgilerini göndersin. Bunlar da sunucu uygulamasının grafik arayüzünde son bağlanan istemcinin bilgileri olarak gösterilsin.

Örnek bittiğinde bu şekilde görünecek,


Bu yöntemde iletişim Binder mimarisine dayanır. Bir servis, startService çağırımı ile başlatılabildiği gibi bindService çağırımı ile de başlatılabilir. Servise, hem uygulama içinden hem de bir remote process'ten bind olunabilir. Bind olan bileşene (activity, service) bir binder objesi döndürülür.


Örneğimizde istemci, sunucu uygulamasının servisine bind olacak ve bu sayede sunucu uygulamasında tanımlanan metotlara erişebilecek. Bu yazının konusu olmadığı için Bound Service kavramının detaylarına daha fazla değinmeyeceğiz.