xref: /aosp_15_r20/system/libvintf/include/vintf/VintfObject.h (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
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