Slide 1

Slide 1 text

Digging Into Android System Services Dave Smith, PE @devunwired

Slide 2

Slide 2 text

Why Are You Here? Trace AOSP Code Learn Platform Internals Discover App Impact

Slide 3

Slide 3 text

Linux Kernel Hardware Abstraction Layer Native Services Runtime Application Framework Applications

Slide 4

Slide 4 text

Linux Kernel Hardware Abstraction Layer Native Services Runtime Application Framework Applications

Slide 5

Slide 5 text

Application System Server Manager Service

Slide 6

Slide 6 text

Application System Server Manager Service Application Manager Application Manager Application Manager

Slide 7

Slide 7 text

Context.getSystemService(SERVICE_NAME)

Slide 8

Slide 8 text

ContextImpl SystemServiceRegistry Context AlarmManager NotificationManager LocationManager PowerManager Context.getSystemService(SERVICE_NAME)

Slide 9

Slide 9 text

package android.app;
 
 final class SystemServiceRegistry {
 ...
 
 static {
 ...
 registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
 new CachedServiceFetcher() {
 @Override
 public AccountManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
 IAccountManager service = IAccountManager.Stub.asInterface(b);
 return new AccountManager(ctx, service);
 }
 });
 ...
 registerService(Context.ALARM_SERVICE, AlarmManager.class,
 new CachedServiceFetcher() {
 @Override
 public AlarmManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
 return new AlarmManager(service, ctx);
 }
 });
 ...
 }
 } SystemServiceRegistry.java

Slide 10

Slide 10 text

package android.app;
 
 final class SystemServiceRegistry {
 ...
 
 static {
 ...
 registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
 new CachedServiceFetcher() {
 @Override
 public AccountManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
 IAccountManager service = IAccountManager.Stub.asInterface(b);
 return new AccountManager(ctx, service);
 }
 });
 ...
 registerService(Context.ALARM_SERVICE, AlarmManager.class,
 new CachedServiceFetcher() {
 @Override
 public AlarmManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
 return new AlarmManager(service, ctx);
 }
 });
 ...
 }
 } SystemServiceRegistry.java

Slide 11

Slide 11 text

Application System Server Manager Service

Slide 12

Slide 12 text

Binder IPC Application System Server Service Manager

Slide 13

Slide 13 text

Application System Server Manager Service Binder IPC AIDL Proxy Stub

Slide 14

Slide 14 text

Application System Server AlarmManager AlarmManagerService IAlarmManager IAlarmManager.Stub Binder IPC

Slide 15

Slide 15 text

IAlarmManager.aidl AlarmManager.java package android.app;
 
 ...
 
 public class AlarmManager {
 private final IAlarmManager mService;
 ...
 
 public void setTime(long millis) {
 try {
 mService.setTime(millis);
 } catch (RemoteException ex) {
 throw ex.rethrowFromSystemServer();
 }
 }
 
 public void setTimeZone(String timeZone) {
 ...
 
 try {
 mService.setTimeZone(timeZone);
 } catch (RemoteException ex) {
 throw ex.rethrowFromSystemServer();
 }
 }
 } package android.app;
 
 interface IAlarmManager {
 void set(...);
 boolean setTime(long millis);
 void setTimeZone(String zone);
 void remove(...);
 long getNextWakeFromIdleTime();
 ...
 }

Slide 16

Slide 16 text

IAlarmManager.aidl AlarmManager.java package android.app;
 
 ...
 
 public class AlarmManager {
 private final IAlarmManager mService;
 ...
 
 public void setTime(long millis) {
 try {
 mService.setTime(millis);
 } catch (RemoteException ex) {
 throw ex.rethrowFromSystemServer();
 }
 }
 
 public void setTimeZone(String timeZone) {
 ...
 
 try {
 mService.setTimeZone(timeZone);
 } catch (RemoteException ex) {
 throw ex.rethrowFromSystemServer();
 }
 }
 } package android.app;
 
 interface IAlarmManager {
 void set(...);
 boolean setTime(long millis);
 void setTimeZone(String zone);
 void remove(...);
 long getNextWakeFromIdleTime();
 ...
 }

Slide 17

Slide 17 text

package com.android.server;
 
 public class AlarmManagerService extends SystemService {
 ... 
 private final IBinder mService = new IAlarmManager.Stub() { 
 @Override
 public boolean setTime(long millis) {
 getContext().enforceCallingOrSelfPermission(
 "android.permission.SET_TIME",
 "setTime");
 ...
 } 
 @Override
 public void setTimeZone(String tz) {
 getContext().enforceCallingOrSelfPermission(
 "android.permission.SET_TIME_ZONE",
 "setTimeZone");
 ...
 }
 }; 
 } AlarmManagerService.java IAlarmManager.aidl package android.app;
 
 interface IAlarmManager {
 void set(...);
 boolean setTime(long millis);
 void setTimeZone(String zone);
 void remove(...);
 long getNextWakeFromIdleTime();
 ...
 }

