【Android车载系列】第2章 车载系统启动与CarService

这篇具有很好参考价值的文章主要介绍了【Android车载系列】第2章 车载系统启动与CarService。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 车载启动流程

 

        车载Android启动流程基本是在Android系统的启动流程中,多了Car相关服务。其他流程基本一致,下面我们来看一下Android系统的启动流程。

1.1 Android系统启动流程

        Android系统的启动,从设备的开机键长按开始到Android桌面展示,这个完整流程就是Android系统启动的流程。从系统层次角度可分为Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段;从开机到启动Android桌面完成具体细节可分为Android系统启动的七个步骤。下面我们来分析一下:

carservice,车载,Automotive,Android,车载系统,android,CarService

1.1.1 启动电源启动系统

        触当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行。

1.1.2 启动BootLoader引导程序

        引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是将AndroidOS拉起来。

1.1.3 启动linux内核

         当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置后,它首先会在系统文件中寻找init.rc文件,并启动init.rc进程。

1.1.4 启动init进程

        init进程启动做了很多工作,但是总的来说主要就是做了一下三件事:

        (1)创建和挂载启动所需文件目录。 

        (2)初始化和启动系统属性服务。

        (3)解析init.rc配置文件并启动Zygote进程。

1.1.5 启动zygote进程孵化器

        程序上app_process进程启动zygote进程。zygote主要创建Java虚拟机并为Java虚拟机注册JNI方法;创建服务端Socket;预加载类和资源;启动SystemServer进程;等待AMS请求创建新的应用进程。

1.1.6 启动systemServer进程

        创建并启动Binder线程池,这样可以和其他进程进行通信。

        创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期的管理。

        启动系统中的各种服务。包括我们熟悉的AMS、PMS、WMS。

1.1.7 启动Launcher

        被SystemServer启动的AMS会启动Launcher,Launcher启动后会将已安装应用的图标显示在桌面上。

carservice,车载,Automotive,Android,车载系统,android,CarService

1.2 车载Android启动的区别

        车载Android启动是在前面1.1Android系统启动流程中SystemServer开始,有区别。车载Android在SystemServer中启动独有的CarService。下图虚线部分:

carservice,车载,Automotive,Android,车载系统,android,CarService

2 车载CarService启动

         CarService是车载Android系统的核心服务之一,所有应用都需要通过CarService来查询、控制整车的状态。不仅仅是车辆控制,实际上CarService几乎就是整个车载Framework最核心的组件。提供了一系列的服务与HAL层的VehicleHAL通信,进而通过车载总线(例如CAN总线)与车身进行通讯,同时它们还为应用层的APP提供接口,从而让APP能够实现对车身的控制与状态的显示。

        CarService启动流程和汽车相关的服务的启动主要依靠一个系统服务CarServiceHelperService开机时在SystemServer中启动。

 2.1 CarServiceHelperService启动

         SystemServer进程启动后会调用main()->run()->startOtherService()方法,通过判断当前系统是否是车载分支的版本,是则创建CarServiceHelperService。

package com.android.server;
// ...

public final class SystemServer {

// ...

    /**
    * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
    */
    private void startOtherServices() {
    // ...
        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
            traceBeginAndSlog("StartCarServiceHelperService");
            mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
            traceEnd();
        }
    // ...
    }

// ...
}

         SystemServer中使用Service管理代理SystemServiceManager的startService方法通过反射构建com.android.internal.car.CarServiceHelperService。CarServiceHelperService也是继承自SystemService,初始化成功后调用onStart()方法启动。

/**
 * Manages creating, starting, and other lifecycle events of
 * {@link com.android.server.SystemService system services}.
 *
 * {@hide}
 */
public class SystemServiceManager {
 
// ...

    /**
     * Starts a service by class name.
     *
     * @return The service instance.
     */
    @SuppressWarnings("unchecked")
    public SystemService startService(String className) {
        final Class<SystemService> serviceClass;
        try {
            serviceClass = (Class<SystemService>)Class.forName(className);
        } catch (ClassNotFoundException ex) {
            Slog.i(TAG, "Starting " + className);
            throw new RuntimeException("Failed to create service " + className
                    + ": service class not found, usually indicates that the caller should "
                    + "have called PackageManager.hasSystemFeature() to check whether the "
                    + "feature is available on this device before trying to start the "
                    + "services that implement it", ex);
        }
        return startService(serviceClass);
    }

