1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.pm; 18 19 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 20 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 21 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 22 23 import android.content.pm.IntentFilterVerificationInfo; 24 import android.content.pm.PackageManager; 25 import android.content.pm.PackageUserState; 26 import android.os.storage.VolumeInfo; 27 import android.util.ArraySet; 28 import android.util.SparseArray; 29 30 import java.io.File; 31 32 /** 33 * Settings base class for pending and resolved classes. 34 */ 35 abstract class PackageSettingBase extends SettingBase { 36 /** 37 * Indicates the state of installation. Used by PackageManager to figure out 38 * incomplete installations. Say a package is being installed (the state is 39 * set to PKG_INSTALL_INCOMPLETE) and remains so till the package 40 * installation is successful or unsuccessful in which case the 41 * PackageManager will no longer maintain state information associated with 42 * the package. If some exception(like device freeze or battery being pulled 43 * out) occurs during installation of a package, the PackageManager needs 44 * this information to clean up the previously failed installation. 45 */ 46 static final int PKG_INSTALL_COMPLETE = 1; 47 static final int PKG_INSTALL_INCOMPLETE = 0; 48 49 final String name; 50 final String realName; 51 52 /** 53 * Path where this package was found on disk. For monolithic packages 54 * this is path to single base APK file; for cluster packages this is 55 * path to the cluster directory. 56 */ 57 File codePath; 58 String codePathString; 59 File resourcePath; 60 String resourcePathString; 61 62 /** 63 * The path under which native libraries have been unpacked. This path is 64 * always derived at runtime, and is only stored here for cleanup when a 65 * package is uninstalled. 66 */ 67 @Deprecated 68 String legacyNativeLibraryPathString; 69 70 /** 71 * The primary CPU abi for this package. This value is regenerated at every 72 * boot scan. 73 */ 74 String primaryCpuAbiString; 75 76 /** 77 * The secondary CPU abi for this package. This value is regenerated at every 78 * boot scan. 79 */ 80 String secondaryCpuAbiString; 81 82 /** 83 * The install time CPU override, if any. This value is written at install time 84 * and doesn't change during the life of an install. If non-null, 85 * {@code primaryCpuAbiString} will contain the same value. 86 */ 87 String cpuAbiOverrideString; 88 89 long timeStamp; 90 long firstInstallTime; 91 long lastUpdateTime; 92 int versionCode; 93 94 boolean uidError; 95 96 PackageSignatures signatures = new PackageSignatures(); 97 98 boolean installPermissionsFixed; 99 100 PackageKeySetData keySetData = new PackageKeySetData(); 101 102 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState(); 103 104 // Whether this package is currently stopped, thus can not be 105 // started until explicitly launched by the user. 106 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>(); 107 108 int installStatus = PKG_INSTALL_COMPLETE; 109 110 /** 111 * Non-persisted value indicating this package has been temporarily frozen, 112 * usually during a critical section of the package update pipeline. The 113 * platform will refuse to launch packages in a frozen state. 114 */ 115 boolean frozen = false; 116 117 PackageSettingBase origPackage; 118 119 /** Package name of the app that installed this package */ 120 String installerPackageName; 121 /** UUID of {@link VolumeInfo} hosting this app */ 122 String volumeUuid; 123 124 IntentFilterVerificationInfo verificationInfo; 125 PackageSettingBase(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int pVersionCode, int pkgFlags, int pkgPrivateFlags)126 PackageSettingBase(String name, String realName, File codePath, File resourcePath, 127 String legacyNativeLibraryPathString, String primaryCpuAbiString, 128 String secondaryCpuAbiString, String cpuAbiOverrideString, 129 int pVersionCode, int pkgFlags, int pkgPrivateFlags) { 130 super(pkgFlags, pkgPrivateFlags); 131 this.name = name; 132 this.realName = realName; 133 init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, 134 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode); 135 } 136 137 /** 138 * New instance of PackageSetting with one-level-deep cloning. 139 */ 140 @SuppressWarnings("unchecked") PackageSettingBase(PackageSettingBase base)141 PackageSettingBase(PackageSettingBase base) { 142 super(base); 143 144 name = base.name; 145 realName = base.realName; 146 codePath = base.codePath; 147 codePathString = base.codePathString; 148 resourcePath = base.resourcePath; 149 resourcePathString = base.resourcePathString; 150 legacyNativeLibraryPathString = base.legacyNativeLibraryPathString; 151 primaryCpuAbiString = base.primaryCpuAbiString; 152 secondaryCpuAbiString = base.secondaryCpuAbiString; 153 cpuAbiOverrideString = base.cpuAbiOverrideString; 154 timeStamp = base.timeStamp; 155 firstInstallTime = base.firstInstallTime; 156 lastUpdateTime = base.lastUpdateTime; 157 versionCode = base.versionCode; 158 159 uidError = base.uidError; 160 161 signatures = new PackageSignatures(base.signatures); 162 163 installPermissionsFixed = base.installPermissionsFixed; 164 userState.clear(); 165 for (int i=0; i<base.userState.size(); i++) { 166 userState.put(base.userState.keyAt(i), 167 new PackageUserState(base.userState.valueAt(i))); 168 } 169 installStatus = base.installStatus; 170 171 origPackage = base.origPackage; 172 173 installerPackageName = base.installerPackageName; 174 volumeUuid = base.volumeUuid; 175 176 keySetData = new PackageKeySetData(base.keySetData); 177 } 178 init(File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int pVersionCode)179 void init(File codePath, File resourcePath, String legacyNativeLibraryPathString, 180 String primaryCpuAbiString, String secondaryCpuAbiString, 181 String cpuAbiOverrideString, int pVersionCode) { 182 this.codePath = codePath; 183 this.codePathString = codePath.toString(); 184 this.resourcePath = resourcePath; 185 this.resourcePathString = resourcePath.toString(); 186 this.legacyNativeLibraryPathString = legacyNativeLibraryPathString; 187 this.primaryCpuAbiString = primaryCpuAbiString; 188 this.secondaryCpuAbiString = secondaryCpuAbiString; 189 this.cpuAbiOverrideString = cpuAbiOverrideString; 190 this.versionCode = pVersionCode; 191 } 192 setInstallerPackageName(String packageName)193 public void setInstallerPackageName(String packageName) { 194 installerPackageName = packageName; 195 } 196 getInstallerPackageName()197 public String getInstallerPackageName() { 198 return installerPackageName; 199 } 200 setVolumeUuid(String volumeUuid)201 public void setVolumeUuid(String volumeUuid) { 202 this.volumeUuid = volumeUuid; 203 } 204 getVolumeUuid()205 public String getVolumeUuid() { 206 return volumeUuid; 207 } 208 setInstallStatus(int newStatus)209 public void setInstallStatus(int newStatus) { 210 installStatus = newStatus; 211 } 212 getInstallStatus()213 public int getInstallStatus() { 214 return installStatus; 215 } 216 setTimeStamp(long newStamp)217 public void setTimeStamp(long newStamp) { 218 timeStamp = newStamp; 219 } 220 221 /** 222 * Make a shallow copy of this package settings. 223 */ copyFrom(PackageSettingBase base)224 public void copyFrom(PackageSettingBase base) { 225 mPermissionsState.copyFrom(base.mPermissionsState); 226 primaryCpuAbiString = base.primaryCpuAbiString; 227 secondaryCpuAbiString = base.secondaryCpuAbiString; 228 cpuAbiOverrideString = base.cpuAbiOverrideString; 229 timeStamp = base.timeStamp; 230 firstInstallTime = base.firstInstallTime; 231 lastUpdateTime = base.lastUpdateTime; 232 signatures = base.signatures; 233 installPermissionsFixed = base.installPermissionsFixed; 234 userState.clear(); 235 for (int i=0; i<base.userState.size(); i++) { 236 userState.put(base.userState.keyAt(i), base.userState.valueAt(i)); 237 } 238 installStatus = base.installStatus; 239 keySetData = base.keySetData; 240 verificationInfo = base.verificationInfo; 241 installerPackageName = base.installerPackageName; 242 volumeUuid = base.volumeUuid; 243 } 244 modifyUserState(int userId)245 private PackageUserState modifyUserState(int userId) { 246 PackageUserState state = userState.get(userId); 247 if (state == null) { 248 state = new PackageUserState(); 249 userState.put(userId, state); 250 } 251 return state; 252 } 253 readUserState(int userId)254 public PackageUserState readUserState(int userId) { 255 PackageUserState state = userState.get(userId); 256 if (state != null) { 257 return state; 258 } 259 return DEFAULT_USER_STATE; 260 } 261 setEnabled(int state, int userId, String callingPackage)262 void setEnabled(int state, int userId, String callingPackage) { 263 PackageUserState st = modifyUserState(userId); 264 st.enabled = state; 265 st.lastDisableAppCaller = callingPackage; 266 } 267 getEnabled(int userId)268 int getEnabled(int userId) { 269 return readUserState(userId).enabled; 270 } 271 getLastDisabledAppCaller(int userId)272 String getLastDisabledAppCaller(int userId) { 273 return readUserState(userId).lastDisableAppCaller; 274 } 275 setInstalled(boolean inst, int userId)276 void setInstalled(boolean inst, int userId) { 277 modifyUserState(userId).installed = inst; 278 } 279 getInstalled(int userId)280 boolean getInstalled(int userId) { 281 return readUserState(userId).installed; 282 } 283 isAnyInstalled(int[] users)284 boolean isAnyInstalled(int[] users) { 285 for (int user: users) { 286 if (readUserState(user).installed) { 287 return true; 288 } 289 } 290 return false; 291 } 292 queryInstalledUsers(int[] users, boolean installed)293 int[] queryInstalledUsers(int[] users, boolean installed) { 294 int num = 0; 295 for (int user : users) { 296 if (getInstalled(user) == installed) { 297 num++; 298 } 299 } 300 int[] res = new int[num]; 301 num = 0; 302 for (int user : users) { 303 if (getInstalled(user) == installed) { 304 res[num] = user; 305 num++; 306 } 307 } 308 return res; 309 } 310 getStopped(int userId)311 boolean getStopped(int userId) { 312 return readUserState(userId).stopped; 313 } 314 setStopped(boolean stop, int userId)315 void setStopped(boolean stop, int userId) { 316 modifyUserState(userId).stopped = stop; 317 } 318 getNotLaunched(int userId)319 boolean getNotLaunched(int userId) { 320 return readUserState(userId).notLaunched; 321 } 322 setNotLaunched(boolean stop, int userId)323 void setNotLaunched(boolean stop, int userId) { 324 modifyUserState(userId).notLaunched = stop; 325 } 326 getHidden(int userId)327 boolean getHidden(int userId) { 328 return readUserState(userId).hidden; 329 } 330 setHidden(boolean hidden, int userId)331 void setHidden(boolean hidden, int userId) { 332 modifyUserState(userId).hidden = hidden; 333 } 334 getBlockUninstall(int userId)335 boolean getBlockUninstall(int userId) { 336 return readUserState(userId).blockUninstall; 337 } 338 setBlockUninstall(boolean blockUninstall, int userId)339 void setBlockUninstall(boolean blockUninstall, int userId) { 340 modifyUserState(userId).blockUninstall = blockUninstall; 341 } 342 setUserState(int userId, int enabled, boolean installed, boolean stopped, boolean notLaunched, boolean hidden, String lastDisableAppCaller, ArraySet<String> enabledComponents, ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState, int linkGeneration)343 void setUserState(int userId, int enabled, boolean installed, boolean stopped, 344 boolean notLaunched, boolean hidden, 345 String lastDisableAppCaller, ArraySet<String> enabledComponents, 346 ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState, 347 int linkGeneration) { 348 PackageUserState state = modifyUserState(userId); 349 state.enabled = enabled; 350 state.installed = installed; 351 state.stopped = stopped; 352 state.notLaunched = notLaunched; 353 state.hidden = hidden; 354 state.lastDisableAppCaller = lastDisableAppCaller; 355 state.enabledComponents = enabledComponents; 356 state.disabledComponents = disabledComponents; 357 state.blockUninstall = blockUninstall; 358 state.domainVerificationStatus = domainVerifState; 359 state.appLinkGeneration = linkGeneration; 360 } 361 getEnabledComponents(int userId)362 ArraySet<String> getEnabledComponents(int userId) { 363 return readUserState(userId).enabledComponents; 364 } 365 getDisabledComponents(int userId)366 ArraySet<String> getDisabledComponents(int userId) { 367 return readUserState(userId).disabledComponents; 368 } 369 setEnabledComponents(ArraySet<String> components, int userId)370 void setEnabledComponents(ArraySet<String> components, int userId) { 371 modifyUserState(userId).enabledComponents = components; 372 } 373 setDisabledComponents(ArraySet<String> components, int userId)374 void setDisabledComponents(ArraySet<String> components, int userId) { 375 modifyUserState(userId).disabledComponents = components; 376 } 377 setEnabledComponentsCopy(ArraySet<String> components, int userId)378 void setEnabledComponentsCopy(ArraySet<String> components, int userId) { 379 modifyUserState(userId).enabledComponents = components != null 380 ? new ArraySet<String>(components) : null; 381 } 382 setDisabledComponentsCopy(ArraySet<String> components, int userId)383 void setDisabledComponentsCopy(ArraySet<String> components, int userId) { 384 modifyUserState(userId).disabledComponents = components != null 385 ? new ArraySet<String>(components) : null; 386 } 387 modifyUserStateComponents(int userId, boolean disabled, boolean enabled)388 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) { 389 PackageUserState state = modifyUserState(userId); 390 if (disabled && state.disabledComponents == null) { 391 state.disabledComponents = new ArraySet<String>(1); 392 } 393 if (enabled && state.enabledComponents == null) { 394 state.enabledComponents = new ArraySet<String>(1); 395 } 396 return state; 397 } 398 addDisabledComponent(String componentClassName, int userId)399 void addDisabledComponent(String componentClassName, int userId) { 400 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName); 401 } 402 addEnabledComponent(String componentClassName, int userId)403 void addEnabledComponent(String componentClassName, int userId) { 404 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName); 405 } 406 enableComponentLPw(String componentClassName, int userId)407 boolean enableComponentLPw(String componentClassName, int userId) { 408 PackageUserState state = modifyUserStateComponents(userId, false, true); 409 boolean changed = state.disabledComponents != null 410 ? state.disabledComponents.remove(componentClassName) : false; 411 changed |= state.enabledComponents.add(componentClassName); 412 return changed; 413 } 414 disableComponentLPw(String componentClassName, int userId)415 boolean disableComponentLPw(String componentClassName, int userId) { 416 PackageUserState state = modifyUserStateComponents(userId, true, false); 417 boolean changed = state.enabledComponents != null 418 ? state.enabledComponents.remove(componentClassName) : false; 419 changed |= state.disabledComponents.add(componentClassName); 420 return changed; 421 } 422 restoreComponentLPw(String componentClassName, int userId)423 boolean restoreComponentLPw(String componentClassName, int userId) { 424 PackageUserState state = modifyUserStateComponents(userId, true, true); 425 boolean changed = state.disabledComponents != null 426 ? state.disabledComponents.remove(componentClassName) : false; 427 changed |= state.enabledComponents != null 428 ? state.enabledComponents.remove(componentClassName) : false; 429 return changed; 430 } 431 getCurrentEnabledStateLPr(String componentName, int userId)432 int getCurrentEnabledStateLPr(String componentName, int userId) { 433 PackageUserState state = readUserState(userId); 434 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) { 435 return COMPONENT_ENABLED_STATE_ENABLED; 436 } else if (state.disabledComponents != null 437 && state.disabledComponents.contains(componentName)) { 438 return COMPONENT_ENABLED_STATE_DISABLED; 439 } else { 440 return COMPONENT_ENABLED_STATE_DEFAULT; 441 } 442 } 443 removeUser(int userId)444 void removeUser(int userId) { 445 userState.delete(userId); 446 } 447 getIntentFilterVerificationInfo()448 IntentFilterVerificationInfo getIntentFilterVerificationInfo() { 449 return verificationInfo; 450 } 451 setIntentFilterVerificationInfo(IntentFilterVerificationInfo info)452 void setIntentFilterVerificationInfo(IntentFilterVerificationInfo info) { 453 verificationInfo = info; 454 } 455 456 // Returns a packed value as a long: 457 // 458 // high 'int'-sized word: link status: undefined/ask/never/always. 459 // low 'int'-sized word: relative priority among 'always' results. getDomainVerificationStatusForUser(int userId)460 long getDomainVerificationStatusForUser(int userId) { 461 PackageUserState state = readUserState(userId); 462 long result = (long) state.appLinkGeneration; 463 result |= ((long) state.domainVerificationStatus) << 32; 464 return result; 465 } 466 setDomainVerificationStatusForUser(final int status, int generation, int userId)467 void setDomainVerificationStatusForUser(final int status, int generation, int userId) { 468 PackageUserState state = modifyUserState(userId); 469 state.domainVerificationStatus = status; 470 if (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) { 471 state.appLinkGeneration = generation; 472 } 473 } 474 clearDomainVerificationStatusForUser(int userId)475 void clearDomainVerificationStatusForUser(int userId) { 476 modifyUserState(userId).domainVerificationStatus = 477 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; 478 } 479 } 480