PackageManagerInternal.java revision 3c3af1406e9fc8afbe9593df6c23fe3d4daa6b42
1/* 2 * Copyright (C) 2015 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 17package android.content.pm; 18 19import android.annotation.IntDef; 20import android.annotation.NonNull; 21import android.annotation.Nullable; 22import android.content.ComponentName; 23import android.content.Intent; 24import android.content.pm.PackageManager.ApplicationInfoFlags; 25import android.content.pm.PackageManager.ComponentInfoFlags; 26import android.content.pm.PackageManager.PackageInfoFlags; 27import android.content.pm.PackageManager.ResolveInfoFlags; 28import android.os.Bundle; 29import android.os.PersistableBundle; 30import android.util.SparseArray; 31 32import java.lang.annotation.Retention; 33import java.lang.annotation.RetentionPolicy; 34import java.util.List; 35 36/** 37 * Package manager local system service interface. 38 * 39 * @hide Only for use within the system server. 40 */ 41public abstract class PackageManagerInternal { 42 public static final int PACKAGE_SYSTEM = 0; 43 public static final int PACKAGE_SETUP_WIZARD = 1; 44 public static final int PACKAGE_INSTALLER = 2; 45 public static final int PACKAGE_VERIFIER = 3; 46 public static final int PACKAGE_BROWSER = 4; 47 public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 5; 48 @IntDef(value = { 49 PACKAGE_SYSTEM, 50 PACKAGE_SETUP_WIZARD, 51 PACKAGE_INSTALLER, 52 PACKAGE_VERIFIER, 53 PACKAGE_BROWSER, 54 PACKAGE_SYSTEM_TEXT_CLASSIFIER, 55 }) 56 @Retention(RetentionPolicy.SOURCE) 57 public @interface KnownPackage {} 58 59 /** Observer called whenever the list of packages changes */ 60 public interface PackageListObserver { 61 /** A package was added to the system. */ 62 void onPackageAdded(@NonNull String packageName); 63 /** A package was removed from the system. */ 64 void onPackageRemoved(@NonNull String packageName); 65 } 66 67 /** 68 * Provider for package names. 69 */ 70 public interface PackagesProvider { 71 72 /** 73 * Gets the packages for a given user. 74 * @param userId The user id. 75 * @return The package names. 76 */ 77 public String[] getPackages(int userId); 78 } 79 80 /** 81 * Provider for package names. 82 */ 83 public interface SyncAdapterPackagesProvider { 84 85 /** 86 * Gets the sync adapter packages for given authority and user. 87 * @param authority The authority. 88 * @param userId The user id. 89 * @return The package names. 90 */ 91 public String[] getPackages(String authority, int userId); 92 } 93 94 /** 95 * Sets the location provider packages provider. 96 * @param provider The packages provider. 97 */ 98 public abstract void setLocationPackagesProvider(PackagesProvider provider); 99 100 /** 101 * Sets the voice interaction packages provider. 102 * @param provider The packages provider. 103 */ 104 public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); 105 106 /** 107 * Sets the SMS packages provider. 108 * @param provider The packages provider. 109 */ 110 public abstract void setSmsAppPackagesProvider(PackagesProvider provider); 111 112 /** 113 * Sets the dialer packages provider. 114 * @param provider The packages provider. 115 */ 116 public abstract void setDialerAppPackagesProvider(PackagesProvider provider); 117 118 /** 119 * Sets the sim call manager packages provider. 120 * @param provider The packages provider. 121 */ 122 public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider); 123 124 /** 125 * Sets the Use Open Wifi packages provider. 126 * @param provider The packages provider. 127 */ 128 public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider); 129 130 /** 131 * Sets the sync adapter packages provider. 132 * @param provider The provider. 133 */ 134 public abstract void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider); 135 136 /** 137 * Requests granting of the default permissions to the current default SMS app. 138 * @param packageName The default SMS package name. 139 * @param userId The user for which to grant the permissions. 140 */ 141 public abstract void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId); 142 143 /** 144 * Requests granting of the default permissions to the current default dialer app. 145 * @param packageName The default dialer package name. 146 * @param userId The user for which to grant the permissions. 147 */ 148 public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId); 149 150 /** 151 * Requests granting of the default permissions to the current default sim call manager. 152 * @param packageName The default sim call manager package name. 153 * @param userId The user for which to grant the permissions. 154 */ 155 public abstract void grantDefaultPermissionsToDefaultSimCallManager(String packageName, 156 int userId); 157 158 /** 159 * Requests granting of the default permissions to the current default Use Open Wifi app. 160 * @param packageName The default use open wifi package name. 161 * @param userId The user for which to grant the permissions. 162 */ 163 public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, 164 int userId); 165 166 /** 167 * Sets a list of apps to keep in PM's internal data structures and as APKs even if no user has 168 * currently installed it. The apps are not preloaded. 169 * @param packageList List of package names to keep cached. 170 */ 171 public abstract void setKeepUninstalledPackages(List<String> packageList); 172 173 /** 174 * Gets whether some of the permissions used by this package require a user 175 * review before any of the app components can run. 176 * @param packageName The package name for which to check. 177 * @param userId The user under which to check. 178 * @return True a permissions review is required. 179 */ 180 public abstract boolean isPermissionsReviewRequired(String packageName, int userId); 181 182 /** 183 * Retrieve all of the information we know about a particular package/application. 184 * @param filterCallingUid The results will be filtered in the context of this UID instead 185 * of the calling UID. 186 * @see PackageManager#getPackageInfo(String, int) 187 */ 188 public abstract PackageInfo getPackageInfo(String packageName, 189 @PackageInfoFlags int flags, int filterCallingUid, int userId); 190 191 /** 192 * Retrieve launcher extras for a suspended package provided to the system in 193 * {@link PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle, 194 * PersistableBundle, String)}. 195 * 196 * @param packageName The package for which to return launcher extras. 197 * @param userId The user for which to check. 198 * @return The launcher extras. 199 * 200 * @see PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle, 201 * PersistableBundle, String) 202 * @see PackageManager#isPackageSuspended() 203 */ 204 public abstract Bundle getSuspendedPackageLauncherExtras(String packageName, 205 int userId); 206 207 /** 208 * Internal api to query the suspended state of a package. 209 * @param packageName The package to check. 210 * @param userId The user id to check for. 211 * @return {@code true} if the package is suspended, {@code false} otherwise. 212 * @see PackageManager#isPackageSuspended(String) 213 */ 214 public abstract boolean isPackageSuspended(String packageName, int userId); 215 216 /** 217 * Get the name of the package that suspended the given package. Packages can be suspended by 218 * device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or 219 * {@link android.Manifest.permission#SUSPEND_APPS}. 220 * 221 * @param suspendedPackage The package that has been suspended. 222 * @param userId The user for which to check. 223 * @return Name of the package that suspended the given package. Returns {@code null} if the 224 * given package is not currently suspended and the platform package name - i.e. 225 * {@code "android"} - if the package was suspended by a device admin. 226 */ 227 public abstract String getSuspendingPackage(String suspendedPackage, int userId); 228 229 /** 230 * Get the dialog message to be shown to the user when they try to launch a suspended 231 * application. 232 * 233 * @param suspendedPackage The package that has been suspended. 234 * @param userId The user for which to check. 235 * @return The dialog message to be shown to the user. 236 */ 237 public abstract String getSuspendedDialogMessage(String suspendedPackage, int userId); 238 239 /** 240 * Do a straight uid lookup for the given package/application in the given user. 241 * @see PackageManager#getPackageUidAsUser(String, int, int) 242 * @return The app's uid, or < 0 if the package was not found in that user 243 */ 244 public abstract int getPackageUid(String packageName, 245 @PackageInfoFlags int flags, int userId); 246 247 /** 248 * Retrieve all of the information we know about a particular package/application. 249 * @param filterCallingUid The results will be filtered in the context of this UID instead 250 * of the calling UID. 251 * @see PackageManager#getApplicationInfo(String, int) 252 */ 253 public abstract ApplicationInfo getApplicationInfo(String packageName, 254 @ApplicationInfoFlags int flags, int filterCallingUid, int userId); 255 256 /** 257 * Retrieve all of the information we know about a particular activity class. 258 * @param filterCallingUid The results will be filtered in the context of this UID instead 259 * of the calling UID. 260 * @see PackageManager#getActivityInfo(ComponentName, int) 261 */ 262 public abstract ActivityInfo getActivityInfo(ComponentName component, 263 @ComponentInfoFlags int flags, int filterCallingUid, int userId); 264 265 /** 266 * Retrieve all activities that can be performed for the given intent. 267 * @param filterCallingUid The results will be filtered in the context of this UID instead 268 * of the calling UID. 269 * @see PackageManager#queryIntentActivities(Intent, int) 270 */ 271 public abstract List<ResolveInfo> queryIntentActivities(Intent intent, 272 @ResolveInfoFlags int flags, int filterCallingUid, int userId); 273 274 /** 275 * Retrieve all services that can be performed for the given intent. 276 * @see PackageManager#queryIntentServices(Intent, int) 277 */ 278 public abstract List<ResolveInfo> queryIntentServices( 279 Intent intent, int flags, int callingUid, int userId); 280 281 /** 282 * Interface to {@link com.android.server.pm.PackageManagerService#getHomeActivitiesAsUser}. 283 */ 284 public abstract ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, 285 int userId); 286 287 /** 288 * @return The default home activity component name. 289 */ 290 public abstract ComponentName getDefaultHomeActivity(int userId); 291 292 /** 293 * Called by DeviceOwnerManagerService to set the package names of device owner and profile 294 * owners. 295 */ 296 public abstract void setDeviceAndProfileOwnerPackages( 297 int deviceOwnerUserId, String deviceOwner, SparseArray<String> profileOwners); 298 299 /** 300 * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}. 301 */ 302 public abstract boolean isPackageDataProtected(int userId, String packageName); 303 304 /** 305 * Returns {@code true} if a given package is installed as ephemeral. Otherwise, returns 306 * {@code false}. 307 */ 308 public abstract boolean isPackageEphemeral(int userId, String packageName); 309 310 /** 311 * Gets whether the package was ever launched. 312 * @param packageName The package name. 313 * @param userId The user for which to check. 314 * @return Whether was launched. 315 * @throws IllegalArgumentException if the package is not found 316 */ 317 public abstract boolean wasPackageEverLaunched(String packageName, int userId); 318 319 /** 320 * Grants a runtime permission 321 * @param packageName The package name. 322 * @param name The name of the permission. 323 * @param userId The userId for which to grant the permission. 324 * @param overridePolicy If true, grant this permission even if it is fixed by policy. 325 */ 326 public abstract void grantRuntimePermission(String packageName, String name, int userId, 327 boolean overridePolicy); 328 329 /** 330 * Revokes a runtime permission 331 * @param packageName The package name. 332 * @param name The name of the permission. 333 * @param userId The userId for which to revoke the permission. 334 * @param overridePolicy If true, revoke this permission even if it is fixed by policy. 335 */ 336 public abstract void revokeRuntimePermission(String packageName, String name, int userId, 337 boolean overridePolicy); 338 339 /** 340 * Retrieve the official name associated with a uid. This name is 341 * guaranteed to never change, though it is possible for the underlying 342 * uid to be changed. That is, if you are storing information about 343 * uids in persistent storage, you should use the string returned 344 * by this function instead of the raw uid. 345 * 346 * @param uid The uid for which you would like to retrieve a name. 347 * @return Returns a unique name for the given uid, or null if the 348 * uid is not currently assigned. 349 */ 350 public abstract String getNameForUid(int uid); 351 352 /** 353 * Request to perform the second phase of ephemeral resolution. 354 * @param responseObj The response of the first phase of ephemeral resolution 355 * @param origIntent The original intent that triggered ephemeral resolution 356 * @param resolvedType The resolved type of the intent 357 * @param callingPackage The name of the package requesting the ephemeral application 358 * @param verificationBundle Optional bundle to pass to the installer for additional 359 * verification 360 * @param userId The ID of the user that triggered ephemeral resolution 361 */ 362 public abstract void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, 363 Intent origIntent, String resolvedType, String callingPackage, 364 Bundle verificationBundle, int userId); 365 366 /** 367 * Grants access to the package metadata for an ephemeral application. 368 * <p> 369 * When an ephemeral application explicitly tries to interact with a full 370 * install application [via an activity, service or provider that has been 371 * exposed using the {@code visibleToInstantApp} attribute], the normal 372 * application must be able to see metadata about the connecting ephemeral 373 * app. If the ephemeral application uses an implicit intent [ie action VIEW, 374 * category BROWSABLE], it remains hidden from the launched activity. 375 * <p> 376 * If the {@code sourceUid} is not for an ephemeral app or {@code targetUid} 377 * is not for a fully installed app, this method will be a no-op. 378 * 379 * @param userId the user 380 * @param intent the intent that triggered the grant 381 * @param targetAppId The app ID of the fully installed application 382 * @param ephemeralAppId The app ID of the ephemeral application 383 */ 384 public abstract void grantEphemeralAccess(int userId, Intent intent, 385 int targetAppId, int ephemeralAppId); 386 387 public abstract boolean isInstantAppInstallerComponent(ComponentName component); 388 /** 389 * Prunes instant apps and state associated with uninstalled 390 * instant apps according to the current platform policy. 391 */ 392 public abstract void pruneInstantApps(); 393 394 /** 395 * @return The SetupWizard package name. 396 */ 397 public abstract String getSetupWizardPackageName(); 398 399 public interface ExternalSourcesPolicy { 400 401 int USER_TRUSTED = 0; // User has trusted the package to install apps 402 int USER_BLOCKED = 1; // User has blocked the package to install apps 403 int USER_DEFAULT = 2; // Default code to use when user response is unavailable 404 405 /** 406 * Checks the user preference for whether a package is trusted to request installs through 407 * package installer 408 * 409 * @param packageName The package to check for 410 * @param uid the uid in which the package is running 411 * @return {@link USER_TRUSTED} if the user has trusted the package, {@link USER_BLOCKED} 412 * if user has blocked requests from the package, {@link USER_DEFAULT} if the user response 413 * is not yet available 414 */ 415 int getPackageTrustedToInstallApps(String packageName, int uid); 416 } 417 418 public abstract void setExternalSourcesPolicy(ExternalSourcesPolicy policy); 419 420 /** 421 * Return true if the given package is a persistent app process. 422 */ 423 public abstract boolean isPackagePersistent(String packageName); 424 425 /** 426 * Returns whether or not the given package represents a legacy system application released 427 * prior to runtime permissions. 428 */ 429 public abstract boolean isLegacySystemApp(PackageParser.Package pkg); 430 431 /** 432 * Get all overlay packages for a user. 433 * @param userId The user for which to get the overlays. 434 * @return A list of overlay packages. An empty list is returned if the 435 * user has no installed overlay packages. 436 */ 437 public abstract List<PackageInfo> getOverlayPackages(int userId); 438 439 /** 440 * Get the names of all target packages for a user. 441 * @param userId The user for which to get the package names. 442 * @return A list of target package names. This list includes the "android" package. 443 */ 444 public abstract List<String> getTargetPackageNames(int userId); 445 446 /** 447 * Set which overlay to use for a package. 448 * @param userId The user for which to update the overlays. 449 * @param targetPackageName The package name of the package for which to update the overlays. 450 * @param overlayPackageNames The complete list of overlay packages that should be enabled for 451 * the target. Previously enabled overlays not specified in the list 452 * will be disabled. Pass in null or an empty list to disable 453 * all overlays. The order of the items is significant if several 454 * overlays modify the same resource. 455 * @return true if all packages names were known by the package manager, false otherwise 456 */ 457 public abstract boolean setEnabledOverlayPackages(int userId, String targetPackageName, 458 List<String> overlayPackageNames); 459 460 /** 461 * Resolves an activity intent, allowing instant apps to be resolved. 462 */ 463 public abstract ResolveInfo resolveIntent(Intent intent, String resolvedType, 464 int flags, int userId, boolean resolveForStart); 465 466 /** 467 * Resolves a service intent, allowing instant apps to be resolved. 468 */ 469 public abstract ResolveInfo resolveService(Intent intent, String resolvedType, 470 int flags, int userId, int callingUid); 471 472 /** 473 * Resolves a content provider intent. 474 */ 475 public abstract ProviderInfo resolveContentProvider(String name, int flags, int userId); 476 477 /** 478 * Track the creator of a new isolated uid. 479 * @param isolatedUid The newly created isolated uid. 480 * @param ownerUid The uid of the app that created the isolated process. 481 */ 482 public abstract void addIsolatedUid(int isolatedUid, int ownerUid); 483 484 /** 485 * Track removal of an isolated uid. 486 * @param isolatedUid isolated uid that is no longer being used. 487 */ 488 public abstract void removeIsolatedUid(int isolatedUid); 489 490 /** 491 * Return the taget SDK version for the app with the given UID. 492 */ 493 public abstract int getUidTargetSdkVersion(int uid); 494 495 /** 496 * Return the taget SDK version for the app with the given package name. 497 */ 498 public abstract int getPackageTargetSdkVersion(String packageName); 499 500 /** Whether the binder caller can access instant apps. */ 501 public abstract boolean canAccessInstantApps(int callingUid, int userId); 502 503 /** Whether the binder caller can access the given component. */ 504 public abstract boolean canAccessComponent(int callingUid, ComponentName component, int userId); 505 506 /** 507 * Returns {@code true} if a given package has instant application meta-data. 508 * Otherwise, returns {@code false}. Meta-data is state (eg. cookie, app icon, etc) 509 * associated with an instant app. It may be kept after the instant app has been uninstalled. 510 */ 511 public abstract boolean hasInstantApplicationMetadata(String packageName, int userId); 512 513 /** 514 * Updates a package last used time. 515 */ 516 public abstract void notifyPackageUse(String packageName, int reason); 517 518 /** 519 * Returns a package object for the given package name. 520 */ 521 public abstract @Nullable PackageParser.Package getPackage(@NonNull String packageName); 522 523 /** 524 * Returns a list without a change observer. 525 * 526 * {@see #getPackageList(PackageListObserver)} 527 */ 528 public @NonNull PackageList getPackageList() { 529 return getPackageList(null); 530 } 531 532 /** 533 * Returns the list of packages installed at the time of the method call. 534 * <p>The given observer is notified when the list of installed packages 535 * changes [eg. a package was installed or uninstalled]. It will not be 536 * notified if a package is updated. 537 * <p>The package list will not be updated automatically as packages are 538 * installed / uninstalled. Any changes must be handled within the observer. 539 */ 540 public abstract @NonNull PackageList getPackageList(@Nullable PackageListObserver observer); 541 542 /** 543 * Removes the observer. 544 * <p>Generally not needed. {@link #getPackageList(PackageListObserver)} will automatically 545 * remove the observer. 546 * <p>Does nothing if the observer isn't currently registered. 547 * <p>Observers are notified asynchronously and it's possible for an observer to be 548 * invoked after its been removed. 549 */ 550 public abstract void removePackageListObserver(@NonNull PackageListObserver observer); 551 552 /** 553 * Returns a package object for the disabled system package name. 554 */ 555 public abstract @Nullable PackageParser.Package getDisabledPackage(@NonNull String packageName); 556 557 /** 558 * Returns whether or not the component is the resolver activity. 559 */ 560 public abstract boolean isResolveActivityComponent(@NonNull ComponentInfo component); 561 562 /** 563 * Returns the package name for a known package. 564 */ 565 public abstract @Nullable String getKnownPackageName( 566 @KnownPackage int knownPackage, int userId); 567 568 /** 569 * Returns whether the package is an instant app. 570 */ 571 public abstract boolean isInstantApp(String packageName, int userId); 572 573 /** 574 * Returns whether the package is an instant app. 575 */ 576 public abstract @Nullable String getInstantAppPackageName(int uid); 577 578 /** 579 * Returns whether or not access to the application should be filtered. 580 * <p> 581 * Access may be limited based upon whether the calling or target applications 582 * are instant applications. 583 * 584 * @see #canAccessInstantApps(int) 585 */ 586 public abstract boolean filterAppAccess( 587 @Nullable PackageParser.Package pkg, int callingUid, int userId); 588 589 /* 590 * NOTE: The following methods are temporary until permissions are extracted from 591 * the package manager into a component specifically for handling permissions. 592 */ 593 /** Returns the flags for the given permission. */ 594 public abstract @Nullable int getPermissionFlagsTEMP(@NonNull String permName, 595 @NonNull String packageName, int userId); 596 /** Updates the flags for the given permission. */ 597 public abstract void updatePermissionFlagsTEMP(@NonNull String permName, 598 @NonNull String packageName, int flagMask, int flagValues, int userId); 599 600 /** 601 * Returns true if it's still safe to restore data backed up from this app's version 602 * that was signed with restoringFromSigHash. 603 */ 604 public abstract boolean isDataRestoreSafe(@NonNull byte[] restoringFromSigHash, 605 @NonNull String packageName); 606 607 /** 608 * Returns true if it's still safe to restore data backed up from this app's version 609 * that was signed with restoringFromSig. 610 */ 611 public abstract boolean isDataRestoreSafe(@NonNull Signature restoringFromSig, 612 @NonNull String packageName); 613} 614