• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 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 #include "start_ability_utils.h"
17 
18 #include "ability_record.h"
19 #include "ability_util.h"
20 #include "app_utils.h"
21 #include "global_constant.h"
22 #include "hitrace_meter.h"
23 #include "startup_util.h"
24 
25 namespace OHOS {
26 namespace AAFwk {
27 namespace {
28 constexpr int32_t ERMS_ISALLOW_RESULTCODE = 10;
29 constexpr const char* PARAM_RESV_ANCO_CALLER_UID = "ohos.anco.param.callerUid";
30 constexpr const char* PARAM_RESV_ANCO_CALLER_BUNDLENAME = "ohos.anco.param.callerBundleName";
31 }
32 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::startAbilityInfo;
33 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::callerAbilityInfo;
34 thread_local bool StartAbilityUtils::skipCrowTest = false;
35 thread_local bool StartAbilityUtils::skipStartOther = false;
36 thread_local bool StartAbilityUtils::skipErms = false;
37 thread_local int32_t StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
38 thread_local bool StartAbilityUtils::isWantWithAppCloneIndex = false;
39 thread_local bool StartAbilityUtils::ermsSupportBackToCallerFlag = false;
40 
GetAppIndex(const Want & want,sptr<IRemoteObject> callerToken,int32_t & appIndex)41 bool StartAbilityUtils::GetAppIndex(const Want &want, sptr<IRemoteObject> callerToken, int32_t &appIndex)
42 {
43     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
44     if (abilityRecord && abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX &&
45         abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
46         appIndex = abilityRecord->GetAppIndex();
47         return true;
48     }
49     TAG_LOGI(AAFwkTag::ABILITYMGR, "appIndex:%{public}d", want.GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, -1));
50     return AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex);
51 }
52 
GetApplicationInfo(const std::string & bundleName,int32_t userId,AppExecFwk::ApplicationInfo & appInfo)53 bool StartAbilityUtils::GetApplicationInfo(const std::string &bundleName, int32_t userId,
54     AppExecFwk::ApplicationInfo &appInfo)
55 {
56     if (StartAbilityUtils::startAbilityInfo &&
57         StartAbilityUtils::startAbilityInfo->GetAppBundleName() == bundleName) {
58         appInfo = StartAbilityUtils::startAbilityInfo->abilityInfo.applicationInfo;
59         return true;
60     }
61     if (bundleName.empty()) {
62         return false;
63     }
64     auto bms = AbilityUtil::GetBundleManagerHelper();
65     CHECK_POINTER_AND_RETURN(bms, false);
66     bool result = IN_PROCESS_CALL(
67         bms->GetApplicationInfo(bundleName, AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO,
68             userId, appInfo)
69     );
70     if (!result) {
71         TAG_LOGW(AAFwkTag::ABILITYMGR, "failed: %{public}s", bundleName.c_str());
72         return false;
73     }
74     return true;
75 }
76 
GetCallerAbilityInfo(const sptr<IRemoteObject> & callerToken,AppExecFwk::AbilityInfo & abilityInfo)77 bool StartAbilityUtils::GetCallerAbilityInfo(const sptr<IRemoteObject> &callerToken,
78     AppExecFwk::AbilityInfo &abilityInfo)
79 {
80     if (StartAbilityUtils::callerAbilityInfo) {
81         abilityInfo = StartAbilityUtils::callerAbilityInfo->abilityInfo;
82     } else {
83         if (callerToken == nullptr) {
84             return false;
85         }
86         auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
87         if (abilityRecord == nullptr) {
88             return false;
89         }
90         abilityInfo = abilityRecord->GetAbilityInfo();
91     }
92     return true;
93 }
94 
GetCloneAppIndexes(const std::string & bundleName,int32_t userId)95 std::vector<int32_t> StartAbilityUtils::GetCloneAppIndexes(const std::string &bundleName, int32_t userId)
96 {
97     std::vector<int32_t> appIndexes;
98     auto bms = AbilityUtil::GetBundleManagerHelper();
99     CHECK_POINTER_AND_RETURN(bms, appIndexes);
100     IN_PROCESS_CALL_WITHOUT_RET(bms->GetCloneAppIndexes(bundleName, appIndexes, userId));
101     return appIndexes;
102 }
103 
CheckAppProvisionMode(const std::string & bundleName,int32_t userId)104 int32_t StartAbilityUtils::CheckAppProvisionMode(const std::string& bundleName, int32_t userId)
105 {
106     AppExecFwk::ApplicationInfo appInfo;
107     if (!GetApplicationInfo(bundleName, userId, appInfo)) {
108         TAG_LOGE(AAFwkTag::ABILITYMGR, "Get application info failed: %{public}s", bundleName.c_str());
109         return ERR_INVALID_VALUE;
110     }
111     if (appInfo.appProvisionType != AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
112         return ERR_NOT_IN_APP_PROVISION_MODE;
113     }
114     return ERR_OK;
115 }
116 
CheckAppProvisionMode(const Want & want,int32_t userId)117 int32_t StartAbilityUtils::CheckAppProvisionMode(const Want& want, int32_t userId)
118 {
119     auto abilityInfo = StartAbilityUtils::startAbilityInfo;
120     if (!abilityInfo || abilityInfo->GetAppBundleName() != want.GetElement().GetBundleName()) {
121         int32_t appIndex = 0;
122         if (!AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex)) {
123             TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid app clone index");
124             return ERR_APP_CLONE_INDEX_INVALID;
125         }
126         abilityInfo = StartAbilityInfo::CreateStartAbilityInfo(want, userId, appIndex, nullptr);
127     }
128     CHECK_POINTER_AND_RETURN(abilityInfo, GET_ABILITY_SERVICE_FAILED);
129     if (abilityInfo->status != ERR_OK) {
130         TAG_LOGE(AAFwkTag::ABILITYMGR, "unexpected abilityInfo status: %{public}d", abilityInfo->status);
131         return abilityInfo->status;
132     }
133     if ((abilityInfo->abilityInfo).applicationInfo.appProvisionType !=
134         AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
135         TAG_LOGE(AAFwkTag::ABILITYMGR, "window options invalid");
136         return ERR_NOT_IN_APP_PROVISION_MODE;
137     }
138     return ERR_OK;
139 }
140 
StartAbilityInfoWrap(const Want & want,int32_t validUserId,int32_t appIndex,const sptr<IRemoteObject> & callerToken,bool isExtension)141 StartAbilityInfoWrap::StartAbilityInfoWrap(const Want &want, int32_t validUserId, int32_t appIndex,
142     const sptr<IRemoteObject> &callerToken, bool isExtension)
143 {
144     if (StartAbilityUtils::startAbilityInfo != nullptr) {
145         TAG_LOGW(AAFwkTag::ABILITYMGR, "startAbilityInfo created");
146     }
147     Want localWant = want;
148     if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
149         TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
150         localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
151         localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
152         localWant.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
153         localWant.RemoveParam(Want::PARAM_RESV_CALLER_UID);
154         localWant.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
155         localWant.SetParam(Want::PARAM_RESV_CALLER_TOKEN, static_cast<int32_t>(IPCSkeleton::GetCallingTokenID()));
156         localWant.SetParam(Want::PARAM_RESV_CALLER_UID, IPCSkeleton::GetCallingUid());
157     }
158     if (isExtension) {
159         StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartExtensionInfo(localWant,
160             validUserId, appIndex);
161     } else {
162         StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartAbilityInfo(localWant,
163             validUserId, appIndex, callerToken);
164     }
165     if (StartAbilityUtils::startAbilityInfo != nullptr &&
166         StartAbilityUtils::startAbilityInfo->abilityInfo.type == AppExecFwk::AbilityType::EXTENSION) {
167         StartAbilityUtils::skipCrowTest = true;
168         StartAbilityUtils::skipStartOther = true;
169     }
170 
171     if (StartAbilityUtils::callerAbilityInfo != nullptr) {
172         TAG_LOGW(AAFwkTag::ABILITYMGR, "callerAbilityInfo created");
173     }
174     StartAbilityUtils::callerAbilityInfo = StartAbilityInfo::CreateCallerAbilityInfo(callerToken);
175 
176     StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
177     StartAbilityUtils::isWantWithAppCloneIndex = false;
178     if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY) && appIndex >= 0 &&
179         appIndex < AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
180         StartAbilityUtils::isWantWithAppCloneIndex = true;
181     }
182 }
StartAbilityInfoWrap()183 StartAbilityInfoWrap::StartAbilityInfoWrap()
184 {
185     StartAbilityUtils::startAbilityInfo.reset();
186     StartAbilityUtils::callerAbilityInfo.reset();
187     StartAbilityUtils::skipCrowTest = false;
188     StartAbilityUtils::skipStartOther = false;
189     StartAbilityUtils::skipErms = false;
190     StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
191     StartAbilityUtils::isWantWithAppCloneIndex = false;
192 }
193 
~StartAbilityInfoWrap()194 StartAbilityInfoWrap::~StartAbilityInfoWrap()
195 {
196     StartAbilityUtils::startAbilityInfo.reset();
197     StartAbilityUtils::callerAbilityInfo.reset();
198     StartAbilityUtils::skipCrowTest = false;
199     StartAbilityUtils::skipStartOther = false;
200     StartAbilityUtils::skipErms = false;
201     StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
202     StartAbilityUtils::isWantWithAppCloneIndex = false;
203 }
204 
SetStartAbilityInfo(const AppExecFwk::AbilityInfo & abilityInfo)205 void StartAbilityInfoWrap::SetStartAbilityInfo(const AppExecFwk::AbilityInfo& abilityInfo)
206 {
207     if (StartAbilityUtils::startAbilityInfo != nullptr) {
208         return;
209     }
210     StartAbilityUtils::startAbilityInfo = std::make_shared<StartAbilityInfo>();
211     StartAbilityUtils::startAbilityInfo->abilityInfo = abilityInfo;
212 }
213 
214 namespace {
QueryAbilityInfo(const Want & want,int32_t userId,int32_t abilityInfoFlag,int32_t appIndex,sptr<IRemoteObject> callerToken)215 std::shared_ptr<StartAbilityInfo> QueryAbilityInfo(const Want &want, int32_t userId, int32_t abilityInfoFlag,
216     int32_t appIndex, sptr<IRemoteObject> callerToken)
217 {
218     auto bms = AbilityUtil::GetBundleManagerHelper();
219     CHECK_POINTER_AND_RETURN(bms, nullptr);
220     auto request = std::make_shared<StartAbilityInfo>();
221     if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
222         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneAbilityInfo(want.GetElement(), abilityInfoFlag, appIndex,
223             request->abilityInfo, userId));
224         return request;
225     }
226     if (appIndex == 0) {
227         if (AbilityRuntime::StartupUtil::IsStartPlugin(want)) {
228             auto caller = Token::GetAbilityRecordByToken(callerToken);
229             if (caller == nullptr) {
230                 TAG_LOGE(AAFwkTag::ABILITYMGR, "caller is nullptr");
231                 request->status = RESOLVE_ABILITY_ERR;
232                 return request;
233             }
234             std::string hostBundleName = caller->GetAbilityInfo().bundleName;
235             TAG_LOGI(AAFwkTag::ABILITYMGR, "hostBundleName: %{public}s", hostBundleName.c_str());
236             auto element = want.GetElement();
237             auto pluginRet = IN_PROCESS_CALL(bms->GetPluginAbilityInfo(hostBundleName, element.GetBundleName(),
238                 element.GetModuleName(), element.GetAbilityName(), userId, request->abilityInfo));
239             if (pluginRet != ERR_OK) {
240                 TAG_LOGW(AAFwkTag::ABILITYMGR, "GetPluginAbilityInfo failed %{public}d", pluginRet);
241                 request->status = RESOLVE_ABILITY_ERR;
242             }
243         } else {
244             IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request->abilityInfo));
245         }
246     } else {
247         IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxAbilityInfo(want, appIndex,
248             abilityInfoFlag, userId, request->abilityInfo));
249     }
250     return request;
251 }
252 }
CreateStartAbilityInfo(const Want & want,int32_t userId,int32_t appIndex,sptr<IRemoteObject> callerToken)253 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartAbilityInfo(const Want &want, int32_t userId,
254     int32_t appIndex, sptr<IRemoteObject> callerToken)
255 {
256     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
257     auto bms = AbilityUtil::GetBundleManagerHelper();
258     CHECK_POINTER_AND_RETURN(bms, nullptr);
259     auto abilityInfoFlag = static_cast<uint32_t>(AbilityRuntime::StartupUtil::BuildAbilityInfoFlag()) |
260         static_cast<uint32_t>(AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL);
261     auto request = QueryAbilityInfo(want, userId, abilityInfoFlag, appIndex, callerToken);
262     if (request == nullptr || request->status != ERR_OK) {
263         TAG_LOGE(AAFwkTag::ABILITYMGR, "QueryAbilityInfo error");
264         return request;
265     }
266     request->customProcess = request->abilityInfo.process;
267     if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
268         if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
269             FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, request);
270         }
271         return request;
272     }
273     TAG_LOGD(AAFwkTag::ABILITYMGR, "abilityInfo customProcess: %{public}s", request->customProcess.c_str());
274     if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
275         // try to find extension
276         std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
277         if (appIndex == 0) {
278             IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag,
279                 userId, extensionInfos));
280         } else {
281             IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
282                 abilityInfoFlag, userId, extensionInfos));
283         }
284         if (extensionInfos.size() <= 0) {
285             TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
286             request->status = RESOLVE_ABILITY_ERR;
287             return request;
288         }
289 
290         AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
291         if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
292             TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
293             request->status = RESOLVE_ABILITY_ERR;
294             return request;
295         }
296         request->extensionProcessMode = extensionInfo.extensionProcessMode;
297         // For compatibility translates to AbilityInfo
298         AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, request->abilityInfo);
299     }
300     return request;
301 }
302 
CreateStartExtensionInfo(const Want & want,int32_t userId,int32_t appIndex)303 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartExtensionInfo(const Want &want, int32_t userId,
304     int32_t appIndex)
305 {
306     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
307     auto bms = AbilityUtil::GetBundleManagerHelper();
308     CHECK_POINTER_AND_RETURN(bms, nullptr);
309     auto abilityInfoFlag = static_cast<uint32_t>(AbilityRuntime::StartupUtil::BuildAbilityInfoFlag()) |
310         static_cast<uint32_t>(AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL);
311     auto abilityInfo = std::make_shared<StartAbilityInfo>();
312     if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
313         FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, abilityInfo);
314         return abilityInfo;
315     }
316 
317     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
318     if (appIndex == 0) {
319         IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
320     } else {
321         IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
322             abilityInfoFlag, userId, extensionInfos));
323     }
324     if (extensionInfos.size() <= 0) {
325         TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
326         abilityInfo->status = RESOLVE_ABILITY_ERR;
327         return abilityInfo;
328     }
329 
330     AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
331     if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
332         TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
333         abilityInfo->status = RESOLVE_ABILITY_ERR;
334         return abilityInfo;
335     }
336     abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
337     abilityInfo->customProcess = extensionInfo.customProcess;
338     // For compatibility translates to AbilityInfo
339     AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
340 
341     return abilityInfo;
342 }
343 
FindExtensionInfo(const Want & want,int32_t flags,int32_t userId,int32_t appIndex,std::shared_ptr<StartAbilityInfo> abilityInfo)344 void StartAbilityInfo::FindExtensionInfo(const Want &want, int32_t flags, int32_t userId,
345     int32_t appIndex, std::shared_ptr<StartAbilityInfo> abilityInfo)
346 {
347     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
348     CHECK_POINTER_LOG(abilityInfo, "abilityInfo is invalid.");
349     auto bms = AbilityUtil::GetBundleManagerHelper();
350     CHECK_POINTER_LOG(bms, "bms is invalid.");
351     AppExecFwk::ExtensionAbilityInfo extensionInfo;
352     IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneExtensionAbilityInfoWithAppIndex(want.GetElement(),
353         flags, appIndex, extensionInfo, userId));
354     if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
355         TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
356         abilityInfo->status = RESOLVE_ABILITY_ERR;
357         return;
358     }
359     abilityInfo->customProcess = extensionInfo.customProcess;
360     if (AbilityRuntime::StartupUtil::IsSupportAppClone(extensionInfo.type)) {
361         abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
362         // For compatibility translates to AbilityInfo
363         AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
364     } else {
365         abilityInfo->status = ERR_APP_CLONE_INDEX_INVALID;
366     }
367 }
368 
CreateCallerAbilityInfo(const sptr<IRemoteObject> & callerToken)369 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateCallerAbilityInfo(const sptr<IRemoteObject> &callerToken)
370 {
371     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
372     if (callerToken == nullptr) {
373         TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from context.");
374         return nullptr;
375     }
376     auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
377     if (abilityRecord == nullptr) {
378         TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord empty");
379         return nullptr;
380     }
381     auto request = std::make_shared<StartAbilityInfo>();
382     request->abilityInfo = abilityRecord->GetAbilityInfo();
383     return request;
384 }
385 
IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> & callerToken)386 bool StartAbilityUtils::IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> &callerToken)
387 {
388     auto callingUid = IPCSkeleton::GetCallingUid();
389     if (callingUid == AppUtils::GetInstance().GetCollaboratorBrokerUID()) {
390         return true;
391     }
392     AppExecFwk::AbilityInfo callerAbilityInfo;
393     if (GetCallerAbilityInfo(callerToken, callerAbilityInfo)) {
394         return callerAbilityInfo.bundleName == AppUtils::GetInstance().GetBrokerDelegateBundleName();
395     }
396     return false;
397 }
398 
SetTargetCloneIndexInSameBundle(const Want & want,sptr<IRemoteObject> callerToken)399 void StartAbilityUtils::SetTargetCloneIndexInSameBundle(const Want &want, sptr<IRemoteObject> callerToken)
400 {
401     auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
402     CHECK_POINTER(callerRecord);
403     if (callerRecord->GetAbilityInfo().bundleName != want.GetElement().GetBundleName()) {
404         TAG_LOGD(AAFwkTag::ABILITYMGR, "not the same bundle");
405         return;
406     }
407     if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
408         TAG_LOGD(AAFwkTag::ABILITYMGR, "want with app clone index.");
409         return;
410     }
411     int32_t appIndex = callerRecord->GetApplicationInfo().appIndex;
412     if (appIndex >= 0 && appIndex < AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
413         (const_cast<Want &>(want)).SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, appIndex);
414     }
415 }
416 
StartUIAbilitiesProcessAppIndex(Want & want,sptr<IRemoteObject> callerToken,int32_t & appIndex)417 int32_t StartAbilityUtils::StartUIAbilitiesProcessAppIndex(Want &want,
418     sptr<IRemoteObject> callerToken, int32_t &appIndex)
419 {
420     SetTargetCloneIndexInSameBundle(want, callerToken);
421     if (!want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) {
422         want.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
423     }
424     if (!StartAbilityUtils::GetAppIndex(want, callerToken, appIndex)) {
425         TAG_LOGE(AAFwkTag::ABILITYMGR, "StartUIAbilities GetAppIndex failed.");
426         return ERR_APP_CLONE_INDEX_INVALID;
427     }
428     return ERR_OK;
429 }
430 }
431 }