    public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
            // ...
            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");
    }
// ...
}

2.2 车载CarService进程启动        

        onStart()方法中使用AIDL启动CarService(新的进程),并加载jni库为CarService提供必要的API。CarServiceHelperService重写后的onStart()需要重点看一下:

package com.android.internal.car;
// ...

/**
 * System service side companion service for CarService.
 * Starts car service and provide necessary API for CarService. Only for car product.
 */
public class CarServiceHelperService extends SystemService {
// ...

     private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";

    @Override
    public void onStart() {
        Intent intent = new Intent();
        intent.setPackage("com.android.car");
        intent.setAction(CAR_SERVICE_INTERFACE);
        if (!getContext().bindServiceAsUser(intent, mCarServiceConnection,Context.BIND_AUTO_CREATE,UserHandle.SYSTEM)) {
            Slog.wtf(TAG, "cannot start car service");
        }
        System.loadLibrary("car-framework-service-jni");
    }

// ...
}

2.3 CarServer启动图 

大致流程分为以下几步:

        1.SystemServer初始化时候调用startOtherService()。

        2.startOtherService()方法通过SystemServerManager对象的startService()启动CarServiceHelperService,并调用其onStart()方法。

        3.CarServiceHelperService通过bindServiceAsUser()方法启动CarService

        4.CarService被创建后,onCreate方法调用进行初始化当前对象。

carservice,车载,Automotive,Android,车载系统,android,CarService

 3 车载CarService内部实现

carservice,车载,Automotive,Android,车载系统,android,CarService

CarService进入启动时序后,onCreate()方法中进行一系列的自身的初始化操作,步骤如下:

        1)通过HIDL接口获取到HAL层的IHwBinder对象-IVehicle,与AIDL的用法类似,必须持有IHwBinder对象我们才可以与Vehicle HAL层进行通信。

        2)创建ICarImpl对象,并调用init方法,它就是ICar.aidl接口的实现类,我们需要通过它才能拿到其他的Service的IBinder对象。

        3)将ICar.aidl的实现类添加到ServiceManager中。

        4)设定SystemProperty,将CarService设定为创建完成状态,只有包含CarService在内的所有的核心Service都完成初始化,才能结束开机动画并发送开机广播。

@Override
public void onCreate() {
    Log.i(CarLog.TAG_SERVICE, "Service onCreate");
    mCanBusErrorNotifier = new CanBusErrorNotifier(this /* context */ );
    mVehicle = getVehicle();
    EventLog.writeEvent(EventLogTags.CAR_SERVICE_CREATE, mVehicle == null ? 0 : 1);

    if (mVehicle == null) {
        throw new IllegalStateException("Vehicle HAL service is not available.");
    }
    try {
        mVehicleInterfaceName = mVehicle.interfaceDescriptor();
    } catch (RemoteException e) {
        throw new IllegalStateException("Unable to get Vehicle HAL interface descriptor", e);
    }

    Log.i(CarLog.TAG_SERVICE, "Connected to " + mVehicleInterfaceName);
    EventLog.writeEvent(EventLogTags.CAR_SERVICE_CONNECTED, mVehicleInterfaceName);

    mICarImpl = new ICarImpl(this,
            mVehicle,
            SystemInterface.Builder.defaultSystemInterface(this).build(),
            mCanBusErrorNotifier,
            mVehicleInterfaceName);
    mICarImpl.init();
    // 处理 HIDL 连接
linkToDeath(mVehicle, mVehicleDeathRecipient);

    ServiceManager.addService("car_service", mICarImpl);
    SystemProperties.set("boot.car_service_created", "1");
    super.onCreate();
}

3.1 IVehicle对象创建

        通过HIDL接口获取到HAL层的IHwBinder对象-IVehicle,与AIDL的用法类似,必须持有IHwBinder对象我们才可以与Vehicle HAL层进行通信。

@Nullable
private static IVehicle getVehicle() {
    final String instanceName = SystemProperties.get("ro.vehicle.hal", "default");

    try {
        return android.hardware.automotive.vehicle.V2_0.IVehicle.getService(instanceName);
    } catch (RemoteException e) {
        Log.e(CarLog.TAG_SERVICE, "Failed to get IVehicle/" + instanceName + " service", e);
    } catch (NoSuchElementException e) {
        Log.e(CarLog.TAG_SERVICE, "IVehicle/" + instanceName + " service not registered yet");
    }
    return null;
}

