1*70a7ec85SAndroid Build Coastguard Worker /* 2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*70a7ec85SAndroid Build Coastguard Worker * 4*70a7ec85SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*70a7ec85SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*70a7ec85SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*70a7ec85SAndroid Build Coastguard Worker * 8*70a7ec85SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*70a7ec85SAndroid Build Coastguard Worker * 10*70a7ec85SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*70a7ec85SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*70a7ec85SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*70a7ec85SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*70a7ec85SAndroid Build Coastguard Worker * limitations under the License. 15*70a7ec85SAndroid Build Coastguard Worker */ 16*70a7ec85SAndroid Build Coastguard Worker 17*70a7ec85SAndroid Build Coastguard Worker 18*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_HAL_MANIFEST_H 19*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_HAL_MANIFEST_H 20*70a7ec85SAndroid Build Coastguard Worker 21*70a7ec85SAndroid Build Coastguard Worker #include <utils/Errors.h> 22*70a7ec85SAndroid Build Coastguard Worker #include <map> 23*70a7ec85SAndroid Build Coastguard Worker #include <optional> 24*70a7ec85SAndroid Build Coastguard Worker #include <string> 25*70a7ec85SAndroid Build Coastguard Worker #include <vector> 26*70a7ec85SAndroid Build Coastguard Worker 27*70a7ec85SAndroid Build Coastguard Worker #include <hidl/metadata.h> 28*70a7ec85SAndroid Build Coastguard Worker 29*70a7ec85SAndroid Build Coastguard Worker #include "CheckFlags.h" 30*70a7ec85SAndroid Build Coastguard Worker #include "FileSystem.h" 31*70a7ec85SAndroid Build Coastguard Worker #include "HalGroup.h" 32*70a7ec85SAndroid Build Coastguard Worker #include "KernelInfo.h" 33*70a7ec85SAndroid Build Coastguard Worker #include "Level.h" 34*70a7ec85SAndroid Build Coastguard Worker #include "ManifestHal.h" 35*70a7ec85SAndroid Build Coastguard Worker #include "ManifestInstance.h" 36*70a7ec85SAndroid Build Coastguard Worker #include "MapValueIterator.h" 37*70a7ec85SAndroid Build Coastguard Worker #include "SchemaType.h" 38*70a7ec85SAndroid Build Coastguard Worker #include "SystemSdk.h" 39*70a7ec85SAndroid Build Coastguard Worker #include "VendorNdk.h" 40*70a7ec85SAndroid Build Coastguard Worker #include "Version.h" 41*70a7ec85SAndroid Build Coastguard Worker #include "Vndk.h" 42*70a7ec85SAndroid Build Coastguard Worker #include "WithFileName.h" 43*70a7ec85SAndroid Build Coastguard Worker #include "XmlFileGroup.h" 44*70a7ec85SAndroid Build Coastguard Worker #include "constants.h" 45*70a7ec85SAndroid Build Coastguard Worker 46*70a7ec85SAndroid Build Coastguard Worker namespace android { 47*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 48*70a7ec85SAndroid Build Coastguard Worker 49*70a7ec85SAndroid Build Coastguard Worker struct MatrixHal; 50*70a7ec85SAndroid Build Coastguard Worker struct CompatibilityMatrix; 51*70a7ec85SAndroid Build Coastguard Worker 52*70a7ec85SAndroid Build Coastguard Worker namespace details { 53*70a7ec85SAndroid Build Coastguard Worker using InstancesOfVersion = 54*70a7ec85SAndroid Build Coastguard Worker std::map<std::string /* interface */, std::set<std::string /* instance */>>; 55*70a7ec85SAndroid Build Coastguard Worker using Instances = std::map<Version, InstancesOfVersion>; 56*70a7ec85SAndroid Build Coastguard Worker 57*70a7ec85SAndroid Build Coastguard Worker class CheckVintfUtils; 58*70a7ec85SAndroid Build Coastguard Worker class FmOnlyVintfObject; 59*70a7ec85SAndroid Build Coastguard Worker 60*70a7ec85SAndroid Build Coastguard Worker } // namespace details 61*70a7ec85SAndroid Build Coastguard Worker 62*70a7ec85SAndroid Build Coastguard Worker // A HalManifest is reported by the hardware and query-able from 63*70a7ec85SAndroid Build Coastguard Worker // framework code. This is the API for the framework. 64*70a7ec85SAndroid Build Coastguard Worker struct HalManifest : public HalGroup<ManifestHal>, 65*70a7ec85SAndroid Build Coastguard Worker public XmlFileGroup<ManifestXmlFile>, 66*70a7ec85SAndroid Build Coastguard Worker public WithFileName { 67*70a7ec85SAndroid Build Coastguard Worker public: 68*70a7ec85SAndroid Build Coastguard Worker 69*70a7ec85SAndroid Build Coastguard Worker // Construct a device HAL manifest. HalManifestHalManifest70*70a7ec85SAndroid Build Coastguard Worker HalManifest() : mType(SchemaType::DEVICE) {} 71*70a7ec85SAndroid Build Coastguard Worker 72*70a7ec85SAndroid Build Coastguard Worker bool add(ManifestHal&& hal, std::string* error = nullptr); 73*70a7ec85SAndroid Build Coastguard Worker // Move all hals from another HalManifest to this. 74*70a7ec85SAndroid Build Coastguard Worker bool addAllHals(HalManifest* other, std::string* error = nullptr); 75*70a7ec85SAndroid Build Coastguard Worker 76*70a7ec85SAndroid Build Coastguard Worker // Given a component name (e.g. "android.hardware.camera"), 77*70a7ec85SAndroid Build Coastguard Worker // return getHal(name)->transport if the component exist and v exactly matches 78*70a7ec85SAndroid Build Coastguard Worker // one of the versions in that component, else EMPTY 79*70a7ec85SAndroid Build Coastguard Worker Transport getHidlTransport(const std::string& name, const Version& v, 80*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName, 81*70a7ec85SAndroid Build Coastguard Worker const std::string& instanceName) const; 82*70a7ec85SAndroid Build Coastguard Worker 83*70a7ec85SAndroid Build Coastguard Worker // Check compatibility against a compatibility matrix. Considered compatible if 84*70a7ec85SAndroid Build Coastguard Worker // - framework manifest vs. device compat-mat 85*70a7ec85SAndroid Build Coastguard Worker // - checkIncompatibility for HALs returns only optional HALs 86*70a7ec85SAndroid Build Coastguard Worker // - one of manifest.vndk match compat-mat.vndk 87*70a7ec85SAndroid Build Coastguard Worker // - device manifest vs. framework compat-mat 88*70a7ec85SAndroid Build Coastguard Worker // - checkIncompatibility for HALs returns only optional HALs 89*70a7ec85SAndroid Build Coastguard Worker // - manifest.sepolicy.version match one of compat-mat.sepolicy.sepolicy-version 90*70a7ec85SAndroid Build Coastguard Worker bool checkCompatibility(const CompatibilityMatrix& mat, std::string* error = nullptr, 91*70a7ec85SAndroid Build Coastguard Worker CheckFlags::Type flags = CheckFlags::DEFAULT) const; 92*70a7ec85SAndroid Build Coastguard Worker 93*70a7ec85SAndroid Build Coastguard Worker // Generate a compatibility matrix such that checkCompatibility will return true. 94*70a7ec85SAndroid Build Coastguard Worker CompatibilityMatrix generateCompatibleMatrix(bool optional = true) const; 95*70a7ec85SAndroid Build Coastguard Worker 96*70a7ec85SAndroid Build Coastguard Worker // Returns all component names. 97*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getHalNames() const; 98*70a7ec85SAndroid Build Coastguard Worker 99*70a7ec85SAndroid Build Coastguard Worker // Returns all component names and versions, e.g. 100*70a7ec85SAndroid Build Coastguard Worker // "[email protected]", "[email protected]", 101*70a7ec85SAndroid Build Coastguard Worker // "[email protected]"] 102*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getHalNamesAndVersions() const; 103*70a7ec85SAndroid Build Coastguard Worker 104*70a7ec85SAndroid Build Coastguard Worker // Type of the manifest. FRAMEWORK or DEVICE. 105*70a7ec85SAndroid Build Coastguard Worker SchemaType type() const; 106*70a7ec85SAndroid Build Coastguard Worker void setType(SchemaType type); 107*70a7ec85SAndroid Build Coastguard Worker 108*70a7ec85SAndroid Build Coastguard Worker // FCM version that it implements. 109*70a7ec85SAndroid Build Coastguard Worker Level level() const; 110*70a7ec85SAndroid Build Coastguard Worker 111*70a7ec85SAndroid Build Coastguard Worker // device.mSepolicyVersion. Assume type == device. 112*70a7ec85SAndroid Build Coastguard Worker // Abort if type != device. 113*70a7ec85SAndroid Build Coastguard Worker const SepolicyVersion& sepolicyVersion() const; 114*70a7ec85SAndroid Build Coastguard Worker 115*70a7ec85SAndroid Build Coastguard Worker // framework.mVendorNdks. Assume type == framework. 116*70a7ec85SAndroid Build Coastguard Worker // Abort if type != framework. 117*70a7ec85SAndroid Build Coastguard Worker const std::vector<VendorNdk>& vendorNdks() const; 118*70a7ec85SAndroid Build Coastguard Worker 119*70a7ec85SAndroid Build Coastguard Worker // If the corresponding <xmlfile> with the given version exists, 120*70a7ec85SAndroid Build Coastguard Worker // - Return the overridden <path> if it is present, 121*70a7ec85SAndroid Build Coastguard Worker // - otherwise the default value: /{system,vendor}/etc/<name>_V<major>_<minor>.xml 122*70a7ec85SAndroid Build Coastguard Worker // Otherwise if the <xmlfile> entry does not exist, "" is returned. 123*70a7ec85SAndroid Build Coastguard Worker std::string getXmlFilePath(const std::string& xmlFileName, const Version& version) const; 124*70a7ec85SAndroid Build Coastguard Worker 125*70a7ec85SAndroid Build Coastguard Worker // Alternative to forEachInstance if you just need a set of instance names instead. 126*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getHidlInstances(const std::string& package, const Version& version, 127*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName) const; 128*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getAidlInstances(const std::string& package, size_t version, 129*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName) const; 130*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getAidlInstances(const std::string& package, 131*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName) const; 132*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getNativeInstances(const std::string& package) const; 133*70a7ec85SAndroid Build Coastguard Worker 134*70a7ec85SAndroid Build Coastguard Worker // Return whether instance is in getHidlInstances(...). 135*70a7ec85SAndroid Build Coastguard Worker bool hasHidlInstance(const std::string& package, const Version& version, 136*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName, const std::string& instance) const; 137*70a7ec85SAndroid Build Coastguard Worker 138*70a7ec85SAndroid Build Coastguard Worker // Return whether a given AIDL instance is in this manifest with version >= the given version. 139*70a7ec85SAndroid Build Coastguard Worker bool hasAidlInstance(const std::string& package, size_t version, 140*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName, const std::string& instance) const; 141*70a7ec85SAndroid Build Coastguard Worker 142*70a7ec85SAndroid Build Coastguard Worker // Return whether a given AIDL instance is in this manifest with any version. 143*70a7ec85SAndroid Build Coastguard Worker bool hasAidlInstance(const std::string& package, const std::string& interfaceName, 144*70a7ec85SAndroid Build Coastguard Worker const std::string& instance) const; 145*70a7ec85SAndroid Build Coastguard Worker 146*70a7ec85SAndroid Build Coastguard Worker // Return whether a given native instance is in getNativeInstances(...). 147*70a7ec85SAndroid Build Coastguard Worker bool hasNativeInstance(const std::string& package, const std::string& instance) const; 148*70a7ec85SAndroid Build Coastguard Worker 149*70a7ec85SAndroid Build Coastguard Worker // Insert the given instance. After inserting it, the instance will be available via 150*70a7ec85SAndroid Build Coastguard Worker // forEachInstance* functions. This modifies the manifest. 151*70a7ec85SAndroid Build Coastguard Worker // Return whether this operation is successful. 152*70a7ec85SAndroid Build Coastguard Worker bool insertInstance(const FqInstance& fqInstance, Transport transport, Arch arch, HalFormat fmt, 153*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 154*70a7ec85SAndroid Build Coastguard Worker 155*70a7ec85SAndroid Build Coastguard Worker // Add everything from another manifest. If no errors (return true), it is guaranteed 156*70a7ec85SAndroid Build Coastguard Worker // that other->empty() == true after execution. 157*70a7ec85SAndroid Build Coastguard Worker [[nodiscard]] bool addAll(HalManifest* other, std::string* error = nullptr); 158*70a7ec85SAndroid Build Coastguard Worker 159*70a7ec85SAndroid Build Coastguard Worker protected: 160*70a7ec85SAndroid Build Coastguard Worker // Check before add() 161*70a7ec85SAndroid Build Coastguard Worker bool shouldAdd(const ManifestHal& toAdd, std::string* error) const; 162*70a7ec85SAndroid Build Coastguard Worker bool shouldAddXmlFile(const ManifestXmlFile& toAdd) const override; 163*70a7ec85SAndroid Build Coastguard Worker 164*70a7ec85SAndroid Build Coastguard Worker bool forEachInstanceOfVersion( 165*70a7ec85SAndroid Build Coastguard Worker HalFormat format, ExclusiveTo exclusiveTo, const std::string& package, 166*70a7ec85SAndroid Build Coastguard Worker const Version& expectVersion, 167*70a7ec85SAndroid Build Coastguard Worker const std::function<bool(const ManifestInstance&)>& func) const override; 168*70a7ec85SAndroid Build Coastguard Worker 169*70a7ec85SAndroid Build Coastguard Worker bool forEachNativeInstance(const std::string& package, 170*70a7ec85SAndroid Build Coastguard Worker const std::function<bool(const ManifestInstance&)>& func) const; 171*70a7ec85SAndroid Build Coastguard Worker 172*70a7ec85SAndroid Build Coastguard Worker private: 173*70a7ec85SAndroid Build Coastguard Worker friend struct HalManifestConverter; 174*70a7ec85SAndroid Build Coastguard Worker friend class VintfObject; 175*70a7ec85SAndroid Build Coastguard Worker friend class AssembleVintfImpl; 176*70a7ec85SAndroid Build Coastguard Worker friend class details::CheckVintfUtils; 177*70a7ec85SAndroid Build Coastguard Worker friend struct LibVintfTest; 178*70a7ec85SAndroid Build Coastguard Worker friend class details::FmOnlyVintfObject; 179*70a7ec85SAndroid Build Coastguard Worker friend std::string dump(const HalManifest &vm); 180*70a7ec85SAndroid Build Coastguard Worker friend bool operator==(const HalManifest &lft, const HalManifest &rgt); 181*70a7ec85SAndroid Build Coastguard Worker 182*70a7ec85SAndroid Build Coastguard Worker status_t fetchAllInformation(const FileSystem* fileSystem, const std::string& path, 183*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 184*70a7ec85SAndroid Build Coastguard Worker 185*70a7ec85SAndroid Build Coastguard Worker details::Instances expandInstances(const std::string& name) const; 186*70a7ec85SAndroid Build Coastguard Worker // Check if all instances in matrixHal is supported in this manifest. 187*70a7ec85SAndroid Build Coastguard Worker bool isCompatible(const details::Instances& instances, const MatrixHal& matrixHal) const; 188*70a7ec85SAndroid Build Coastguard Worker 189*70a7ec85SAndroid Build Coastguard Worker // Return a list of error messages (for each <hal> name) that does NOT conform to 190*70a7ec85SAndroid Build Coastguard Worker // the given compatibility matrix. It does not contain components that are optional. 191*70a7ec85SAndroid Build Coastguard Worker // That is, return empty list iff 192*70a7ec85SAndroid Build Coastguard Worker // (instance in matrix) => (instance in manifest). 193*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> checkIncompatibleHals(const CompatibilityMatrix& mat) const; 194*70a7ec85SAndroid Build Coastguard Worker 195*70a7ec85SAndroid Build Coastguard Worker void removeHals(const std::string& name, size_t majorVer); 196*70a7ec85SAndroid Build Coastguard Worker 197*70a7ec85SAndroid Build Coastguard Worker // Returns a list of instance names that are in this manifest but 198*70a7ec85SAndroid Build Coastguard Worker // are not specified in the given matrix, whether the HAL is specified as an optional or 199*70a7ec85SAndroid Build Coastguard Worker // required HAL. 200*70a7ec85SAndroid Build Coastguard Worker // That is, return empty list iff 201*70a7ec85SAndroid Build Coastguard Worker // (instance in manifest) => (instance in matrix). 202*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> checkUnusedHals( 203*70a7ec85SAndroid Build Coastguard Worker const CompatibilityMatrix& mat, 204*70a7ec85SAndroid Build Coastguard Worker const std::vector<HidlInterfaceMetadata>& hidlMetadata) const; 205*70a7ec85SAndroid Build Coastguard Worker 206*70a7ec85SAndroid Build Coastguard Worker // Check that manifest has no entries. 207*70a7ec85SAndroid Build Coastguard Worker bool empty() const; 208*70a7ec85SAndroid Build Coastguard Worker 209*70a7ec85SAndroid Build Coastguard Worker // Alternative to forEachInstance if you just need a set of instance names instead. 210*70a7ec85SAndroid Build Coastguard Worker std::set<std::string> getInstances(HalFormat format, ExclusiveTo exclusiveTo, 211*70a7ec85SAndroid Build Coastguard Worker const std::string& package, const Version& version, 212*70a7ec85SAndroid Build Coastguard Worker const std::string& interfaceName) const; 213*70a7ec85SAndroid Build Coastguard Worker 214*70a7ec85SAndroid Build Coastguard Worker // Return whether instance is in getInstances(...). 215*70a7ec85SAndroid Build Coastguard Worker bool hasInstance(HalFormat format, ExclusiveTo exclusiveTo, const std::string& package, 216*70a7ec85SAndroid Build Coastguard Worker const Version& version, const std::string& interfaceName, 217*70a7ec85SAndroid Build Coastguard Worker const std::string& instance) const; 218*70a7ec85SAndroid Build Coastguard Worker 219*70a7ec85SAndroid Build Coastguard Worker // Get the <kernel> tag. Assumes type() == DEVICE. 220*70a7ec85SAndroid Build Coastguard Worker // - On host, <kernel> tag only exists for the fully assembled HAL manifest. 221*70a7ec85SAndroid Build Coastguard Worker // - On device, this only contain information about level(). Other information should be 222*70a7ec85SAndroid Build Coastguard Worker // looked up via RuntimeInfo. 223*70a7ec85SAndroid Build Coastguard Worker const std::optional<KernelInfo>& kernel() const; 224*70a7ec85SAndroid Build Coastguard Worker 225*70a7ec85SAndroid Build Coastguard Worker // Merge information of other to this. 226*70a7ec85SAndroid Build Coastguard Worker bool mergeKernel(std::optional<KernelInfo>* other, std::string* error = nullptr); 227*70a7ec85SAndroid Build Coastguard Worker 228*70a7ec85SAndroid Build Coastguard Worker // Whether the manifest contains information about the kernel for compatibility checks. 229*70a7ec85SAndroid Build Coastguard Worker // True if kernel()->checkCompatibility can be called. 230*70a7ec85SAndroid Build Coastguard Worker bool shouldCheckKernelCompatibility() const; 231*70a7ec85SAndroid Build Coastguard Worker 232*70a7ec85SAndroid Build Coastguard Worker // Helper for shouldAdd(). Check if |hal| has a conflicting major version with this. Return 233*70a7ec85SAndroid Build Coastguard Worker // false if hal should not be added, and set |error| accordingly. Return true if check passes. 234*70a7ec85SAndroid Build Coastguard Worker bool addingConflictingMajorVersion(const ManifestHal& hal, std::string* error) const; 235*70a7ec85SAndroid Build Coastguard Worker 236*70a7ec85SAndroid Build Coastguard Worker // Helper for shouldAdd(). Check if |hal| has a conflicting major version in <fqname> with this. 237*70a7ec85SAndroid Build Coastguard Worker // Return false if hal should not be added, and set |error| accordingly. Return true if check 238*70a7ec85SAndroid Build Coastguard Worker // passes. 239*70a7ec85SAndroid Build Coastguard Worker bool addingConflictingFqInstance(const ManifestHal& hal, std::string* error) const; 240*70a7ec85SAndroid Build Coastguard Worker 241*70a7ec85SAndroid Build Coastguard Worker // Inferred kernel level. 242*70a7ec85SAndroid Build Coastguard Worker Level inferredKernelLevel() const; 243*70a7ec85SAndroid Build Coastguard Worker 244*70a7ec85SAndroid Build Coastguard Worker SchemaType mType; 245*70a7ec85SAndroid Build Coastguard Worker Level mLevel = Level::UNSPECIFIED; 246*70a7ec85SAndroid Build Coastguard Worker 247*70a7ec85SAndroid Build Coastguard Worker // The metaversion on the source file if the HAL manifest is parsed from an XML file, 248*70a7ec85SAndroid Build Coastguard Worker // Otherwise, the object is created programmatically, so default to libvintf meta version. 249*70a7ec85SAndroid Build Coastguard Worker Version mSourceMetaVersion = kMetaVersion; 250*70a7ec85SAndroid Build Coastguard Worker 251*70a7ec85SAndroid Build Coastguard Worker // entries for device hal manifest only 252*70a7ec85SAndroid Build Coastguard Worker struct { 253*70a7ec85SAndroid Build Coastguard Worker SepolicyVersion mSepolicyVersion; 254*70a7ec85SAndroid Build Coastguard Worker std::optional<KernelInfo> mKernel; 255*70a7ec85SAndroid Build Coastguard Worker } device; 256*70a7ec85SAndroid Build Coastguard Worker 257*70a7ec85SAndroid Build Coastguard Worker // entries for framework hal manifest only 258*70a7ec85SAndroid Build Coastguard Worker struct { 259*70a7ec85SAndroid Build Coastguard Worker #pragma clang diagnostic push 260*70a7ec85SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wdeprecated-declarations" 261*70a7ec85SAndroid Build Coastguard Worker std::vector<Vndk> mVndks; 262*70a7ec85SAndroid Build Coastguard Worker #pragma clang diagnostic pop 263*70a7ec85SAndroid Build Coastguard Worker 264*70a7ec85SAndroid Build Coastguard Worker std::vector<VendorNdk> mVendorNdks; 265*70a7ec85SAndroid Build Coastguard Worker SystemSdk mSystemSdk; 266*70a7ec85SAndroid Build Coastguard Worker } framework; 267*70a7ec85SAndroid Build Coastguard Worker }; 268*70a7ec85SAndroid Build Coastguard Worker 269*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 270*70a7ec85SAndroid Build Coastguard Worker } // namespace android 271*70a7ec85SAndroid Build Coastguard Worker 272*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_HAL_MANIFEST_H 273