项目背景

  1. 原来在Android 4上开发的App,移植到Android 9中。
  2. 接收can信号在app中进行处理。
  3. 原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/

需要注意的地方

  1. 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" />
  1. 在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}}},     ....     }
  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开发的精髓。

更多相关文章

  1. Android微信登录(shareSDK)注意事项
  2. Android开发基础(2.2)--利用NDK搭建自己的Android交叉工具链
  3. Android下的Hook初探
  4. Android获取屏幕分辨率及DisplayMetrics简介
  5. Android(安卓)NDK编程中Application.mk和Android.mk写法
  6. Android(安卓)文件路径详解
  7. 获取Android短信草稿箱号码为空的解决办法
  8. Android的反编译和代码混淆
  9. 传感器使用简介

随机推荐

  1. Android 如何获取keyboard和TP消息 分享
  2. 升级Android(安卓)Sdk Tools时遇到Failed
  3. Android常用屏幕适配方式
  4. Android(安卓)SDK版本号和名称对应表
  5. Android中RelativeLayout布局各个xml相对
  6. Android序列化Parcelable
  7. 引入布局
  8. android之SharedPreferences
  9. Android闪光灯的打开与关闭
  10. 关于Android(安卓)Studio安装完后activit