Android Automotive CarService 和 CarManager 源码剖析

AAOS CarAudioService 开发入门 这个目录中的文件改动,编译 make CarService追踪记录:2 /packages/services/Car/service/ 这个里面的文件改动,编译 make com.android.car.framework追踪记录:push到x相应的手机的目录,然后重启手机生效。 阅读详情

在这里插入图片描述

1. CarService 启动流程

1.1 CarServiceImpl 入口

CarService 是一个系统服务,在系统启动时由 System Server 启动。

文件位置: packages/services/Car/service/src/com/android/car/CarServiceImpl.java

@Keep
public class CarServiceImpl extends ProxiedService {
    private ICarImpl mICarImpl;
    private VehicleStub mVehicle;

    @Override
    public void onCreate() {
        // 1. 获取 VehicleStub(连接 Vehicle HAL)
        mVehicle = VehicleStub.newVehicleStub();

        // 2. 构建 ICarImpl 核心实现
        mICarImpl = new ICarImpl.Builder()
                .setServiceContext(this)
                .setBuiltInContext(getBuiltinPackageContext())
                .setVehicle(mVehicle)
                .setSystemInterface(
                        SystemInterface.Builder.defaultSystemInterface(this).build())
                .setVehicleInterfaceName(mVehicle.getInterfaceDescriptor())
                .build();

        // 3. 初始化所有服务
        mICarImpl.init();

        // 4. 注册死亡监听,VHAL 崩溃时重启
        mVehicle.linkToDeath(mVehicleDeathRecipient);

        // 5. 注册到 ServiceManager,服务名为 "car_service"
        ServiceManagerHelper.addService("car_service", mICarImpl);
    }
}

启动流程:

System Server 启动
    ↓
CarServiceImpl.onCreate()
    ↓
连接 Vehicle HAL
    ↓
创建 ICarImpl(包含所有子服务)
    ↓
初始化所有服务
    ↓
注册到 ServiceManager ("car_service")
    ↓
服务准备就绪,接受客户端请求

2. ICarImpl 核心实现

2.1 ICarImpl 架构

文件位置: packages/services/Car/service/src/com/android/car/ICarImpl.java

ICarImpl 是 CarService 的核心,实现了 ICar.aidl 接口,管理着 30+ 个子服务。

public class ICarImpl extends ICar.Stub {

    // Vehicle HAL 抽象层
    private final VehicleHal mHal;

    // 核心服务
    private final CarOemProxyService mCarOemService;
    private final CarPropertyService mCarPropertyService;
    private final CarPowerManagementService mCarPowerManagementService;
    private final CarUserService mCarUserService;
    private final CarAudioService mCarAudioService;
    private final CarInputService mCarInputService;
    private final CarDrivingStateService mCarDrivingStateService;
    private final CarUxRestrictionsManagerService mCarUXRestrictionsService;
    private final CarOccupantZoneService mCarOccupantZoneService;
    private final CarPackageManagerService mCarPackageManagerService;
    // ... 更多服务

    // 所有服务的初始化顺序
    private final CarSystemService[] mAllServicesInInitOrder;
}

2.2 服务创建流程

ICarImpl 使用 Builder 模式创建所有服务:

private ICarImpl(Builder builder) {
    List<CarSystemService> allServices = new ArrayList<>(40);

    // 1. 创建 VehicleHal(基础层)
    mHal = constructWithTrace(t, VehicleHal.class,
            () -> new VehicleHal(mContext, builder.mVehicle), allServices);

    // 2. 创建 CarPropertyService(依赖 VehicleHal)
    mCarPropertyService = constructWithTrace(
            t, CarPropertyService.class,
            () -> new CarPropertyService.Builder()
                    .setContext(mContext)
                    .setPropertyHalService(mHal.getPropertyHal())
                    .build(), allServices);

    // 3. 创建 CarDrivingStateService(依赖 CarPropertyService)
    mCarDrivingStateService = constructWithTrace(
            t, CarDrivingStateService.class,
            () -> new CarDrivingStateService(mContext, mCarPropertyService), allServices);

    // 4. 创建 CarUXRestrictionsService(依赖前述服务)
    mCarUXRestrictionsService = constructWithTrace(t, CarUxRestrictionsManagerService.class,
            () -> new CarUxRestrictionsManagerService(mContext, mCarDrivingStateService,
                    mCarPropertyService, mCarOccupantZoneService), allServices);

    // 5. 创建 CarAudioService
    mCarAudioService = constructWithTrace(t, CarAudioService.class,
            () -> new CarAudioService(mContext), allServices);

    // ... 创建其他 30+ 服务

    // 保存初始化顺序
    mAllServicesInInitOrder = allServices.toArray(new CarSystemService[allServices.size()]);
}