3.2 实现Service服务,ICarImpl实现

接着我们再来看ICarImpl的实现,如下所示:

3.2.1 创建各个核心服务对象。

3.2.2 把服务对象缓存到CarLocalServices中,主要为了方便Service之间的相互访问。

ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
         CanBusErrorNotifier errorNotifier, String vehicleInterfaceName,
         @Nullable CarUserService carUserService,
         @Nullable CarWatchdogService carWatchdogService) {
    ...
    // 创建 核心服务对象
mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),
            systemInterface, mCarUserService);
    ...

    // 将重要的服务缓存到 CarLocalServices
CarLocalServices.addService(CarPowerManagementService.class, mCarPowerManagementService);
    CarLocalServices.addService(CarPropertyService.class, mCarPropertyService);
    CarLocalServices.addService(CarUserService.class, mCarUserService);
    CarLocalServices.addService(CarTrustedDeviceService.class, mCarTrustedDeviceService);
    CarLocalServices.addService(CarUserNoticeService.class, mCarUserNoticeService);
    CarLocalServices.addService(SystemInterface.class, mSystemInterface);
    CarLocalServices.addService(CarDrivingStateService.class, mCarDrivingStateService);
    CarLocalServices.addService(PerUserCarServiceHelper.class, mPerUserCarServiceHelper);
    CarLocalServices.addService(FixedActivityService.class, mFixedActivityService);
    CarLocalServices.addService(VmsBrokerService.class, mVmsBrokerService);
    CarLocalServices.addService(CarOccupantZoneService.class, mCarOccupantZoneService);
    CarLocalServices.addService(AppFocusService.class, mAppFocusService);

    // 将创建的服务对象依次添加到一个list中保存起来
List<CarServiceBase> allServices = new ArrayList<>();
    allServices.add(mFeatureController);
    allServices.add(mCarUserService);
    ...
    allServices.add(mCarWatchdogService);
    // Always put mCarExperimentalFeatureServiceController in last.
addServiceIfNonNull(allServices, mCarExperimentalFeatureServiceController);
    mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);

}

3.2.3 将服务对象放置一个list中。这样init方法中就可以以循环的形式直接调用服务对象的init,而不需要一个个调用。VechicleHAL的程序也会在这里完成初始化。

@MainThread
void init() {
    mBootTiming = new TimingsTraceLog(VHAL_TIMING_TAG, Trace.TRACE_TAG_HAL);
    traceBegin("VehicleHal.init");
    // 初始化 Vechicle HAL
    mHal.init();
    
    traceEnd();
    traceBegin("CarService.initAllServices");
    // 初始化所有服务
    for (CarServiceBase service : mAllServices) {
        service.init();
    }
    traceEnd();
}

3.2.4 最后实现ICar.aidl中定义的各个接口就可以了

@Override
public IBinder getCarService(String serviceName) {
    if (!mFeatureController.isFeatureEnabled(serviceName)) {
        Log.w(CarLog.TAG_SERVICE, "getCarService for disabled service:" + serviceName);
        return null;
    }
    switch (serviceName) {
        case Car.AUDIO_SERVICE:
            return mCarAudioService;
        case Car.APP_FOCUS_SERVICE:
            return mAppFocusService;
        case Car.PACKAGE_SERVICE:
            return mCarPackageManagerService;
       ...
        default:
            IBinder service = null;
            if (mCarExperimentalFeatureServiceController != null) {
                service = mCarExperimentalFeatureServiceController.getCarService(serviceName);
            }
            if (service == null) {
                Log.w(CarLog.TAG_SERVICE, "getCarService for unknown service:"
                        + serviceName);
            }
            return service;
    }
}

3.3 CarService运行图 

carservice,车载,Automotive,Android,车载系统,android,CarService

3.4 总结

     CarService实现的功能几乎就是覆盖整个车载Framework的核心。

     然而现实中为了保证各个核心服务的稳定性,同时降低CarService协同开发的难度,一般会选择将一些重要的服务拆分单独作为一个独立的Service运行在独立的进程中,导致有的车机系统中CarService只实现了CarPropertyService的功能。

     CarService实现流程可以这样理解:提供IVehicle对象与底层交互,提供ICarImpl初始化一系列服务交给ServiceManager管理,而这些服务可以通过IVehicle对象调用底层的API,CarService充当一个中介代理的角色存在。文章来源地址https://www.toymoban.com/news/detail-628144.html

