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 #ifndef ANDROID_VINTF_VINTF_OBJECT_H_ 18*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_VINTF_OBJECT_H_ 19*70a7ec85SAndroid Build Coastguard Worker 20*70a7ec85SAndroid Build Coastguard Worker #include <map> 21*70a7ec85SAndroid Build Coastguard Worker #include <memory> 22*70a7ec85SAndroid Build Coastguard Worker #include <optional> 23*70a7ec85SAndroid Build Coastguard Worker #include <string> 24*70a7ec85SAndroid Build Coastguard Worker #include <tuple> 25*70a7ec85SAndroid Build Coastguard Worker #include <vector> 26*70a7ec85SAndroid Build Coastguard Worker 27*70a7ec85SAndroid Build Coastguard Worker #include <aidl/metadata.h> 28*70a7ec85SAndroid Build Coastguard Worker #include <android-base/result.h> 29*70a7ec85SAndroid Build Coastguard Worker #include <hidl/metadata.h> 30*70a7ec85SAndroid Build Coastguard Worker 31*70a7ec85SAndroid Build Coastguard Worker #include <vintf/Apex.h> 32*70a7ec85SAndroid Build Coastguard Worker #include <vintf/CheckFlags.h> 33*70a7ec85SAndroid Build Coastguard Worker #include <vintf/CompatibilityMatrix.h> 34*70a7ec85SAndroid Build Coastguard Worker #include <vintf/FileSystem.h> 35*70a7ec85SAndroid Build Coastguard Worker #include <vintf/HalManifest.h> 36*70a7ec85SAndroid Build Coastguard Worker #include <vintf/Level.h> 37*70a7ec85SAndroid Build Coastguard Worker #include <vintf/ObjectFactory.h> 38*70a7ec85SAndroid Build Coastguard Worker #include <vintf/PropertyFetcher.h> 39*70a7ec85SAndroid Build Coastguard Worker #include <vintf/RuntimeInfo.h> 40*70a7ec85SAndroid Build Coastguard Worker 41*70a7ec85SAndroid Build Coastguard Worker namespace android { 42*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 43*70a7ec85SAndroid Build Coastguard Worker 44*70a7ec85SAndroid Build Coastguard Worker class VintfObject; 45*70a7ec85SAndroid Build Coastguard Worker 46*70a7ec85SAndroid Build Coastguard Worker namespace details { 47*70a7ec85SAndroid Build Coastguard Worker class CheckVintfUtils; 48*70a7ec85SAndroid Build Coastguard Worker class FmOnlyVintfObject; 49*70a7ec85SAndroid Build Coastguard Worker class VintfObjectBuilder; 50*70a7ec85SAndroid Build Coastguard Worker 51*70a7ec85SAndroid Build Coastguard Worker template <typename T> 52*70a7ec85SAndroid Build Coastguard Worker struct LockedSharedPtr { 53*70a7ec85SAndroid Build Coastguard Worker std::shared_ptr<T> object; 54*70a7ec85SAndroid Build Coastguard Worker std::mutex mutex; 55*70a7ec85SAndroid Build Coastguard Worker std::optional<timespec> lastModified; 56*70a7ec85SAndroid Build Coastguard Worker }; 57*70a7ec85SAndroid Build Coastguard Worker 58*70a7ec85SAndroid Build Coastguard Worker struct LockedRuntimeInfoCache { 59*70a7ec85SAndroid Build Coastguard Worker std::shared_ptr<RuntimeInfo> object; 60*70a7ec85SAndroid Build Coastguard Worker std::mutex mutex; 61*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo::FetchFlags fetchedFlags = RuntimeInfo::FetchFlag::NONE; 62*70a7ec85SAndroid Build Coastguard Worker }; 63*70a7ec85SAndroid Build Coastguard Worker 64*70a7ec85SAndroid Build Coastguard Worker } // namespace details 65*70a7ec85SAndroid Build Coastguard Worker 66*70a7ec85SAndroid Build Coastguard Worker namespace testing { 67*70a7ec85SAndroid Build Coastguard Worker class VintfObjectTestBase; 68*70a7ec85SAndroid Build Coastguard Worker class VintfObjectRecoveryTest; 69*70a7ec85SAndroid Build Coastguard Worker class VintfObjectRuntimeInfoTest; 70*70a7ec85SAndroid Build Coastguard Worker class VintfObjectCompatibleTest; 71*70a7ec85SAndroid Build Coastguard Worker } // namespace testing 72*70a7ec85SAndroid Build Coastguard Worker 73*70a7ec85SAndroid Build Coastguard Worker /* 74*70a7ec85SAndroid Build Coastguard Worker * The top level class for libvintf. 75*70a7ec85SAndroid Build Coastguard Worker * An overall diagram of the public API: 76*70a7ec85SAndroid Build Coastguard Worker * VintfObject 77*70a7ec85SAndroid Build Coastguard Worker * + GetDeviceHalManfiest 78*70a7ec85SAndroid Build Coastguard Worker * | + getHidlTransport 79*70a7ec85SAndroid Build Coastguard Worker * | + checkCompatibility 80*70a7ec85SAndroid Build Coastguard Worker * + GetFrameworkHalManifest 81*70a7ec85SAndroid Build Coastguard Worker * | + getHidlTransport 82*70a7ec85SAndroid Build Coastguard Worker * | + checkCompatibility 83*70a7ec85SAndroid Build Coastguard Worker * + GetRuntimeInfo 84*70a7ec85SAndroid Build Coastguard Worker * + checkCompatibility 85*70a7ec85SAndroid Build Coastguard Worker * 86*70a7ec85SAndroid Build Coastguard Worker * Each of the function gathers all information and encapsulate it into the object. 87*70a7ec85SAndroid Build Coastguard Worker * If no error, it return the same singleton object in the future, and the HAL manifest 88*70a7ec85SAndroid Build Coastguard Worker * file won't be touched again. 89*70a7ec85SAndroid Build Coastguard Worker * If any error, nullptr is returned, and Get will try to parse the HAL manifest 90*70a7ec85SAndroid Build Coastguard Worker * again when it is called again. 91*70a7ec85SAndroid Build Coastguard Worker * All these operations are thread-safe. 92*70a7ec85SAndroid Build Coastguard Worker */ 93*70a7ec85SAndroid Build Coastguard Worker class VintfObject { 94*70a7ec85SAndroid Build Coastguard Worker public: 95*70a7ec85SAndroid Build Coastguard Worker virtual ~VintfObject() = default; 96*70a7ec85SAndroid Build Coastguard Worker 97*70a7ec85SAndroid Build Coastguard Worker /* 98*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the device-side HAL manifests built from component pieces on the 99*70a7ec85SAndroid Build Coastguard Worker * vendor partition. 100*70a7ec85SAndroid Build Coastguard Worker */ 101*70a7ec85SAndroid Build Coastguard Worker virtual std::shared_ptr<const HalManifest> getDeviceHalManifest(); 102*70a7ec85SAndroid Build Coastguard Worker 103*70a7ec85SAndroid Build Coastguard Worker /* 104*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the framework-side HAL manifest built from component pieces on the 105*70a7ec85SAndroid Build Coastguard Worker * system partition. 106*70a7ec85SAndroid Build Coastguard Worker */ 107*70a7ec85SAndroid Build Coastguard Worker virtual std::shared_ptr<const HalManifest> getFrameworkHalManifest(); 108*70a7ec85SAndroid Build Coastguard Worker 109*70a7ec85SAndroid Build Coastguard Worker /* 110*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the device-side compatibility matrix built from component pieces 111*70a7ec85SAndroid Build Coastguard Worker * on the vendor partition. 112*70a7ec85SAndroid Build Coastguard Worker */ 113*70a7ec85SAndroid Build Coastguard Worker virtual std::shared_ptr<const CompatibilityMatrix> getDeviceCompatibilityMatrix(); 114*70a7ec85SAndroid Build Coastguard Worker 115*70a7ec85SAndroid Build Coastguard Worker /* 116*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the framework-side compatibility matrix built from component 117*70a7ec85SAndroid Build Coastguard Worker * pieces on the system partition. 118*70a7ec85SAndroid Build Coastguard Worker * 119*70a7ec85SAndroid Build Coastguard Worker * This automatically selects the right compatibility matrix according to the target-level 120*70a7ec85SAndroid Build Coastguard Worker * specified by the device. 121*70a7ec85SAndroid Build Coastguard Worker */ 122*70a7ec85SAndroid Build Coastguard Worker virtual std::shared_ptr<const CompatibilityMatrix> getFrameworkCompatibilityMatrix(); 123*70a7ec85SAndroid Build Coastguard Worker 124*70a7ec85SAndroid Build Coastguard Worker /* 125*70a7ec85SAndroid Build Coastguard Worker * Return the API that access device runtime info. 126*70a7ec85SAndroid Build Coastguard Worker * 127*70a7ec85SAndroid Build Coastguard Worker * {skipCache == true, flags == ALL}: re-fetch everything 128*70a7ec85SAndroid Build Coastguard Worker * {skipCache == false, flags == ALL}: fetch everything if not previously fetched 129*70a7ec85SAndroid Build Coastguard Worker * {skipCache == true, flags == selected info}: re-fetch selected information 130*70a7ec85SAndroid Build Coastguard Worker * if not previously fetched. 131*70a7ec85SAndroid Build Coastguard Worker * {skipCache == false, flags == selected info}: fetch selected information 132*70a7ec85SAndroid Build Coastguard Worker * if not previously fetched. 133*70a7ec85SAndroid Build Coastguard Worker * 134*70a7ec85SAndroid Build Coastguard Worker * @param skipCache do not fetch if previously fetched 135*70a7ec85SAndroid Build Coastguard Worker * @param flags bitwise-or of RuntimeInfo::FetchFlag 136*70a7ec85SAndroid Build Coastguard Worker */ 137*70a7ec85SAndroid Build Coastguard Worker std::shared_ptr<const RuntimeInfo> getRuntimeInfo( 138*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo::FetchFlags flags = RuntimeInfo::FetchFlag::ALL); 139*70a7ec85SAndroid Build Coastguard Worker 140*70a7ec85SAndroid Build Coastguard Worker /** 141*70a7ec85SAndroid Build Coastguard Worker * Check compatibility on the device. 142*70a7ec85SAndroid Build Coastguard Worker * 143*70a7ec85SAndroid Build Coastguard Worker * @param error error message 144*70a7ec85SAndroid Build Coastguard Worker * @param flags flags to disable certain checks. See CheckFlags. 145*70a7ec85SAndroid Build Coastguard Worker * 146*70a7ec85SAndroid Build Coastguard Worker * @return = 0 if success (compatible) 147*70a7ec85SAndroid Build Coastguard Worker * > 0 if incompatible 148*70a7ec85SAndroid Build Coastguard Worker * < 0 if any error (mount partition fails, illformed XML, etc.) 149*70a7ec85SAndroid Build Coastguard Worker */ 150*70a7ec85SAndroid Build Coastguard Worker int32_t checkCompatibility(std::string* error = nullptr, 151*70a7ec85SAndroid Build Coastguard Worker CheckFlags::Type flags = CheckFlags::DEFAULT); 152*70a7ec85SAndroid Build Coastguard Worker 153*70a7ec85SAndroid Build Coastguard Worker /** 154*70a7ec85SAndroid Build Coastguard Worker * Check deprecation on existing VINTF metadata. Use Device Manifest as the 155*70a7ec85SAndroid Build Coastguard Worker * predicate to check if a HAL is in use. 156*70a7ec85SAndroid Build Coastguard Worker * 157*70a7ec85SAndroid Build Coastguard Worker * @return = 0 if success (no deprecated HALs) 158*70a7ec85SAndroid Build Coastguard Worker * > 0 if there is at least one deprecated HAL 159*70a7ec85SAndroid Build Coastguard Worker * < 0 if any error (mount partition fails, illformed XML, etc.) 160*70a7ec85SAndroid Build Coastguard Worker */ 161*70a7ec85SAndroid Build Coastguard Worker int32_t checkDeprecation(const std::vector<HidlInterfaceMetadata>& hidlMetadata, 162*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 163*70a7ec85SAndroid Build Coastguard Worker 164*70a7ec85SAndroid Build Coastguard Worker /** 165*70a7ec85SAndroid Build Coastguard Worker * Return kernel FCM version. 166*70a7ec85SAndroid Build Coastguard Worker * 167*70a7ec85SAndroid Build Coastguard Worker * If any error, UNSPECIFIED is returned, and error is set to an error message. 168*70a7ec85SAndroid Build Coastguard Worker */ 169*70a7ec85SAndroid Build Coastguard Worker Level getKernelLevel(std::string* error = nullptr); 170*70a7ec85SAndroid Build Coastguard Worker 171*70a7ec85SAndroid Build Coastguard Worker /** 172*70a7ec85SAndroid Build Coastguard Worker * Returns true if the framework compatibility matrix has extensions. In 173*70a7ec85SAndroid Build Coastguard Worker * other words, returns true if any of the following exists on the device: 174*70a7ec85SAndroid Build Coastguard Worker * - device framework compatibility matrix 175*70a7ec85SAndroid Build Coastguard Worker * - product framework compatibility matrix 176*70a7ec85SAndroid Build Coastguard Worker * - system_ext framework compatibility matrix 177*70a7ec85SAndroid Build Coastguard Worker * 178*70a7ec85SAndroid Build Coastguard Worker * Return result: 179*70a7ec85SAndroid Build Coastguard Worker * - true if framework compatibility matrix has extensions 180*70a7ec85SAndroid Build Coastguard Worker * - false if framework compatibility 181*70a7ec85SAndroid Build Coastguard Worker * matrix does not have extensions. 182*70a7ec85SAndroid Build Coastguard Worker * - !result.has_value() if any error. Check 183*70a7ec85SAndroid Build Coastguard Worker * result.error() for detailed message. 184*70a7ec85SAndroid Build Coastguard Worker */ 185*70a7ec85SAndroid Build Coastguard Worker android::base::Result<bool> hasFrameworkCompatibilityMatrixExtensions(); 186*70a7ec85SAndroid Build Coastguard Worker 187*70a7ec85SAndroid Build Coastguard Worker /** 188*70a7ec85SAndroid Build Coastguard Worker * Check that there are no unused HALs in HAL manifests. Currently, only 189*70a7ec85SAndroid Build Coastguard Worker * device manifest is checked against framework compatibility matrix. 190*70a7ec85SAndroid Build Coastguard Worker * 191*70a7ec85SAndroid Build Coastguard Worker * Return result: 192*70a7ec85SAndroid Build Coastguard Worker * - result.ok() if no unused HALs 193*70a7ec85SAndroid Build Coastguard Worker * - !result.ok() && result.error().code() == 0 if with unused HALs. Check 194*70a7ec85SAndroid Build Coastguard Worker * result.error() for detailed message. 195*70a7ec85SAndroid Build Coastguard Worker * - !result.ok() && result.error().code() != 0 if any error. Check 196*70a7ec85SAndroid Build Coastguard Worker * result.error() for detailed message. 197*70a7ec85SAndroid Build Coastguard Worker */ 198*70a7ec85SAndroid Build Coastguard Worker android::base::Result<void> checkUnusedHals( 199*70a7ec85SAndroid Build Coastguard Worker const std::vector<HidlInterfaceMetadata>& hidlMetadata); 200*70a7ec85SAndroid Build Coastguard Worker 201*70a7ec85SAndroid Build Coastguard Worker // Check that all HALs are added to any framework compatibility matrix. 202*70a7ec85SAndroid Build Coastguard Worker // If shouldCheck is set, only check if: 203*70a7ec85SAndroid Build Coastguard Worker // - For HIDL, shouldCheck(packageAndVersion) (e.g. [email protected]) 204*70a7ec85SAndroid Build Coastguard Worker // - For AIDL and native, shouldCheck(package) (e.g. android.hardware.foo) 205*70a7ec85SAndroid Build Coastguard Worker android::base::Result<void> checkMissingHalsInMatrices( 206*70a7ec85SAndroid Build Coastguard Worker const std::vector<HidlInterfaceMetadata>& hidlMetadata, 207*70a7ec85SAndroid Build Coastguard Worker const std::vector<AidlInterfaceMetadata>& aidlMetadata, 208*70a7ec85SAndroid Build Coastguard Worker std::function<bool(const std::string&)> shouldCheckHidl, 209*70a7ec85SAndroid Build Coastguard Worker std::function<bool(const std::string&)> shouldCheckAidl); 210*70a7ec85SAndroid Build Coastguard Worker 211*70a7ec85SAndroid Build Coastguard Worker // Check that all HALs in all framework compatibility matrices have the 212*70a7ec85SAndroid Build Coastguard Worker // proper interface definition (HIDL / AIDL files). 213*70a7ec85SAndroid Build Coastguard Worker android::base::Result<void> checkMatrixHalsHasDefinition( 214*70a7ec85SAndroid Build Coastguard Worker const std::vector<HidlInterfaceMetadata>& hidlMetadata, 215*70a7ec85SAndroid Build Coastguard Worker const std::vector<AidlInterfaceMetadata>& aidlMetadata); 216*70a7ec85SAndroid Build Coastguard Worker 217*70a7ec85SAndroid Build Coastguard Worker // Get the latest <kernel> minlts for compatibility matrix level |fcmVersion|. 218*70a7ec85SAndroid Build Coastguard Worker android::base::Result<KernelVersion> getLatestMinLtsAtFcmVersion(Level fcmVersion); 219*70a7ec85SAndroid Build Coastguard Worker 220*70a7ec85SAndroid Build Coastguard Worker private: 221*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<FileSystem> mFileSystem; 222*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<ObjectFactory<RuntimeInfo>> mRuntimeInfoFactory; 223*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<PropertyFetcher> mPropertyFetcher; 224*70a7ec85SAndroid Build Coastguard Worker details::LockedSharedPtr<HalManifest> mDeviceManifest; 225*70a7ec85SAndroid Build Coastguard Worker details::LockedSharedPtr<HalManifest> mFrameworkManifest; 226*70a7ec85SAndroid Build Coastguard Worker details::LockedSharedPtr<CompatibilityMatrix> mDeviceMatrix; 227*70a7ec85SAndroid Build Coastguard Worker 228*70a7ec85SAndroid Build Coastguard Worker // Parent lock of the following fields. It should be acquired before locking the child locks. 229*70a7ec85SAndroid Build Coastguard Worker std::mutex mFrameworkCompatibilityMatrixMutex; 230*70a7ec85SAndroid Build Coastguard Worker details::LockedSharedPtr<CompatibilityMatrix> mFrameworkMatrix; 231*70a7ec85SAndroid Build Coastguard Worker details::LockedSharedPtr<CompatibilityMatrix> mCombinedFrameworkMatrix; 232*70a7ec85SAndroid Build Coastguard Worker // End of mFrameworkCompatibilityMatrixMutex 233*70a7ec85SAndroid Build Coastguard Worker 234*70a7ec85SAndroid Build Coastguard Worker details::LockedRuntimeInfoCache mDeviceRuntimeInfo; 235*70a7ec85SAndroid Build Coastguard Worker 236*70a7ec85SAndroid Build Coastguard Worker bool getCheckAidlCompatMatrix(); 237*70a7ec85SAndroid Build Coastguard Worker std::optional<bool> mFakeCheckAidlCompatibilityMatrix; 238*70a7ec85SAndroid Build Coastguard Worker 239*70a7ec85SAndroid Build Coastguard Worker // Expose functions for testing and recovery 240*70a7ec85SAndroid Build Coastguard Worker friend class testing::VintfObjectTestBase; 241*70a7ec85SAndroid Build Coastguard Worker friend class testing::VintfObjectRecoveryTest; 242*70a7ec85SAndroid Build Coastguard Worker friend class testing::VintfObjectRuntimeInfoTest; 243*70a7ec85SAndroid Build Coastguard Worker friend class testing::VintfObjectCompatibleTest; 244*70a7ec85SAndroid Build Coastguard Worker 245*70a7ec85SAndroid Build Coastguard Worker // Expose functions to simulate dependency injection. 246*70a7ec85SAndroid Build Coastguard Worker friend class details::VintfObjectBuilder; 247*70a7ec85SAndroid Build Coastguard Worker friend class details::CheckVintfUtils; 248*70a7ec85SAndroid Build Coastguard Worker friend class details::FmOnlyVintfObject; 249*70a7ec85SAndroid Build Coastguard Worker 250*70a7ec85SAndroid Build Coastguard Worker protected: setFakeCheckAidlCompatMatrix(bool check)251*70a7ec85SAndroid Build Coastguard Worker void setFakeCheckAidlCompatMatrix(bool check) { mFakeCheckAidlCompatibilityMatrix = check; } 252*70a7ec85SAndroid Build Coastguard Worker virtual const std::unique_ptr<FileSystem>& getFileSystem(); 253*70a7ec85SAndroid Build Coastguard Worker virtual const std::unique_ptr<PropertyFetcher>& getPropertyFetcher(); 254*70a7ec85SAndroid Build Coastguard Worker virtual const std::unique_ptr<ObjectFactory<RuntimeInfo>>& getRuntimeInfoFactory(); 255*70a7ec85SAndroid Build Coastguard Worker 256*70a7ec85SAndroid Build Coastguard Worker public: 257*70a7ec85SAndroid Build Coastguard Worker /* 258*70a7ec85SAndroid Build Coastguard Worker * Get global instance. Results are cached. 259*70a7ec85SAndroid Build Coastguard Worker */ 260*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<VintfObject> GetInstance(); 261*70a7ec85SAndroid Build Coastguard Worker 262*70a7ec85SAndroid Build Coastguard Worker // Static variants of member functions. 263*70a7ec85SAndroid Build Coastguard Worker 264*70a7ec85SAndroid Build Coastguard Worker /* 265*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the device-side HAL manifest built from component pieces on the 266*70a7ec85SAndroid Build Coastguard Worker * vendor partition. 267*70a7ec85SAndroid Build Coastguard Worker */ 268*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<const HalManifest> GetDeviceHalManifest(); 269*70a7ec85SAndroid Build Coastguard Worker 270*70a7ec85SAndroid Build Coastguard Worker /* 271*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the framework-side HAL manifest built from component pieces on the 272*70a7ec85SAndroid Build Coastguard Worker * system partition. 273*70a7ec85SAndroid Build Coastguard Worker */ 274*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<const HalManifest> GetFrameworkHalManifest(); 275*70a7ec85SAndroid Build Coastguard Worker 276*70a7ec85SAndroid Build Coastguard Worker /* 277*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the device-side compatibility matrix built from component pieces 278*70a7ec85SAndroid Build Coastguard Worker * on the vendor partition. 279*70a7ec85SAndroid Build Coastguard Worker */ 280*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<const CompatibilityMatrix> GetDeviceCompatibilityMatrix(); 281*70a7ec85SAndroid Build Coastguard Worker 282*70a7ec85SAndroid Build Coastguard Worker /* 283*70a7ec85SAndroid Build Coastguard Worker * Return the API that access the framework-side compatibility matrix built from component 284*70a7ec85SAndroid Build Coastguard Worker * pieces on the system partition. 285*70a7ec85SAndroid Build Coastguard Worker */ 286*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<const CompatibilityMatrix> GetFrameworkCompatibilityMatrix(); 287*70a7ec85SAndroid Build Coastguard Worker 288*70a7ec85SAndroid Build Coastguard Worker /* 289*70a7ec85SAndroid Build Coastguard Worker * Return the API that access device runtime info. 290*70a7ec85SAndroid Build Coastguard Worker * 291*70a7ec85SAndroid Build Coastguard Worker * @param flags bitwise-or of RuntimeInfo::FetchFlag 292*70a7ec85SAndroid Build Coastguard Worker * flags == ALL: fetch everything if not previously fetched 293*70a7ec85SAndroid Build Coastguard Worker * flags == selected info: fetch selected information if not previously fetched. 294*70a7ec85SAndroid Build Coastguard Worker */ 295*70a7ec85SAndroid Build Coastguard Worker static std::shared_ptr<const RuntimeInfo> GetRuntimeInfo( 296*70a7ec85SAndroid Build Coastguard Worker RuntimeInfo::FetchFlags flags = RuntimeInfo::FetchFlag::ALL); 297*70a7ec85SAndroid Build Coastguard Worker 298*70a7ec85SAndroid Build Coastguard Worker protected: 299*70a7ec85SAndroid Build Coastguard Worker status_t getCombinedFrameworkMatrix(const std::shared_ptr<const HalManifest>& deviceManifest, 300*70a7ec85SAndroid Build Coastguard Worker Level kernelLevel, CompatibilityMatrix* out, 301*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 302*70a7ec85SAndroid Build Coastguard Worker status_t getAllFrameworkMatrixLevels(std::vector<CompatibilityMatrix>* out, 303*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 304*70a7ec85SAndroid Build Coastguard Worker status_t getOneMatrix(const std::string& path, CompatibilityMatrix* out, 305*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 306*70a7ec85SAndroid Build Coastguard Worker status_t addDirectoryManifests(const std::string& directory, HalManifest* manifests, 307*70a7ec85SAndroid Build Coastguard Worker bool ignoreSchemaType, std::string* error); 308*70a7ec85SAndroid Build Coastguard Worker status_t addDirectoriesManifests(const std::vector<std::string>& directories, 309*70a7ec85SAndroid Build Coastguard Worker HalManifest* manifests, bool ignoreSchemaType, 310*70a7ec85SAndroid Build Coastguard Worker std::string* error); 311*70a7ec85SAndroid Build Coastguard Worker status_t fetchDeviceHalManifest(HalManifest* out, std::string* error = nullptr); 312*70a7ec85SAndroid Build Coastguard Worker status_t fetchDeviceHalManifestApex(HalManifest* out, std::string* error = nullptr); 313*70a7ec85SAndroid Build Coastguard Worker status_t fetchDeviceMatrix(CompatibilityMatrix* out, std::string* error = nullptr); 314*70a7ec85SAndroid Build Coastguard Worker status_t fetchOdmHalManifest(HalManifest* out, std::string* error = nullptr); 315*70a7ec85SAndroid Build Coastguard Worker status_t fetchOneHalManifest(const std::string& path, HalManifest* out, 316*70a7ec85SAndroid Build Coastguard Worker std::string* error = nullptr); 317*70a7ec85SAndroid Build Coastguard Worker status_t fetchVendorHalManifest(HalManifest* out, std::string* error = nullptr); 318*70a7ec85SAndroid Build Coastguard Worker status_t fetchFrameworkHalManifest(HalManifest* out, std::string* error = nullptr); 319*70a7ec85SAndroid Build Coastguard Worker status_t fetchFrameworkHalManifestApex(HalManifest* out, std::string* error = nullptr); 320*70a7ec85SAndroid Build Coastguard Worker 321*70a7ec85SAndroid Build Coastguard Worker status_t fetchUnfilteredFrameworkHalManifest(HalManifest* out, std::string* error); 322*70a7ec85SAndroid Build Coastguard Worker void filterHalsByDeviceManifestLevel(HalManifest* out); 323*70a7ec85SAndroid Build Coastguard Worker 324*70a7ec85SAndroid Build Coastguard Worker // Helper for checking matrices against lib*idlmetadata. Wrapper of the other variant of 325*70a7ec85SAndroid Build Coastguard Worker // getAllFrameworkMatrixLevels. Treat empty output as an error. 326*70a7ec85SAndroid Build Coastguard Worker android::base::Result<std::vector<CompatibilityMatrix>> getAllFrameworkMatrixLevels(); 327*70a7ec85SAndroid Build Coastguard Worker 328*70a7ec85SAndroid Build Coastguard Worker using ChildrenMap = std::multimap<std::string, std::string>; 329*70a7ec85SAndroid Build Coastguard Worker static bool IsHalDeprecated(const MatrixHal& oldMatrixHal, 330*70a7ec85SAndroid Build Coastguard Worker const std::string& oldMatrixHalFileName, 331*70a7ec85SAndroid Build Coastguard Worker const CompatibilityMatrix& targetMatrix, 332*70a7ec85SAndroid Build Coastguard Worker const std::shared_ptr<const HalManifest>& halManifest, 333*70a7ec85SAndroid Build Coastguard Worker const ChildrenMap& childrenMap, std::string* appendedError); 334*70a7ec85SAndroid Build Coastguard Worker static bool IsInstanceDeprecated(const MatrixInstance& oldMatrixInstance, 335*70a7ec85SAndroid Build Coastguard Worker const std::string& oldMatrixInstanceFileName, 336*70a7ec85SAndroid Build Coastguard Worker const CompatibilityMatrix& targetMatrix, 337*70a7ec85SAndroid Build Coastguard Worker const std::shared_ptr<const HalManifest>& halManifest, 338*70a7ec85SAndroid Build Coastguard Worker const ChildrenMap& childrenMap, std::string* appendedError); 339*70a7ec85SAndroid Build Coastguard Worker 340*70a7ec85SAndroid Build Coastguard Worker static android::base::Result<std::vector<FqInstance>> GetListedInstanceInheritance( 341*70a7ec85SAndroid Build Coastguard Worker HalFormat format, ExclusiveTo exclusiveTo, const std::string& package, 342*70a7ec85SAndroid Build Coastguard Worker const Version& version, const std::string& interface, const std::string& instance, 343*70a7ec85SAndroid Build Coastguard Worker const std::shared_ptr<const HalManifest>& halManifest, const ChildrenMap& childrenMap); 344*70a7ec85SAndroid Build Coastguard Worker static bool IsInstanceListed(const std::shared_ptr<const HalManifest>& halManifest, 345*70a7ec85SAndroid Build Coastguard Worker HalFormat format, ExclusiveTo exclusiveTo, 346*70a7ec85SAndroid Build Coastguard Worker const FqInstance& fqInstance); 347*70a7ec85SAndroid Build Coastguard Worker static android::base::Result<void> IsFqInstanceDeprecated( 348*70a7ec85SAndroid Build Coastguard Worker const CompatibilityMatrix& targetMatrix, HalFormat format, ExclusiveTo exclusiveTo, 349*70a7ec85SAndroid Build Coastguard Worker const FqInstance& fqInstance, const std::shared_ptr<const HalManifest>& halManifest); 350*70a7ec85SAndroid Build Coastguard Worker 351*70a7ec85SAndroid Build Coastguard Worker public: 352*70a7ec85SAndroid Build Coastguard Worker class Builder; 353*70a7ec85SAndroid Build Coastguard Worker 354*70a7ec85SAndroid Build Coastguard Worker protected: 355*70a7ec85SAndroid Build Coastguard Worker /* Empty VintfObject without any dependencies. Used by Builder and subclasses. */ 356*70a7ec85SAndroid Build Coastguard Worker VintfObject() = default; 357*70a7ec85SAndroid Build Coastguard Worker }; 358*70a7ec85SAndroid Build Coastguard Worker 359*70a7ec85SAndroid Build Coastguard Worker enum : int32_t { 360*70a7ec85SAndroid Build Coastguard Worker COMPATIBLE = 0, 361*70a7ec85SAndroid Build Coastguard Worker INCOMPATIBLE = 1, 362*70a7ec85SAndroid Build Coastguard Worker 363*70a7ec85SAndroid Build Coastguard Worker NO_DEPRECATED_HALS = 0, 364*70a7ec85SAndroid Build Coastguard Worker DEPRECATED = 1, 365*70a7ec85SAndroid Build Coastguard Worker }; 366*70a7ec85SAndroid Build Coastguard Worker 367*70a7ec85SAndroid Build Coastguard Worker // exposed for testing. 368*70a7ec85SAndroid Build Coastguard Worker namespace details { 369*70a7ec85SAndroid Build Coastguard Worker 370*70a7ec85SAndroid Build Coastguard Worker /** 371*70a7ec85SAndroid Build Coastguard Worker * DO NOT USE outside of libvintf. This is an implementation detail. Use VintfObject::Builder 372*70a7ec85SAndroid Build Coastguard Worker * instead. 373*70a7ec85SAndroid Build Coastguard Worker * 374*70a7ec85SAndroid Build Coastguard Worker * A builder of VintfObject. If a dependency is not specified, the default behavior is used. 375*70a7ec85SAndroid Build Coastguard Worker * - FileSystem fetch from "/" for target and fetch no files for host 376*70a7ec85SAndroid Build Coastguard Worker * - ObjectFactory<RuntimeInfo> fetches default RuntimeInfo for target and nothing for host 377*70a7ec85SAndroid Build Coastguard Worker * - PropertyFetcher fetches properties for target and nothing for host 378*70a7ec85SAndroid Build Coastguard Worker */ 379*70a7ec85SAndroid Build Coastguard Worker class VintfObjectBuilder { 380*70a7ec85SAndroid Build Coastguard Worker public: VintfObjectBuilder(std::unique_ptr<VintfObject> && object)381*70a7ec85SAndroid Build Coastguard Worker VintfObjectBuilder(std::unique_ptr<VintfObject>&& object) : mObject(std::move(object)) {} 382*70a7ec85SAndroid Build Coastguard Worker ~VintfObjectBuilder(); 383*70a7ec85SAndroid Build Coastguard Worker VintfObjectBuilder& setFileSystem(std::unique_ptr<FileSystem>&&); 384*70a7ec85SAndroid Build Coastguard Worker VintfObjectBuilder& setRuntimeInfoFactory(std::unique_ptr<ObjectFactory<RuntimeInfo>>&&); 385*70a7ec85SAndroid Build Coastguard Worker VintfObjectBuilder& setPropertyFetcher(std::unique_ptr<PropertyFetcher>&&); 386*70a7ec85SAndroid Build Coastguard Worker template <typename VintfObjectType = VintfObject> build()387*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<VintfObjectType> build() { 388*70a7ec85SAndroid Build Coastguard Worker return std::unique_ptr<VintfObjectType>( 389*70a7ec85SAndroid Build Coastguard Worker static_cast<VintfObjectType*>(buildInternal().release())); 390*70a7ec85SAndroid Build Coastguard Worker } 391*70a7ec85SAndroid Build Coastguard Worker 392*70a7ec85SAndroid Build Coastguard Worker private: 393*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<VintfObject> buildInternal(); 394*70a7ec85SAndroid Build Coastguard Worker std::unique_ptr<VintfObject> mObject; 395*70a7ec85SAndroid Build Coastguard Worker }; 396*70a7ec85SAndroid Build Coastguard Worker 397*70a7ec85SAndroid Build Coastguard Worker // Convenience function to dump all files and directories that could be read 398*70a7ec85SAndroid Build Coastguard Worker // by calling Get(Framework|Device)(HalManifest|CompatibilityMatrix). The list 399*70a7ec85SAndroid Build Coastguard Worker // include files that may not actually be read when the four functions are called 400*70a7ec85SAndroid Build Coastguard Worker // because some files have a higher priority than others. The list does NOT 401*70a7ec85SAndroid Build Coastguard Worker // include "files" (including kernel interfaces) that are read when GetRuntimeInfo 402*70a7ec85SAndroid Build Coastguard Worker // is called. 403*70a7ec85SAndroid Build Coastguard Worker // The sku string from ro.boot.product.hardware.sku is needed to build the ODM 404*70a7ec85SAndroid Build Coastguard Worker // manifest file name for legacy devices. 405*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> dumpFileList(const std::string& sku); 406*70a7ec85SAndroid Build Coastguard Worker 407*70a7ec85SAndroid Build Coastguard Worker } // namespace details 408*70a7ec85SAndroid Build Coastguard Worker 409*70a7ec85SAndroid Build Coastguard Worker /** Builder of VintfObject. See VintfObjectBuilder for details. */ 410*70a7ec85SAndroid Build Coastguard Worker class VintfObject::Builder : public details::VintfObjectBuilder { 411*70a7ec85SAndroid Build Coastguard Worker public: 412*70a7ec85SAndroid Build Coastguard Worker Builder(); 413*70a7ec85SAndroid Build Coastguard Worker }; 414*70a7ec85SAndroid Build Coastguard Worker 415*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 416*70a7ec85SAndroid Build Coastguard Worker } // namespace android 417*70a7ec85SAndroid Build Coastguard Worker 418*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_VINTF_OBJECT_H_ 419