关键点:

  • 使用 constructWithTrace 包装,每个服务初始化都有性能追踪
  • 服务间通过构造函数传递依赖
  • 按依赖顺序创建,确保依赖服务先创建

2.3 init() 初始化流程

@MainThread
void init() {
    // 1. 优先初始化关键服务(如果在构造中未执行)
    if (!mDoPriorityInitInConstruction) {
        priorityInit();
    }

    // 2. 按顺序初始化所有服务
    for (CarSystemService service : mAllServicesInInitOrder) {
        service.init();
    }

    // 3. 标记服务准备就绪
    ready();
}

priorityInit() - 优先初始化:

private void priorityInit() {
    // VehicleHal 必须先初始化
    mHal.init();

    // CarUserService 需要早期初始化以设置启动用户
    mCarUserService.init();
}

3. CarManager 获取流程

3.1 Car 类入口

文件位置: packages/services/Car/car-lib/src/android/car/Car.java

应用通过 Car 类获取各种 Manager:

// 创建 Car 实例
Car car = Car.createCar(context);

// 获取 CarAudioManager
CarAudioManager audioManager = car.getCarManager(CarAudioManager.class);

// 或通过服务名称获取(不推荐)
CarAudioManager audioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);

3.2 getCarManager 源码分析

public Object getCarManager(String serviceName) {
    CarManagerBase manager;
    synchronized (mLock) {
        // 1. 检查 CarService 是否连接
        if (mService == null) {
            return null;
        }

        // 2. 从缓存获取
        manager = mServiceMap.get(serviceName);
        if (manager == null) {
            try {
                // 3. 向 CarService 请求服务 Binder
                IBinder binder = mService.getCarService(serviceName);
                if (binder == null) {
                    return null;
                }

                // 4. 创建 Manager 实例
                manager = createCarManagerLocked(serviceName, binder);

                // 5. 缓存 Manager
                mServiceMap.put(serviceName, manager);
            } catch (RemoteException e) {
                handleRemoteExceptionFromCarService(e);
            }
        }
    }
    return manager;
}

3.3 createCarManagerLocked - Manager 创建

private CarManagerBase createCarManagerLocked(String serviceName, IBinder binder) {
    CarManagerBase manager = null;
    switch (serviceName) {
        case AUDIO_SERVICE:
            manager = new CarAudioManager(this, binder);
            break;
        case POWER_SERVICE:
            manager = new CarPowerManager(this, binder);
            break;
        case PROPERTY_SERVICE:
            manager = new CarPropertyManager(this, ICarProperty.Stub.asInterface(binder));
            break;
        case CAR_USER_SERVICE:
            manager = new CarUserManager(this, binder);
            break;
        case CAR_OCCUPANT_ZONE_SERVICE:
            manager = new CarOccupantZoneManager(this, binder);
            break;
        // ... 更多服务

        default:
            // 支持实验性服务,通过反射创建
            String className = mService.getCarManagerClassForFeature(serviceName);
            if (className != null) {
                manager = constructCarManager(className, binder);
            }
            break;
    }
    return manager;
}

4. CarManager 调用流程

4.1 完整调用链

以设置音频音量为例:

应用层
    │
    │ CarAudioManager.setVolume(volume)
    ▼
CarManager (Client)
    │
    │ ICarAudio.setVolume(volume)  // AIDL 调用
    ▼
CarService (ICarImpl)
    │
    │ CarAudioService.setVolume(volume)
    ▼
CarAudioService 内部处理
    │
    │ PropertyHalService.setProperty()
    ▼
VehicleHal
    │
    │ VehicleStub.set()  // Binder 调用
    ▼
