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 ¶m)
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>> ¶ms) {
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>> ¶ms)
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