• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #define LOG_TAG "ObjectServiceImpl"
17 
18 #include "object_service_impl.h"
19 
20 #include <ipc_skeleton.h>
21 
22 #include "accesstoken_kit.h"
23 #include "account/account_delegate.h"
24 #include "bootstrap.h"
25 #include "checker/checker_manager.h"
26 #include "device_manager_adapter.h"
27 #include "directory/directory_manager.h"
28 #include "dump/dump_manager.h"
29 #include "eventcenter/event_center.h"
30 #include "log_print.h"
31 #include "metadata/appid_meta_data.h"
32 #include "metadata/meta_data_manager.h"
33 #include "metadata/store_meta_data.h"
34 #include "object_asset_loader.h"
35 #include "object_dms_handler.h"
36 #include "snapshot/bind_event.h"
37 #include "store/auto_cache.h"
38 #include "utils/anonymous.h"
39 #include "object_radar_reporter.h"
40 
41 namespace OHOS::DistributedObject {
42 using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter;
43 using StoreMetaData = OHOS::DistributedData::StoreMetaData;
44 using FeatureSystem = OHOS::DistributedData::FeatureSystem;
45 using DumpManager = OHOS::DistributedData::DumpManager;
46 using CheckerManager = OHOS::DistributedData::CheckerManager;
47 __attribute__((used)) ObjectServiceImpl::Factory ObjectServiceImpl::factory_;
48 constexpr const char *METADATA_STORE_PATH = "/data/service/el1/public/database/distributeddata/kvdb";
Factory()49 ObjectServiceImpl::Factory::Factory()
50 {
51     FeatureSystem::GetInstance().RegisterCreator(
52         "data_object",
53         []() {
54             return std::make_shared<ObjectServiceImpl>();
55         },
56         FeatureSystem::BIND_NOW);
57     staticActs_ = std::make_shared<ObjectStatic>();
58     FeatureSystem::GetInstance().RegisterStaticActs("data_object", staticActs_);
59 }
60 
~Factory()61 ObjectServiceImpl::Factory::~Factory()
62 {
63 }
64 
ObjectStoreSave(const std::string & bundleName,const std::string & sessionId,const std::string & deviceId,const std::map<std::string,std::vector<uint8_t>> & data,sptr<IRemoteObject> callback)65 int32_t ObjectServiceImpl::ObjectStoreSave(const std::string &bundleName, const std::string &sessionId,
66     const std::string &deviceId, const std::map<std::string, std::vector<uint8_t>> &data,
67     sptr<IRemoteObject> callback)
68 {
69     ZLOGI("begin.");
70     ObjectStore::RadarReporter::ReportStage(std::string(__FUNCTION__), ObjectStore::SAVE,
71         ObjectStore::SAVE_TO_STORE, ObjectStore::IDLE);
72     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
73     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
74     if (status != OBJECT_SUCCESS) {
75         return status;
76     }
77     status = ObjectStoreManager::GetInstance().Save(bundleName, sessionId, data, deviceId, callback);
78     if (status != OBJECT_SUCCESS) {
79         ZLOGE("save fail %{public}d", status);
80     }
81     ObjectStore::RadarReporter::ReportStage(std::string(__FUNCTION__), ObjectStore::SAVE,
82         ObjectStore::SAVE_TO_STORE, ObjectStore::RADAR_SUCCESS);
83     return status;
84 }
85 
OnAssetChanged(const std::string & bundleName,const std::string & sessionId,const std::string & deviceId,const ObjectStore::Asset & assetValue)86 int32_t ObjectServiceImpl::OnAssetChanged(const std::string &bundleName, const std::string &sessionId,
87     const std::string &deviceId, const ObjectStore::Asset &assetValue)
88 {
89     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
90     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
91     if (status != OBJECT_SUCCESS) {
92         return status;
93     }
94     status = ObjectStoreManager::GetInstance().OnAssetChanged(tokenId, bundleName, sessionId, deviceId, assetValue);
95     if (status != OBJECT_SUCCESS) {
96         ZLOGE("file transfer failed fail %{public}d", status);
97     }
98     return status;
99 }
100 
BindAssetStore(const std::string & bundleName,const std::string & sessionId,ObjectStore::Asset & asset,ObjectStore::AssetBindInfo & bindInfo)101 int32_t ObjectServiceImpl::BindAssetStore(const std::string &bundleName, const std::string &sessionId,
102     ObjectStore::Asset &asset, ObjectStore::AssetBindInfo &bindInfo)
103 {
104     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
105     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
106     if (status != OBJECT_SUCCESS) {
107         return status;
108     }
109     status = ObjectStoreManager::GetInstance().BindAsset(tokenId, bundleName, sessionId, asset, bindInfo);
110     if (status != OBJECT_SUCCESS) {
111         ZLOGE("bind asset fail %{public}d, bundleName:%{public}s, sessionId:%{public}s, assetName:%{public}s", status,
112             bundleName.c_str(), Anonymous::Change(sessionId).c_str(), Anonymous::Change(asset.name).c_str());
113     }
114     return status;
115 }
116 
IsContinue(bool & result)117 int32_t ObjectServiceImpl::IsContinue(bool &result)
118 {
119     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
120     if (Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId) != Security::AccessToken::TOKEN_HAP) {
121         ZLOGE("TokenType is not TOKEN_HAP, tokenId: %{public}u", tokenId);
122         return OBJECT_INNER_ERROR;
123     }
124     Security::AccessToken::HapTokenInfo tokenInfo;
125     auto status = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
126     if (status != 0) {
127         ZLOGE("Get hap token info failed, tokenId: %{public}u, status: %{public}d", tokenId, status);
128         return status;
129     }
130     result = ObjectDmsHandler::GetInstance().IsContinue(tokenInfo.bundleName);
131     return OBJECT_SUCCESS;
132 }
133 
OnInitialize()134 int32_t ObjectServiceImpl::OnInitialize()
135 {
136     ZLOGI("Initialize");
137     auto localDeviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
138     if (localDeviceId.empty()) {
139         ZLOGE("failed to get local device id");
140         return OBJECT_INNER_ERROR;
141     }
142 
143     if (executors_ == nullptr) {
144         ZLOGE("executors_ is nullptr");
145         return OBJECT_INNER_ERROR;
146     }
147     executors_->Schedule(std::chrono::seconds(WAIT_ACCOUNT_SERVICE), [this]() {
148         StoreMetaData saveMeta;
149         SaveMetaData(saveMeta);
150         ObjectStoreManager::GetInstance().SetData(saveMeta.dataDir, saveMeta.user);
151         ObjectStoreManager::GetInstance().InitUserMeta();
152         RegisterObjectServiceInfo();
153         RegisterHandler();
154         ObjectDmsHandler::GetInstance().RegisterDmsEvent();
155     });
156 
157     return OBJECT_SUCCESS;
158 }
159 
SaveMetaData(StoreMetaData & saveMeta)160 int32_t ObjectServiceImpl::SaveMetaData(StoreMetaData &saveMeta)
161 {
162     auto localDeviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
163     if (localDeviceId.empty()) {
164         ZLOGE("failed to get local device id");
165         return OBJECT_INNER_ERROR;
166     }
167     saveMeta.appType = "default";
168     saveMeta.deviceId = localDeviceId;
169     saveMeta.storeId = DistributedObject::ObjectCommon::OBJECTSTORE_DB_STOREID;
170     saveMeta.isAutoSync = false;
171     saveMeta.isBackup = false;
172     saveMeta.isEncrypt = false;
173     saveMeta.bundleName =  DistributedData::Bootstrap::GetInstance().GetProcessLabel();
174     saveMeta.appId =  DistributedData::Bootstrap::GetInstance().GetProcessLabel();
175     saveMeta.account = DistributedData::AccountDelegate::GetInstance()->GetCurrentAccountId();
176     saveMeta.tokenId = IPCSkeleton::GetCallingTokenID();
177     saveMeta.securityLevel = DistributedKv::SecurityLevel::S1;
178     saveMeta.area = DistributedKv::Area::EL1;
179     saveMeta.uid = IPCSkeleton::GetCallingUid();
180     saveMeta.storeType = ObjectDistributedType::OBJECT_SINGLE_VERSION;
181     saveMeta.dataType = DistributedKv::DataType::TYPE_DYNAMICAL;
182     saveMeta.authType = DistributedKv::AuthType::IDENTICAL_ACCOUNT;
183     int foregroundUserId = 0;
184     DistributedData::AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId);
185     saveMeta.user = std::to_string(foregroundUserId);
186     saveMeta.dataDir = METADATA_STORE_PATH;
187     if (!DistributedData::DirectoryManager::GetInstance().CreateDirectory(saveMeta.dataDir)) {
188         ZLOGE("Create directory error, dataDir: %{public}s.", Anonymous::Change(saveMeta.dataDir).c_str());
189         return OBJECT_INNER_ERROR;
190     }
191     bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) &&
192                    DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true);
193     if (!isSaved) {
194         ZLOGE("SaveMeta failed");
195         return OBJECT_INNER_ERROR;
196     }
197     DistributedData::AppIDMetaData appIdMeta;
198     appIdMeta.bundleName = saveMeta.bundleName;
199     appIdMeta.appId = saveMeta.appId;
200     isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true);
201     if (!isSaved) {
202         ZLOGE("Save appIdMeta failed");
203     }
204     ZLOGI("SaveMeta success appId %{public}s, storeId %{public}s", saveMeta.appId.c_str(),
205         saveMeta.GetStoreAlias().c_str());
206     return OBJECT_SUCCESS;
207 }
208 
OnUserChange(uint32_t code,const std::string & user,const std::string & account)209 int32_t ObjectServiceImpl::OnUserChange(uint32_t code, const std::string &user, const std::string &account)
210 {
211     if (code == static_cast<uint32_t>(AccountStatus::DEVICE_ACCOUNT_SWITCHED)) {
212         int32_t status = ObjectStoreManager::GetInstance().Clear();
213         if (status != OBJECT_SUCCESS) {
214             ZLOGE("Clear fail user:%{public}s, status: %{public}d", user.c_str(), status);
215         }
216         StoreMetaData saveMeta;
217         SaveMetaData(saveMeta);
218         ObjectStoreManager::GetInstance().SetData(saveMeta.dataDir, saveMeta.user);
219     }
220     return Feature::OnUserChange(code, user, account);
221 }
222 
ObjectStoreRevokeSave(const std::string & bundleName,const std::string & sessionId,sptr<IRemoteObject> callback)223 int32_t ObjectServiceImpl::ObjectStoreRevokeSave(
224     const std::string &bundleName, const std::string &sessionId, sptr<IRemoteObject> callback)
225 {
226     ZLOGI("begin.");
227     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
228     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
229     if (status != OBJECT_SUCCESS) {
230         return status;
231     }
232     status = ObjectStoreManager::GetInstance().RevokeSave(bundleName, sessionId, callback);
233     if (status != OBJECT_SUCCESS) {
234         ZLOGE("revoke save fail %{public}d", status);
235         return status;
236     }
237     return OBJECT_SUCCESS;
238 }
239 
ObjectStoreRetrieve(const std::string & bundleName,const std::string & sessionId,sptr<IRemoteObject> callback)240 int32_t ObjectServiceImpl::ObjectStoreRetrieve(
241     const std::string &bundleName, const std::string &sessionId, sptr<IRemoteObject> callback)
242 {
243     ZLOGI("begin.");
244     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
245     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
246     if (status != OBJECT_SUCCESS) {
247         return status;
248     }
249     status = ObjectStoreManager::GetInstance().Retrieve(bundleName, sessionId, callback, tokenId);
250     if (status != OBJECT_SUCCESS) {
251         ZLOGE("retrieve fail %{public}d", status);
252         return status;
253     }
254     return OBJECT_SUCCESS;
255 }
256 
RegisterDataObserver(const std::string & bundleName,const std::string & sessionId,sptr<IRemoteObject> callback)257 int32_t ObjectServiceImpl::RegisterDataObserver(
258     const std::string &bundleName, const std::string &sessionId, sptr<IRemoteObject> callback)
259 {
260     ZLOGD("begin.");
261     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
262     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
263     if (status != OBJECT_SUCCESS) {
264         return status;
265     }
266     auto pid = IPCSkeleton::GetCallingPid();
267     ObjectStoreManager::GetInstance().RegisterRemoteCallback(bundleName, sessionId, pid, tokenId, callback);
268     return OBJECT_SUCCESS;
269 }
270 
UnregisterDataChangeObserver(const std::string & bundleName,const std::string & sessionId)271 int32_t ObjectServiceImpl::UnregisterDataChangeObserver(const std::string &bundleName, const std::string &sessionId)
272 {
273     ZLOGD("begin.");
274     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
275     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
276     if (status != OBJECT_SUCCESS) {
277         return status;
278     }
279     auto pid = IPCSkeleton::GetCallingPid();
280     ObjectStoreManager::GetInstance().UnregisterRemoteCallback(bundleName, pid, tokenId, sessionId);
281     return OBJECT_SUCCESS;
282 }
283 
RegisterProgressObserver(const std::string & bundleName,const std::string & sessionId,sptr<IRemoteObject> callback)284 int32_t ObjectServiceImpl::RegisterProgressObserver(
285     const std::string &bundleName, const std::string &sessionId, sptr<IRemoteObject> callback)
286 {
287     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
288     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
289     if (status != OBJECT_SUCCESS) {
290         return status;
291     }
292     auto pid = IPCSkeleton::GetCallingPid();
293     ObjectStoreManager::GetInstance().RegisterProgressObserverCallback(bundleName, sessionId, pid, tokenId, callback);
294     return OBJECT_SUCCESS;
295 }
296 
UnregisterProgressObserver(const std::string & bundleName,const std::string & sessionId)297 int32_t ObjectServiceImpl::UnregisterProgressObserver(const std::string &bundleName, const std::string &sessionId)
298 {
299     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
300     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
301     if (status != OBJECT_SUCCESS) {
302         return status;
303     }
304     auto pid = IPCSkeleton::GetCallingPid();
305     ObjectStoreManager::GetInstance().UnregisterProgressObserverCallback(bundleName, pid, tokenId, sessionId);
306     return OBJECT_SUCCESS;
307 }
308 
DeleteSnapshot(const std::string & bundleName,const std::string & sessionId)309 int32_t ObjectServiceImpl::DeleteSnapshot(const std::string &bundleName, const std::string &sessionId)
310 {
311     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
312     int32_t status = IsBundleNameEqualTokenId(bundleName, sessionId, tokenId);
313     if (status != OBJECT_SUCCESS) {
314         return status;
315     }
316     ObjectStoreManager::GetInstance().DeleteSnapshot(bundleName, sessionId);
317     return OBJECT_SUCCESS;
318 }
319 
IsBundleNameEqualTokenId(const std::string & bundleName,const std::string & sessionId,const uint32_t & tokenId)320 int32_t ObjectServiceImpl::IsBundleNameEqualTokenId(
321     const std::string &bundleName, const std::string &sessionId, const uint32_t &tokenId)
322 {
323     DistributedData::CheckerManager::StoreInfo storeInfo;
324     storeInfo.uid = IPCSkeleton::GetCallingUid();
325     storeInfo.tokenId = tokenId;
326     storeInfo.bundleName = bundleName;
327     storeInfo.storeId = sessionId;
328     if (!CheckerManager::GetInstance().IsValid(storeInfo)) {
329         ZLOGE("object bundleName wrong, bundleName = %{public}s, uid = %{public}d, tokenId = %{public}s",
330               bundleName.c_str(), storeInfo.uid, Anonymous::Change(std::to_string(storeInfo.tokenId)).c_str());
331         return OBJECT_PERMISSION_DENIED;
332     }
333     return OBJECT_SUCCESS;
334 }
335 
OnAppUninstall(const std::string & bundleName,int32_t user,int32_t index)336 int32_t ObjectServiceImpl::ObjectStatic::OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index)
337 {
338     int32_t result = ObjectStoreManager::GetInstance().DeleteByAppId(bundleName, user);
339     if (result != OBJECT_SUCCESS) {
340         ZLOGE("Delete object data failed, result:%{public}d, bundleName:%{public}s, user:%{public}d, index:%{public}d",
341             result, bundleName.c_str(), user, index);
342         return result;
343     }
344     ZLOGI("Delete object data, bundleName:%{public}s, userId:%{public}d, index:%{public}d", bundleName.c_str(), user,
345         index);
346     return result;
347 }
348 
ResolveAutoLaunch(const std::string & identifier,DistributedDB::AutoLaunchParam & param)349 int32_t ObjectServiceImpl::ResolveAutoLaunch(const std::string &identifier, DistributedDB::AutoLaunchParam &param)
350 {
351     ZLOGI("start, user:%{public}s appId:%{public}s storeId:%{public}s identifier:%{public}s", param.userId.c_str(),
352         param.appId.c_str(), DistributedData::Anonymous::Change(param.storeId).c_str(),
353         DistributedData::Anonymous::Change(identifier).c_str());
354     std::vector<StoreMetaData> metaData;
355     auto prefix = StoreMetaData::GetPrefix({ DmAdapter::GetInstance().GetLocalDevice().uuid });
356     if (!DistributedData::MetaDataManager::GetInstance().LoadMeta(prefix, metaData)) {
357         ZLOGE("no store in user:%{public}s", param.userId.c_str());
358         return OBJECT_STORE_NOT_FOUND;
359     }
360 
361     for (const auto &storeMeta : metaData) {
362         if (storeMeta.storeType < StoreMetaData::StoreType::STORE_OBJECT_BEGIN
363             || storeMeta.storeType > StoreMetaData::StoreType::STORE_OBJECT_END) {
364             continue;
365         }
366         auto identifierTag = DistributedDB::KvStoreDelegateManager::GetKvStoreIdentifier("", storeMeta.appId,
367                                                                                          storeMeta.storeId, true);
368         if (identifier != identifierTag) {
369             continue;
370         }
371         if (storeMeta.bundleName == DistributedData::Bootstrap::GetInstance().GetProcessLabel()) {
372             int32_t status = DistributedObject::ObjectStoreManager::GetInstance().AutoLaunchStore();
373             if (status != OBJECT_SUCCESS) {
374                 continue;
375             }
376             return OBJECT_SUCCESS;
377         }
378     }
379     return OBJECT_SUCCESS;
380 }
381 
OnAppExit(pid_t uid,pid_t pid,uint32_t tokenId,const std::string & appId)382 int32_t ObjectServiceImpl::OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &appId)
383 {
384     ZLOGI("ObjectServiceImpl::OnAppExit uid=%{public}d, pid=%{public}d, tokenId=%{public}d, bundleName=%{public}s",
385           uid, pid, tokenId, appId.c_str());
386     ObjectStoreManager::GetInstance().UnregisterRemoteCallback(appId, pid, tokenId);
387     ObjectStoreManager::GetInstance().UnregisterProgressObserverCallback(appId, pid, tokenId);
388     return FeatureSystem::STUB_SUCCESS;
389 }
390 
ObjectServiceImpl()391 ObjectServiceImpl::ObjectServiceImpl()
392 {
393     auto process = [](const Event& event) {
394         auto& evt = static_cast<const BindEvent&>(event);
395         auto eventInfo = evt.GetBindInfo();
396         StoreMetaData meta;
397         meta.storeId = eventInfo.storeName;
398         meta.bundleName = eventInfo.bundleName;
399         meta.user = std::to_string(eventInfo.user);
400         meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid;
401         if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) {
402             ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(),
403                 meta.GetStoreAlias().c_str());
404             return;
405         }
406         auto store = AutoCache::GetInstance().GetStore(meta, {});
407         if (store == nullptr) {
408             ZLOGE("store null, storeId:%{public}s", meta.GetStoreAlias().c_str());
409             return;
410         }
411         auto bindAssets = ObjectStoreManager::GetInstance().GetSnapShots(eventInfo.bundleName, eventInfo.storeName);
412         store->BindSnapshots(bindAssets);
413     };
414     EventCenter::GetInstance().Subscribe(BindEvent::BIND_SNAPSHOT, process);
415 }
416 
RegisterObjectServiceInfo()417 void ObjectServiceImpl::RegisterObjectServiceInfo()
418 {
419     DumpManager::Config serviceInfoConfig;
420     serviceInfoConfig.fullCmd = "--feature-info";
421     serviceInfoConfig.abbrCmd = "-f";
422     serviceInfoConfig.dumpName = "FEATURE_INFO";
423     serviceInfoConfig.dumpCaption = { "| Display all the service statistics" };
424     DumpManager::GetInstance().AddConfig("FEATURE_INFO", serviceInfoConfig);
425 }
426 
RegisterHandler()427 void ObjectServiceImpl::RegisterHandler()
428 {
429     Handler handler = [this](int fd, std::map<std::string, std::vector<std::string>> &params) {
430         DumpObjectServiceInfo(fd, params);
431     };
432     DumpManager::GetInstance().AddHandler("FEATURE_INFO", uintptr_t(this), handler);
433 }
434 
DumpObjectServiceInfo(int fd,std::map<std::string,std::vector<std::string>> & params)435 void ObjectServiceImpl::DumpObjectServiceInfo(int fd, std::map<std::string, std::vector<std::string>> &params)
436 {
437     (void)params;
438     std::string info;
439     dprintf(fd, "-------------------------------------ObjectServiceInfo------------------------------\n%s\n",
440         info.c_str());
441 }
~ObjectServiceImpl()442 ObjectServiceImpl::~ObjectServiceImpl()
443 {
444     DumpManager::GetInstance().RemoveHandler("FEATURE_INFO", uintptr_t(this));
445     ObjectStoreManager::GetInstance().UnRegisterAssetsLister();
446 }
447 
OnBind(const BindInfo & bindInfo)448 int32_t ObjectServiceImpl::OnBind(const BindInfo &bindInfo)
449 {
450     executors_ = bindInfo.executors;
451     ObjectStoreManager::GetInstance().SetThreadPool(executors_);
452     ObjectAssetLoader::GetInstance().SetThreadPool(executors_);
453     return 0;
454 }
455 } // namespace OHOS::DistributedObject
456