Vehicle HAL (厂商实现)
    │
    │ 硬件操作
    ▼
音频硬件

4.2 CarAudioManager 示例

文件位置: packages/services/Car/car-lib/src/android/car/media/CarAudioManager.java

public class CarAudioManager extends CarManagerBase {

    private final ICarAudio mService;

    public CarAudioManager(Car car, IBinder service) {
        super(car);
        mService = ICarAudio.Stub.asInterface(service);
    }

    public void setVolume(int groupId, int flags, int volumeIndex) {
        try {
            mService.setVolume(groupId, flags, volumeIndex);
        } catch (RemoteException e) {
            handleRemoteException(e);
        }
    }

    public int getVolume(int groupId) {
        try {
            return mService.getVolume(groupId);
        } catch (RemoteException e) {
            return handleRemoteExceptionAndReturn(e, /* defaultValue */ 0);
        }
    }
}

4.3 CarAudioService 实现

文件位置: packages/services/Car/service/src/com/android/car/audio/CarAudioService.java

public class CarAudioService extends ICarAudio.Stub implements CarSystemService {

    private final PropertyHalService mPropertyHal;

    @Override
    public void setVolume(int groupId, int flags, int volumeIndex) {
        // 1. 权限检查
        enforcePermission();

        // 2. 查找音频组
        CarVolumeGroup volumeGroup = mCarAudio Zones.getVolumeGroup(groupId);

        // 3. 设置音量
        volumeGroup.setGainIndex(volumeIndex);

        // 4. 更新车辆属性
        int volumeProperty = getVolumePropertyForGroup(groupId);
        mPropertyHal.setIntProperty(volumeProperty, 0, volumeIndex);
    }

    @Override
    public int getVolume(int groupId) {
        // 1. 查找音频组
        CarVolumeGroup volumeGroup = mCarAudioZones.getVolumeGroup(groupId);

        // 2. 返回当前音量
        return volumeGroup.getGainIndex();
    }
}

5. VehicleHal 层

5.1 VehicleHal 架构

文件位置: packages/services/Car/service/src/com/android/car/hal/VehicleHal.java

VehicleHal 是与 Vehicle HAL 通信的抽象层。

public class VehicleHal implements VehicleHalCallback, CarSystemService {

    // VehicleStub - 直接与 VHAL 通信
    private final VehicleStub mVehicleStub;

    // HAL 服务集合
    private final PowerHalService mPowerHal;
    private final PropertyHalService mPropertyHal;
    private final InputHalService mInputHal;
    private final UserHalService mUserHal;
    // ... 更多 HAL 服务

    // 属性处理器映射:PropertyId -> HalServiceBase
    private final SparseArray<HalServiceBase> mPropertyHandlers;

    // 所有支持的属性
    private final SparseArray<HalPropConfig> mAllProperties;
}

5.2 属性设置流程

// 应用层调用
carPropertyManager.setIntProperty(PropertyId, areaId, value);

    ↓

// CarPropertyManager
mService.setIntProperty(propId, areaId, value);

    ↓

// CarPropertyService
public void setIntProperty(int propId, int areaId, int value) {
    // 1. 创建属性值
    HalPropValue propValue = mHal.getPropValueBuilder()
            .build(propId, areaId, value);

    // 2. 发送到 VehicleHal
    mHal.set(propValue);
}

    ↓

// VehicleHal
public void set(HalPropValue value) {
    int propId = value.getInt32(HalPropValue.HAL_PROP_ID);

    // 查找对应的 HAL 服务
    HalServiceBase handler = mPropertyHandlers.get(propId);
    if (handler != null) {
        handler.setProperty(value);
    }
}

    ↓

// PropertyHalService
public void setProperty(HalPropValue value) {
    // 发送到 VHAL
    mVehicleStub.set(value);
}

    ↓

// Vendor Vehicle HAL
// 厂商实现,操作硬件

5.3 事件订阅流程

// 应用层注册回调
carPropertyManager.registerListener(callback, PropertyId, rateHz);

    ↓

// CarPropertyManager
mService.subscribeProperty(token, propId, rateHz);

    ↓

// CarPropertyService
public void subscribeProperty(int token, int propId, float rateHz) {
    HalSubscribeOptions options = new HalSubscribeOptions(propId, areaIds, rateHz);
    mHal.subscribe(options);
}

    ↓

// VehicleHal
public void subscribe(HalSubscribeOptions... options) {
    // 1. 分配处理器
    for (HalSubscribeOptions option : options) {
        HalServiceBase handler = findHandlerForProp(option.getHalPropId());
        mPropertyHandlers.put(option.getHalPropId(), handler);
    }

    // 2. 发送订阅到 VHAL
    mSubscriptionClient.subscribe(convertToSubscribeOptions(options));
}

    ↓

// VHAL 订阅

    ↓

// 属性变化事件回调
VehicleHal.onPropertyEvent(values)
    → handler.handleHalEvents(values)
    → CarPropertyService.notifyPropertyEvent()
    → ICarPropertyCallback.onEvent()
    → 应用层回调

6. 主要 CarManager 列表

Manager服务名称功能必需/可选
CarAudioManagerAUDIO_SERVICE音频路由、音量控制必需
CarPowerManagerPOWER_SERVICE电源状态管理必需
CarPropertyManagerPROPERTY_SERVICE车辆属性读写必需
CarInputManagerCAR_INPUT_SERVICE输入事件处理必需
CarUserManagerCAR_USER_SERVICE用户切换管理必需
CarDrivingStateManagerCAR_DRIVING_STATE_SERVICE驾驶状态必需
CarUxRestrictionsManagerCAR_UX_RESTRICTION_SERVICEUX 限制必需
CarOccupantZoneManagerCAR_OCCUPANT_ZONE_SERVICE乘员区域必需
CarPackageManagerPACKAGE_SERVICE应用包管理必需
CarHvacManagerHVAC_SERVICE空调控制可选
CarCabinManagerCABIN_SERVICE车厢控制可选
CarDiagnosticManagerDIAGNOSTIC_SERVICE诊断信息可选
CarInstrumentClusterManagerCAR_INSTRUMENT_CLUSTER_SERVICE仪表盘可选
CarEvsManagerCAR_EVS_SERVICE环视可选

7. 常用调试命令

查看 CarService 状态

adb shell dumpsys car_service

查看特定服务

adb shell dumpsys car_service CarAudioService
adb shell dumpsys car_service CarPropertyService

查看 VHAL 属性

adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/default

查看事件日志

adb logcat -b events | grep car

8. 总结

CarService 核心职责

  1. 管理所有汽车相关服务(30+ 个子服务)
  2. 提供 Binder 接口给客户端
  3. 与 Vehicle HAL 交互
  4. 处理车辆属性和事件

CarManager 核心职责

  1. 封装 Binder 通信细节
  2. 提供类型安全的 API
  3. 管理服务连接状态
  4. 缓存 Manager 实例

架构设计优点

  • 分层清晰:API -> Manager -> Service -> HAL
  • 模块化:每个服务独立,易于维护
  • 权限控制:在 Service 层统一检查权限
  • 性能优化:Manager 缓存,避免重复创建

关键文件位置

Car API:         packages/services/Car/car-lib/
Car Service:     packages/services/Car/service/
VehicleHal:      packages/services/Car/service/src/com/android/car/hal/
Vehicle HAL:     hardware/interfaces/automotive/vehicle/

原文地址:
https://mp.weixin.qq.com/s/UzbVnzCaTFebyXgYulc7bQ

深入解析AAOS核心服务:CarService架构与关键功能实现 本文深入解析了Android Automotive OS(AAOS)中的核心服务CarService架构与关键功能实现。详细介绍了CarService的模块化设计、启动流程及与车辆HAL的交互机制,并提供了Car API的实战应用指南和调试技巧,帮助开发者更好地理解和应用AAOS的汽车服务功能。 阅读详情

相关推荐

Android车载应用开发与分析(1) - Android Automotive概述与编译

