1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 #ifndef ANDROID_VINTF_HAL_MANIFEST_H 19 #define ANDROID_VINTF_HAL_MANIFEST_H 20 21 #include <utils/Errors.h> 22 #include <map> 23 #include <string> 24 #include <vector> 25 26 #include "HalGroup.h" 27 #include "Level.h" 28 #include "ManifestHal.h" 29 #include "ManifestInstance.h" 30 #include "MapValueIterator.h" 31 #include "SchemaType.h" 32 #include "SystemSdk.h" 33 #include "VendorNdk.h" 34 #include "Version.h" 35 #include "Vndk.h" 36 #include "XmlFileGroup.h" 37 38 namespace android { 39 namespace vintf { 40 41 struct MatrixHal; 42 struct CompatibilityMatrix; 43 44 namespace details { 45 using InstancesOfVersion = 46 std::map<std::string /* interface */, std::set<std::string /* instance */>>; 47 using Instances = std::map<Version, InstancesOfVersion>; 48 } // namespace details 49 50 // A HalManifest is reported by the hardware and query-able from 51 // framework code. This is the API for the framework. 52 struct HalManifest : public HalGroup<ManifestHal>, public XmlFileGroup<ManifestXmlFile> { 53 public: 54 55 // Construct a device HAL manifest. 56 HalManifest() : mType(SchemaType::DEVICE) {} 57 58 bool add(ManifestHal&& hal) override; 59 60 // Given a component name (e.g. "android.hardware.camera"), 61 // return getHal(name)->transport if the component exist and v exactly matches 62 // one of the versions in that component, else EMPTY 63 Transport getTransport(const std::string &name, const Version &v, 64 const std::string &interfaceName, const std::string &instanceName) const; 65 66 // Check compatibility against a compatibility matrix. Considered compatible if 67 // - framework manifest vs. device compat-mat 68 // - checkIncompatibility for HALs returns only optional HALs 69 // - one of manifest.vndk match compat-mat.vndk 70 // - device manifest vs. framework compat-mat 71 // - checkIncompatibility for HALs returns only optional HALs 72 // - manifest.sepolicy.version match one of compat-mat.sepolicy.sepolicy-version 73 bool checkCompatibility(const CompatibilityMatrix &mat, std::string *error = nullptr) const; 74 75 // Generate a compatibility matrix such that checkCompatibility will return true. 76 CompatibilityMatrix generateCompatibleMatrix() const; 77 78 // Returns all component names. 79 std::set<std::string> getHalNames() const; 80 81 // Returns all component names and versions, e.g. 82 // "android.hardware.camera.device (at) 1.0", "android.hardware.camera.device (at) 3.2", 83 // "android.hardware.nfc (at) 1.0"] 84 std::set<std::string> getHalNamesAndVersions() const; 85 86 // Type of the manifest. FRAMEWORK or DEVICE. 87 SchemaType type() const; 88 void setType(SchemaType type); 89 90 // FCM version that it implements. 91 Level level() const; 92 93 // device.mSepolicyVersion. Assume type == device. 94 // Abort if type != device. 95 const Version &sepolicyVersion() const; 96 97 // framework.mVendorNdks. Assume type == framework. 98 // Abort if type != framework. 99 const std::vector<VendorNdk>& vendorNdks() const; 100 101 // If the corresponding <xmlfile> with the given version exists, 102 // - Return the overridden <path> if it is present, 103 // - otherwise the default value: /{system,vendor}/etc/<name>_V<major>_<minor>.xml 104 // Otherwise if the <xmlfile> entry does not exist, "" is returned. 105 std::string getXmlFilePath(const std::string& xmlFileName, const Version& version) const; 106 107 // Get metaversion of this manifest. 108 Version getMetaVersion() const; 109 110 bool forEachInstanceOfVersion( 111 const std::string& package, const Version& expectVersion, 112 const std::function<bool(const ManifestInstance&)>& func) const override; 113 114 // Alternative to forEachInstance if you just need a set of instance names instead. 115 std::set<std::string> getInstances(const std::string& halName, const Version& version, 116 const std::string& interfaceName) const; 117 118 // Return whether instance is in getInstances(...). 119 bool hasInstance(const std::string& halName, const Version& version, 120 const std::string& interfaceName, const std::string& instance) const; 121 122 protected: 123 // Check before add() 124 bool shouldAdd(const ManifestHal& toAdd) const override; 125 bool shouldAddXmlFile(const ManifestXmlFile& toAdd) const override; 126 127 private: 128 friend struct HalManifestConverter; 129 friend class VintfObject; 130 friend class AssembleVintfImpl; 131 friend struct LibVintfTest; 132 friend std::string dump(const HalManifest &vm); 133 friend bool operator==(const HalManifest &lft, const HalManifest &rgt); 134 135 status_t fetchAllInformation(const std::string& path, std::string* error = nullptr); 136 137 details::Instances expandInstances(const std::string& name) const; 138 // Check if all instances in matrixHal is supported in this manifest. 139 bool isCompatible(const details::Instances& instances, const MatrixHal& matrixHal) const; 140 141 // Return a list of error messages (for each <hal> name) that does NOT conform to 142 // the given compatibility matrix. It does not contain components that are optional. 143 // That is, return empty list iff 144 // (instance in matrix) => (instance in manifest). 145 std::vector<std::string> checkIncompatibleHals(const CompatibilityMatrix& mat) const; 146 147 void removeHals(const std::string& name, size_t majorVer); 148 149 // Returns a list of instance names that are in this manifest but 150 // are not specified in the given matrix, whether the HAL is specified as an optional or 151 // required HAL. 152 // That is, return empty list iff 153 // (instance in manifest) => (instance in matrix). 154 std::set<std::string> checkUnusedHals(const CompatibilityMatrix& mat) const; 155 156 SchemaType mType; 157 Level mLevel = Level::UNSPECIFIED; 158 // version attribute. Default is 1.0 for manifests created programatically. 159 Version mMetaVersion{1, 0}; 160 161 // entries for device hal manifest only 162 struct { 163 Version mSepolicyVersion; 164 } device; 165 166 // entries for framework hal manifest only 167 struct { 168 #pragma clang diagnostic push 169 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 170 std::vector<Vndk> mVndks; 171 #pragma clang diagnostic pop 172 173 std::vector<VendorNdk> mVendorNdks; 174 SystemSdk mSystemSdk; 175 } framework; 176 }; 177 178 179 } // namespace vintf 180 } // namespace android 181 182 #endif // ANDROID_VINTF_HAL_MANIFEST_H 183