从CarAudioManager调用流程开始学习Vendor Interface(Client部分)

本文通过分析CarAudioManager的初始化、AudioFocus请求和setStreamVolume操作,探讨了Android Vendor Interface的Client部分。重点在于Binder化如何实现模块化,以及系统升级时的便利性。讲解了CarVolumeController、AudioHalService与VehicleHal的交互,揭示了车机控制的底层原理,涉及到车机相关的属性设置,并展示了Java与C++层的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.需求

解决系统升级困难的问题(模块化)

a.以前用.h头文件的形式,各自Vendor有各自的so去实现硬件功能。

现在改成.hal文件的形式(Binder化),类似.aidl.

Thegoal of HIDL is that the framework can be replaced without having torebuild HALs. HALs will be built by vendors or SOC makers and put ina /vendor partitionon the device, enabling the framework, in its own partition, to bereplaced with an OTA without recompiling the HALs.

b.以前的输出打包进system里的一个个so

现在整个Vendor的东西应该是单独的一个啥?是一个vendor.img(里头有so),那么系统升级的时候,system.img就可以单拿出来。不用找各个硬件供应商,就可以用升级过的system.img去做替换升级

如图所示(图画的比较丑,抱歉)
这里写图片描述

这里写图片描述

屁话少说,放码过来。

「Talk is cheap. Show me the code」

RadioDemo中

CarAudioManger的初始化

//从CarService中取出Audio的
mCarAudioManager = (CarAudioManager) mCarApi.getCarManager(android.car.Car.AUDIO_SERVICE);

请求AudioFocus

mCarAudioManager.requestAudioFocus(this, mRadioAudioAttributes,AudioManager.AUDIOFOCUS_GAIN, 0);
//requestAudioFocus@CarAudioManger
mAudioManager.requestAudioFocus

好吧,和普通手机的一样,本集终!

看看最常用的setStreamVolume吧

mCarAudioManager.setStreamVolume(mStreamType, progress, AudioManager.FLAG_PLAY_SOUND);
//setStreamVolume@CarAudioService.java
//检查Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME权限
enforceAudioVolumePermission();
mVolumeService.setStreamVolume(streamType, index, flags);

//setStreamVolume@CarVolumeService
getController().setStreamVolume(streamType, index, flags);
//工厂
mCarVolumeController = CarVolumeControllerFactory.createCarVolumeController(mContext,mAudioService, mAudioHal, mInputService);

CarVolumeController是CarVolumeService的内部类

CarVolumeControl

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值