在智能手机行业初兴起时,包括BAT在内许多传统互联网企业都曾布局手机产业,但是随着手机市场的基本定型,造车似乎又成了各大资本下一个追逐的方向。百度、小米先后宣布造车,阿里巴巴则与上汽集团共同投资创立了,面向汽车全行业提供智能汽车操作系统和智能网联汽车整体解决方案的斑马网络,一时间造车俨然成了资本市场的下一个风口。 而作为移动端操作系统的霸主 - Android,也以一种新的姿态高调侵入造车领域,这就是 Android 车载信息娱乐系统 - Android Automoti...

linkwj的博客 1万+

Android 车载应用开发指南 - CarService 详解(上)

CarService 是车载 Android 操作系统 Android Automotive OS(下文简介 AAOS)的核心服务之一,所有车载相关的应用都需要通过 CarService 来查询、控制整车的状态,不仅仅是车辆控制,实际上 CarService 几乎就是整个车载 Framework 最核心的组件。

伤心的辣条 1078

Android Automotive车载嵌入式系统

一、Android Auto Android Auto是一个Android端的App,是专门为驾驶环境而设计的,把手机的部分功能通过数据线连接,影射到汽车屏幕上。目前,支持Android Auto的应用比较少。主要是是两类第三方应用,第一个是音视频类,第二个是消息类。相关应用的开发没有深入探索,有机会研究研究。 二、Android Automotive 上面介绍Android Auto是手机为中心,通过数据线连接汽车。这种模型既有好处,也有坏处。好处是:数据和应用始终是一...

qq_45660008的博客 3469

【车载audio】【CarAudioService 02】【主动获取音量大小流程分析】

本文分析了CarAudioManager.getGroupVolume接口的实现原理。当应用调用该接口获取音量时,会跨进程调用CarAudioService,通过zoneId和groupId找到对应的CarVolumeGroup对象,最终返回其mCurrentGainIndex值。同时,手动设置音量时也会更新这个变量。要实现CAN总线音量同步,只需将CAN信号对应的音量值更新到CarVolumeGroup.mCurrentGainIndex中,应用就能通过getGroupVolume获取最新值。整个流程涉及

奔跑吧 android 的博客 471

AndroidAutomotive:安卓汽车源代码学习

Android汽车 仅用于交流学习

InternVL 3.5 深度解析:开源多模态模型的新里程碑

InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不

m0_47999117的博客 1031

【IVI】CarService启动-Android13

【IVI】CarService启动中绑定CarServiceICarImpl初始化各种服务。

许浑的博客 768

Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明

Utrust4701F与Utrust2700R读写器支持银河麒麟系统,广泛应用会员管理、支付管理等领域。本文将重点介绍Utrust4701F与Utrust2700R读写器在银河麒麟系统的安装及测试步骤说明。以上方法适用于主流国产操作系统,如 优麒麟(UbuntuKylin)/ 中标麒麟(NeoKylin) / UOS(统信操作系统)/ 中兴新支点 / 红旗 linux(redflag linux)/ 普华 Linux(I-soft OS) / 威科乐恩 Linux(WiOS)等

华翔天诚科技 1834

【Android R】车载 Android 核心服务 - CarPropertyService 解析

对比开发车载Android和手机Android应用,最大的区别应该就是许多车载应用需要考虑汽车整体的运行状态,例如,控制车载空调或车速达到一定的阈值时,出于安全的...

linkwj的博客 5136

下载Python3.10的相关方法及问题解决

下载Python3.10的相关方法及问题解决 报错unable to locate package python3.10-dev以及subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决

Istil 1555

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 742

CarAppContext 深度解析

