项目背景
- 原来在Android 4上开发的App,移植到Android 9中。
- 接收can信号在app中进行处理。
- 原Android的VehicleService被替换,自己service。
软件结构
解释:
1、VehicleService和libVehicle是自己改过的,开机启动。
2、Car-service 是Android原生的,在packages/services/Car/service目录下
编译生成目录out/target/product/hikey970/system/priv-app/CarService/CarService.apk
3、AppFW service 是App 的server, 通过AppFW获取Car-service中的server,在onCreate中
mCarApiClient = Car.createCar(this, mCarConnectionCallback); mCarApiClient.connect();
然后,在CarConnectionCallback 中的onServiceConnected方法中处理结果
4、 Autmotive HALs:位置目录 hardware/interfaces/automotive/
需要注意的地方
- manifast权限配置检查
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.car.permission.CAR_POWERTRAIN" />
<uses-permission android:name="android.car.permission.CAR_VENDOR_EXTENSION" />
<uses-permission android:name="android.car.permission.CAR_SPEED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
tools:ignore="ProtectedPermissions" />
- 在hal 层有config property配置
配置car vehical 支持哪些property,Android 目录文件hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h
const ConfigDeclaration kVehicleProperties[]{
{.config =
{
.prop = toInt(VehicleProperty::INFO_FUEL_CAPACITY),
.access = VehiclePropertyAccess::READ,
.changeMode = VehiclePropertyChangeMode::STATIC,
},
.initialValue = {.floatValues = {15000}}},
{.config =
{
.prop = toInt(VehicleProperty::INFO_FUEL_TYPE),
.access = VehiclePropertyAccess::READ,
.changeMode = VehiclePropertyChangeMode::STATIC,
},
.initialValue = {.int32Values = {1}}},
....
}
- 获取不了car server,大多数都是服务名称错误,或失败不成功,
clean
重新编译。
try {
IBinder binder = service.getCarService(serviceName);
if (binder == null) {
Log.w(CarLibLog.TAG_CAR, "getCarManager could not get binder for service:" +
serviceName);
return null;
}
manager = createCarManager(serviceName, binder);
if (manager == null) {
Log.w(CarLibLog.TAG_CAR,
"getCarManager could not create manager for service:" +
serviceName);
return null;
}
mServiceMap.put(serviceName, manager);
} catch (RemoteException e) {
handleRemoteException(e);
}
网上资料有很多,就不说了。
这里面设计几个Android 技术,binder、aidl什么的,不好懂,其他的感觉也没什么。
感觉Android做的挺好的,按照自己的需求修修补补就好了。
重要的还是要了解Android开发的精髓。