Slide 18

Slide 18 text

Binder IPC Application Service Object

Slide 19

Slide 19 text

Binder IPC Application Service Object Object

Slide 20

Slide 20 text

public class MainActivity extends Activity implements LocationListener {
 
 @Override
 protected void onResume() {
 super.onResume();
 
 LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE);
 manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
 }
 
 @Override
 protected void onPause() {
 super.onPause();
 
 LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE);
 manager.removeUpdates(this);
 }
 
 @Override
 public void onLocationChanged(Location location) {
 ...
 }
 
 ...
 }

Slide 21

Slide 21 text

public class MainActivity extends Activity implements LocationListener {
 
 @Override
 protected void onResume() {
 super.onResume();
 
 LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE);
 manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
 }
 
 @Override
 protected void onPause() {
 super.onPause();
 
 LocationManager manager = (LocationManager) getSystemService(LOCATION_SERVICE);
 manager.removeUpdates(this);
 }
 
 @Override
 public void onLocationChanged(Location location) {
 ...
 }
 
 ...
 }

Slide 22

Slide 22 text

Application System Server Manager Service

Slide 23

Slide 23 text

Application System Server Manager Service Service Manager Stub Stub

Slide 24

Slide 24 text

Application System Server Manager Service Service Manager IBinder Stub IBinder

Slide 25

Slide 25 text

Application System Server Manager Service Service Manager Proxy Stub IBinder

Slide 26

Slide 26 text

$ adb shell service list Found 116 services: 0 carrier_config: [com.android.internal.telephony.ICarrierConfigLoader] 1 phone: [com.android.internal.telephony.ITelephony] 2 isms: [com.android.internal.telephony.ISms] 3 iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo] 4 simphonebook: [com.android.internal.telephony.IIccPhoneBook] 5 isub: [com.android.internal.telephony.ISub] 6 telecom: [com.android.internal.telecom.ITelecomService] 7 contexthub_service: [android.hardware.location.IContextHubService] 8 dns_listener: [android.net.metrics.IDnsEventListener] 9 connectivity_metrics_logger: [android.net.IConnectivityMetricsLogger] 10 imms: [com.android.internal.telephony.IMms] 11 media_projection: [android.media.projection.IMediaProjectionManager] 12 launcherapps: [android.content.pm.ILauncherApps] 13 shortcut: [android.content.pm.IShortcutService] 14 fingerprint: [android.hardware.fingerprint.IFingerprintService] 15 trust: [android.app.trust.ITrustManager] 16 media_router: [android.media.IMediaRouterService] 17 media_session: [android.media.session.ISessionManager] 18 restrictions: [android.content.IRestrictionsManager] 19 print: [android.print.IPrintManager] 20 graphicsstats: [android.view.IGraphicsStats] ...

Slide 27

Slide 27 text

package android.app;
 
 final class SystemServiceRegistry {
 ...
 
 static {
 ...
 registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
 new CachedServiceFetcher() {
 @Override
 public AccountManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
 IAccountManager service = IAccountManager.Stub.asInterface(b);
 return new AccountManager(ctx, service);
 }
 });
 ...
 registerService(Context.ALARM_SERVICE, AlarmManager.class,
 new CachedServiceFetcher() {
 @Override
 public AlarmManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
 return new AlarmManager(service, ctx);
 }
 });
 ...
 }
 } SystemServiceRegistry.java

Slide 28

Slide 28 text

package android.app;
 
 final class SystemServiceRegistry {
 ...
 
 static {
 ...
 registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
 new CachedServiceFetcher() {
 @Override
 public AccountManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
 IAccountManager service = IAccountManager.Stub.asInterface(b);
 return new AccountManager(ctx, service);
 }
 });
 ...
 registerService(Context.ALARM_SERVICE, AlarmManager.class,
 new CachedServiceFetcher() {
 @Override
 public AlarmManager createService(ContextImpl ctx) {
 IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
 return new AlarmManager(service, ctx);
 }
 });
 ...
 }
 } SystemServiceRegistry.java

Slide 29

Slide 29 text

package com.android.server;
 
 import android.content.Context;
 
 public final class SystemServer {
 ...
 ConnectivityServicer connectivity = new ConnectivityService(
 context, networkManagement, networkStats, networkPolicy);
 ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity); 
 ...
 LocationManagerService location = new LocationManagerService(context);
 ServiceManager.addService(Context.LOCATION_SERVICE, location);
 ...
 } SystemServer.java

Slide 30

Slide 30 text

@devunwired +DaveSmithDev milehighandroid.com wiresareobsolete.com