的核心上下文对象,属于 CarFramework 的关键组件。它专门针对车载场景扩展了 Android 的标准 Context 功能,是开发车载应用的基础入口。CarAppContext 是车载应用开发的基础环境对象,正确理解其特性和使用场景,是构建符合车辆规范应用的关键前提。CarAppContext 是 Android Automotive OS (AAOS) 中用于。避免在CarAppContext中保存大数据(可能被系统回收)缺少车辆服务绑定(如。无法感知驾驶限制状态。

斗锋在干嘛的博客 745

【雕爷学编程】Arduino智能家居之DS18B20温度传感器

1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。这意味着用户可以根据自己的需求和创意,自定义和定制智能家居系统的功能和外观。5、能源管理:Arduino可以与电能监测模块和智能插座等设备结合使用,实时监测家庭能源的使用情况,并通过自动控制电器设备的开关,实现能源的有效管理和节约。

雕爷学编程 2876

Android车载操作系统(Android Auto/Android Automotive)

目录 Android Auto 核心功能 Google Assistant 兼容的车型和应用 App 开发 设计 无线 Android Automotive 版本演进 源码与架构 Car App Car API Car Service Car Tool VMS EVS ODB2 Vehicle Network Service HAL HAL接口 属性与区域 处理区域属性举例 结束语 参考资料与推荐读物 Android Auto Android Auto是

huhuancainiao的博客 4792

i茅台最新任务python脚本

从固定的 `header_context` 生成HTTP请求头,并加入用户的`userId`、`MT-Token`等动态信息,以模仿真实的请求。- 发送预约请求,提交商品和门店的参数,如 `sessionId`、`shopId`、`itemId` 等。- 定时任务:通过 `cron` 表达式 `0 0 9/21 * * *`,表示每月的9日和21日的0点执行。- `login`:使用验证码进行登录,并返回 `token` 和 `userId`。- 获取北京时间当天0点的时间戳,作为预约请求的时间参数。

三维点云技术探索 987

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21

【WRF数据准备】土地利用类型分类标准:USGS+MODIS IGBP 21

WW、forever的博客 4477

Android Automotive 源码下载、编译、虚拟机

#Android源码下载、编译、虚拟机 安装Repo工具 配置Git信息 1.2 源码下载 创建工程目录 初始化仓库修改repo地址,将 ~/bin/repo 中的地址 修改为: 查看安装官网,确定具体版本对应的tag 同步代码由于网络不稳定,sync容易中断,创建sync.sh 脚本添加运行权限 运行脚本 1.3 源码编译 2,虚拟机 先用AvdManager创建一个虚拟机 android11-car准备虚拟机必备文件: 创建release脚本,执......

jincy1的博客 2247

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1461

【车载开发】Android Automotive车载操作系统开发解密篇

传统的车载功能单一,无太多娱乐性,而随着智能化时代的发展,车载系统也被赋予了在系统中预装 Android 应用的能力,基于Android平台的车载信息娱乐系统——Android Automotive应运而生。而今,包括BAT在内许多传统互联网企业纷纷布局手机产业,追逐新能源造车浪潮,大量的Android开发从业者,也开始转战车载,这不仅降低的IVI系统以及应用的开发成本,也为开发人员提供了更多岗位与出路。(附赠Android Framewrok开发揭秘),帮助大家快速入门车载,深入底层原理!

bugyinyin的博客 1013

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android Car automotive解析

--------本文摘自google官方关于automotive架构讲解内容。转载请注明出处。--------- 借助各种总线拓扑,很多汽车子系统都可以实现互连以及与车载信息娱乐 (IVI) 系统的连接。不同的制造商提供的确切总线类型和协议之间有很大差异(甚至同一品牌的不同车型之间也是如此),例如控制器区域网络 (CAN) 总线、局域互联网络 (LIN) 总线、面向媒体的系统传输 ...

小码农大理想 3615

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android8.1 autoMotive 源码下载、编译、运行、更改后运行(linux)个人记录

一、下载源码 1.安装repo https://blog.youkuaiyun.com/liujunpen/article/details/72326635,并且将/.bin/repo 的第8行REPO_URL修改为https://gerrit-google.tuna.tsinghua.edu.cn/git-repo 2.从清 华大学aosp下载源码:        mkdir aosp     cd...

不多说的博客 2215

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

automotive 安卓开发_从源代码构建Android Automotive

TL;DRAfter building Android Automotive from source, how do IRun the car-emulator?"Install" the CarService and related packages onto a device?DetailsI'm trying to build Android Automotive from source. ...

weixin_31589331的博客 767

Android Visualizer 实战:把声音画出来

是系统提供的音频效果(AudioEffect)之一。它挂在音频链路上,,把数据回吐给你——画波形、画频谱、做响度表。

Android的专栏 309

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 340

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 206
上一篇: 分享Claude进行AI编程的相关技巧及程序员未来发展方向
下一篇: 台湾framework学员疑问:如何通过进程名映射出对应源码路径?
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值