public PropertyHalService(VehicleHal vehicleHal) { mPropIds = new PropertyHalServiceIds(); mSubscribedHalPropIds = new HashSet<Integer>(); mVehicleHal = vehicleHal;}在PropertyHalServiceIds的构造方法中,将每个属性对应必要的权限举行了逐一关联,生存在一个SparseArray中。
那么接下来我们以getProperty()方法为例,看一下是怎样限定无权限应用的调用的。
@Overridepublic CarPropertyValue getProperty(int prop, int zone) { ... ICarImpl.assertPermission(mContext, mHal.getReadPermission(prop)); return mHal.getProperty(prop, zone);}@Nullablepublic String getReadPermission(int mgrPropId) { int halPropId = managerToHalPropId(mgrPropId); return mPropIds.getReadPermission(halPropId);}@Nullablepublic String getReadPermission(int propId) { Pair<String, String> p = mProps.get(propId); if (p != null) { // 属性ID存在。返回 权限。if (p.first == null) { Log.e(TAG, "propId is not available for reading : 0x" + toHexString(propId)); } return p.first; } else if (isVendorProperty(propId)) { // 如果属性是供应商属性,而且没有特定权限。return Car.PERMISSION_VENDOR_EXTENSION; } else { return null; }}getReadPermission的调用链很好懂,告急就是将传入的id与PropertyHalServiceIds中关联好的权限比对,并取出对应的权限字符串。
assertPermission方法会判定调用方是否拥有相应的权限,或本次调用是否是自身发起的,如果不是,则会抛出SecurityException。
#########ICarImpl.java###############public static void assertPermission(Context context, String permission) { if (context.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("requires " + permission); }}setProperty()方法的权限检查与getProperty()方法类似,不外getProperty()方法是检查ReadPermission,setProperty()方法是检查WritePermission。
车辆属性的读取以及操纵必要慎重授权给应用,以是权限控制在车载Android体系中就显得尤为告急。
VehicleHAL
返回全局 VHAL 级错误或每个属性的错误。全局错误会导致 HAL 重新启动,这大概会导致包罗应用在内的其他组件重新启动。
编译VehicleHAL
HIDL接口界说好之后,与AIDL接口一样必要编译更jar提供给Framework的开辟,以下步调是编译原生的VehicleHAL,现实项目中的VehicleHAL一样寻常会放置vendor内里,但是编译方式一样。
cd hardware/interfaces/automotive/vehicle/2.0mma编译好的jar包位于 /out/soong/.intermediates/hardware/interfaces/automotive/vehicle/2.0/android.hardware.automotive.vehicle-V2.0-java/android_common/javac
如下图所示: