Android 12系统源码_CarService(二)CarService的启动流程

一、系统启动后在SystemServer进程中启动CarServiceHelperService

1、在Android系统之后,系统首先会启动一个名为Zygote的进程,而Zygote进程又会启动SystemServer进程,这里我们先来看SystemServer的main方法。

frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer implements Dumpable {
    
    
	
	public static void main(String[] args) {
    
    
	    new SystemServer().run();
	}
	private void run(){
    
    
	    	...代码省略...
	        // Start services.
	        try {
    
    
	            t.traceBegin("StartServices");
	            startBootstrapServices(t);//启动引导服务
	            startCoreServices(t);//启动核心服务
	            startOtherServices(t);//启动其他服务
	        } catch (Throwable ex) {
    
    
	            Slog.e("System", "******************************************");
	            Slog.e("System", "************ Failure starting system services", ex);
	            throw ex;
	        } finally {
    
    
	            t.traceEnd(); // StartServices
	        }
	    	...代码省略...
	}
}

main 方法里启动了 run方法,而在 run 方法中会调用了startOtherServices() 方法。

2、startOtherServices和CarService相关的关键代码如下所示。

public final class SystemServer implements Dumpable {
    
    

    private static final String CAR_SERVICE_HELPER_SERVICE_CLASS =
            "com.android.internal.car.CarServiceHelperService";
    private PackageManager mPackageManager;

    private void startOtherServices() {
    
    
            mActivityManagerService.systemReady(() -> {
    
    
          		...代码省略...
	            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    
    
	                t.traceBegin("StartCarServiceHelperService");
	                //如果有车机服务,则开启车机帮助服务
	                final SystemService cshs = mSystemServiceManager
	                        .startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
	                if (cshs instanceof Dumpable) {
    
    
	                    mDumper.addDumpable((Dumpable) cshs);
	                }
	                if (cshs instanceof DevicePolicySafetyChecker) {
    
    
	                    dpms.setDevicePolicySafetyChecker((DevicePolicySafetyChecker) cshs);
	                }
	                t.traceEnd();
	            }
          		...代码省略...
          }
    }
}

3、SystemServiceManager的startService方法如下所示。

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

public class SystemServiceManager {
    
    
	//存储了SystemServiceManager负责启动的各种服务
    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
    
    public SystemService startService(String className) {
    
    
        final Class<SystemService> serviceClass = loadClassFromLoader(className,this.getClass().getClassLoader());
        return startService(serviceClass);
    }
    
    @SuppressWarnings("unchecked")
    public <T extends SystemService> T startService(Class<T> serviceClass) {
    
    
        try {
    
    
            final String name = serviceClass.getName();
            ...代码省略...
            final T service;
            try {
    
    
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
            } 
            ...代码省略...
            startService(service);
            return service;
        } finally {
    
    
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

    public void startService(@NonNull final SystemService service) {
    
    
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try {
    
    
            service.onStart();
        } catch (RuntimeException ex) {
    
    
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
        warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    }
}

因为前面我们传入的参数为com.android.internal.car.CarServiceHelperService,所以这里startService方法首先会通过反射创建CarServiceHelperService对象实例,然后将其存储在类型ArrayList的mServices中,紧接着会调用CarServiceHelperService的onStart方法。

4、CarServiceHelperService的onStart方法如下所示。

frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java

public class CarServiceHelperService extends SystemService
        implements Dumpable, DevicePolicySafetyChecker {
    
    
    
    @Override
    public void onStart() {
    
    
        EventLog.writeEvent(EventLogTags.CAR_HELPER_START);
        IntentFilter filter = new IntentFilter(Intent.ACTION_REBOOT);
        filter.addAction(Intent.ACTION_SHUTDOWN);
        mContext.registerReceiverForAllUsers(mShutdownEventReceiver, filter, null, null);
        mCarWatchdogDaemonHelper.addOnConnectionChangeListener(mConnectionListener);
        mCarWatchdogDaemonHelper.connect();
        Intent intent = new Intent();
        intent.setPackage("com.android.car");
        intent.setAction(CAR_SERVICE_INTERFACE);
        //通过bindService绑定车机服务CarService
        if (!mContext.bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,
                mHandler, UserHandle.SYSTEM)) {
    
    
            Slogf.wtf(TAG, "cannot start car service");
        }
        loadNativeLibrary();
    }

    void loadNativeLibrary() {
    
    
        System.loadLibrary("car-framework-service-jni");
    }
}

packages/services/Car/car-lib/src/com/android/car/internal/common/CommonConstants.java

public final class CommonConstants {
    
    
    // CarService Constants
    public static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
}

CarServiceHelperService的onStart方法首先创建一个Action为android.car.ICar,包名为com.android.car的Intent,然后通过bindService的方式启动该Intent对应的服务,而这个服务正是车机模块才有的CarService服务。

二、CarService启动

1、系统关于CarService服务的声明如下所示。

packages/services/Car/service/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
     package="com.android.car"
     coreApp="true"
     android:sharedUserId="android.uid.system">
    <!--...代码省略...-->       
    <application android:label="@string/app_title"
         android:directBootAware="true"
         android:allowBackup="false"
         android:persistent="true">

        <service android:name=".CarService"
             android:singleUser="true"
             android:exported="true">
            <intent-filter>
                <action android:name="android.car.ICar"/>
            </intent-filter>
        </service>
        <!--...代码省略...-->       
   </application>
</manifest>     

结合这个配置文件我们可以知道CarServiceHelperService最终所启动的,就是CarService这个服务。

2、CarService的onCreate方法如下所示。

public class CarService extends Service {
    
    

    private ICarImpl mICarImpl;

    @Override
    public void onCreate() {
    
    
  		...代码省略...
        mICarImpl = new ICarImpl(this,
                mVehicle,
                SystemInterface.Builder.defaultSystemInterface(this).build(),
                mVehicleInterfaceName);
        mICarImpl.init();

        linkToDeath(mVehicle, mVehicleDeathRecipient);
		//将ICarImpl存储到系统服务管理者ServiceManager中
        ServiceManager.addService("car_service", mICarImpl);
        SystemProperties.set("boot.car_service_created", "1");

        super.onCreate();

        initTiming.traceEnd(); // "CarService.onCreate"
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
    
        // keep it alive.
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
    
    
        return mICarImpl;
    }

}

CarService的onCreate方法会创建一个关键对象ICarImpl的实例,并将该实例赋值给mICarImpl属性变量,然后会调用该对象的init方法,之后还会将mICarImpl存储到ServiceManager中。另外结合CarService的onBind方法我们可以知道,CarServiceHelperService通过bindService方式开启CarService,CarService会返回mICarImpl对象,通过该Binder对象使二者建立双向跨进程通信。

猜你喜欢

转载自blog.csdn.net/abc6368765/article/details/130388679