到了这里,关于【Android车载系列】第2章 车载系统启动与CarService的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android车载系列】第9章 车载通信-Socket实现IPC通信机制(实现仿FDBus效果)

      FDBus 基于 Socket (TCP 和 Unix domain) 之上的IPC机制, 采用 Google protobuf 做序列化和反序列化。 FDBus还支持字符串形式的名字作为server地址。通过 name server 自动为 server 分配Unix domain 地址和 TCP 端口号, 实现 client 和server 之间用服务名字寻址。 一句话描述:FDBus (Fast Distributed Bus

    2024年02月10日
    浏览(66)
  • Android车载学习笔记1——车载整体系统简介

             汽车操作系统包括安全车载操作系统、智能驾驶操作系统和智能座舱操作系统。 1. 安全车载操作系统         安全车载操作系统主要面向经典车辆控制领域,如动力系统、底盘系统和车身系统等,该类操作系统对实时性和安全性要求极高,生态发展已趋于成

    2024年02月06日
    浏览(53)
  • Android 车载应用开发之车载操作系统

    到 2030 年,全球电动汽车的销量将超过 7000 万辆,保有量将达到 3.8 亿辆,全球年度新车渗透率有望触及 60% 。这一数据来自国际能源署(IEA)发布的《全球电动汽车展望2023》。 市场趋势和政策努力的双加持下,新能源汽车来势凶猛,燃油车保有量逐年递减。此番景象让死去

    2024年02月22日
    浏览(53)
  • Android Automotive编译

    准备一台安装Ubuntu系统的机器(windows系统的机器可以通过WSL安装ubuntu系统)   本文使用docker进行编译,因此提前安装docker。参考网络链接安装docker并设置为不使用sudo进行docker操作。 参考链接: Ubuntu22.04安装Docker_Canminem的博客-CSDN博客 不使用sudo 执行Docker命令的方法 -博客-

    2024年02月09日
    浏览(44)
  • Android Automotive 调节音量的过程

    Android Automotive OS (AAOS) 是在核心 Android 系统的基础之上打造而成,以支持将 Android 系统用作车辆信息娱乐系统的场景。AAOS 的音频系统对核心 Android 音频系统做了扩充,创建了新的概念和抽象,如音区等,提供了新的 API 接口,添加了的新的服务,以支持智能座舱的特殊需要。

    2024年02月10日
    浏览(45)
  • Android车载系统Car模块架构链路分析

    SystemServer 中专门为 AAOS 设立的系统服务,用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl Car模块核心服务APP,Android 13版本开始分为两个,一个是掌管 CarService 服务类的  builtin app ,源码在:packages/services/Car/service-builtin/,一个是拥有

    2024年02月19日
    浏览(44)
  • Android Automotive 14(2) 多屏模拟器

    上篇说到AAOS14 (Android Automotive OS 14)环境搭建完毕,今天记录一下操作模拟器多屏的过程。 从Android Automotive OS 14 Releases看,第一项更新重点介绍了 Car Framework Display and Window Manager ,比如在multi-user方面的更新: 从目前的新能源车型看,越来越多的车型,配置了丰富的车内屏幕,

    2024年02月21日
    浏览(90)
  • Android Studio Automotive虚拟设备创建过程

    AS添加运行Automotive设备的过程 虚拟器的创建过程就是在Device Manager里添加对应设备并且再选择对应的镜像版本最后产生虚拟设备 如下过程: 可以看到,有手机、平板、穿戴设备、TV、Automotive等设备 点击下方的 New Hardware Profile我们可以自己创建设备,选择设备类型、分辨率、

    2024年02月19日
    浏览(47)
  • Android 11 系统开发增加低电量弹窗提示 手机 平板 车载 TV 投影 通用

    SystemUIService 中启动PowerUI 主要修改 5、在symbols 文件中添加对应java-symbol方便Framework代码引用code

    2024年03月15日
    浏览(42)
  • android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

    直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/ 在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的 静态修改方案 使用命令查看display2即副屏的信息情况 adb shell dumpsys d

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包