Loading core/java/android/content/pm/ResolveInfo.java +2 −1 Original line number Diff line number Diff line Loading @@ -172,7 +172,8 @@ public class ResolveInfo implements Parcelable { */ public boolean handleAllWebDataURI; private ComponentInfo getComponentInfo() { /** {@hide} */ public ComponentInfo getComponentInfo() { if (activityInfo != null) return activityInfo; if (serviceInfo != null) return serviceInfo; if (providerInfo != null) return providerInfo; Loading services/core/java/com/android/server/pm/PackageManagerService.java +68 −130 Original line number Diff line number Diff line Loading @@ -59,6 +59,10 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.content.pm.PackageManager.MATCH_ALL; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST; import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; Loading Loading @@ -88,6 +92,8 @@ import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCES import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppGlobals; Loading Loading @@ -2426,113 +2432,60 @@ public class PackageManagerService extends IPackageManager.Stub { return mIsUpgrade; } private String getRequiredVerifierLPr() { final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); // We only care about verifier that's installed under system user. final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); private @NonNull String getRequiredVerifierLPr() { final Intent intent = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); String requiredVerifier = null; final int N = receivers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = receivers.get(i); if (info.activityInfo == null) { continue; final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 1) { return matches.get(0).getComponentInfo().packageName; } else { throw new RuntimeException("There must be exactly one verifier; found " + matches); } final String packageName = info.activityInfo.packageName; if (checkPermission(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; } if (requiredVerifier != null) { throw new RuntimeException("There can be only one required verifier"); } private @NonNull String getRequiredInstallerLPr() { final Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); requiredVerifier = packageName; final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 1) { return matches.get(0).getComponentInfo().packageName; } else { throw new RuntimeException("There must be exactly one installer; found " + matches); } return requiredVerifier; } private String getRequiredInstallerLPr() { Intent installerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE); installerIntent.addCategory(Intent.CATEGORY_DEFAULT); installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); final List<ResolveInfo> installers = queryIntentActivities(installerIntent, PACKAGE_MIME_TYPE, 0, UserHandle.USER_SYSTEM); private @NonNull ComponentName getIntentFilterVerifierComponentNameLPr() { final Intent intent = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); String requiredInstaller = null; final int N = installers.size(); final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); ResolveInfo best = null; final int N = matches.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = installers.get(i); final String packageName = info.activityInfo.packageName; if (!info.activityInfo.applicationInfo.isSystemApp()) { continue; } if (requiredInstaller != null) { throw new RuntimeException("There must be one required installer"); } requiredInstaller = packageName; } if (requiredInstaller == null) { throw new RuntimeException("There must be one required installer"); } return requiredInstaller; } private ComponentName getIntentFilterVerifierComponentNameLPr() { final Intent verification = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); ComponentName verifierComponentName = null; int priority = -1000; final int N = receivers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = receivers.get(i); if (info.activityInfo == null) { continue; } final String packageName = info.activityInfo.packageName; final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { continue; } final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; if (checkPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; } // Select the IntentFilterVerifier with the highest priority if (priority < info.priority) { priority = info.priority; verifierComponentName = new ComponentName(packageName, info.activityInfo.name); if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Selecting IntentFilterVerifier: " + verifierComponentName + " with priority: " + info.priority); if (best == null || cur.priority > best.priority) { best = cur; } } return verifierComponentName; if (best != null) { return best.getComponentInfo().getComponentName(); } else { throw new RuntimeException("There must be at least one intent filter verifier"); } } private ComponentName getEphemeralResolverLPr() { private @Nullable ComponentName getEphemeralResolverLPr() { final String[] packageArray = mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage); if (packageArray.length == 0) { Loading @@ -2542,9 +2495,9 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, null /*resolvedType*/, 0 /*flags*/, UserHandle.USER_SYSTEM); final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, null, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); final int N = resolvers.size(); if (N == 0) { Loading Loading @@ -2583,36 +2536,21 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private ComponentName getEphemeralInstallerLPr() { Intent installerIntent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); installerIntent.addCategory(Intent.CATEGORY_DEFAULT); installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); final List<ResolveInfo> installers = queryIntentActivities(installerIntent, PACKAGE_MIME_TYPE, 0 /*flags*/, 0 /*userId*/); private @Nullable ComponentName getEphemeralInstallerLPr() { final Intent intent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); ComponentName ephemeralInstaller = null; final int N = installers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = installers.get(i); final String packageName = info.activityInfo.packageName; if (!info.activityInfo.applicationInfo.isSystemApp()) { if (DEBUG_EPHEMERAL) { Slog.d(TAG, "Ephemeral installer is not system app;" + " pkg: " + packageName + ", info:" + info); } continue; } if (ephemeralInstaller != null) { throw new RuntimeException("There must only be one ephemeral installer"); } ephemeralInstaller = new ComponentName(packageName, info.activityInfo.name); final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 0) { return null; } else if (matches.size() == 1) { return matches.get(0).getComponentInfo().getComponentName(); } else { throw new RuntimeException( "There must be at most one ephemeral installer; found " + matches); } return ephemeralInstaller; } private void primeDomainVerificationsLPw(int userId) { Loading Loading @@ -2857,7 +2795,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return generatePackageInfo(p, flags, userId); } if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); } } Loading Loading @@ -2907,7 +2845,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return UserHandle.getUid(userId, p.applicationInfo.uid); } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return UserHandle.getUid(userId, ps.appId); Loading Loading @@ -2937,7 +2875,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageSetting ps = (PackageSetting) p.mExtras; return ps.getPermissionsState().computeGids(userId); } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return ps.getPermissionsState().computeGids(userId); Loading Loading @@ -3045,7 +2983,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps != null) { PackageParser.Package pkg = ps.pkg; if (pkg == null) { if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) == 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) == 0) { return null; } // Only data remains, so we aren't worried about code paths Loading Loading @@ -3084,7 +3022,7 @@ public class PackageManagerService extends IPackageManager.Stub { if ("android".equals(packageName)||"system".equals(packageName)) { return mAndroidApplication; } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generateApplicationInfoFromSettingsLPw(packageName, flags, userId); } } Loading Loading @@ -4688,7 +4626,7 @@ public class PackageManagerService extends IPackageManager.Stub { ppa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } final ActivityInfo ai = getActivityInfo(ppa.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found persistent preferred activity:"); if (ai != null) { Loading Loading @@ -4797,7 +4735,7 @@ public class PackageManagerService extends IPackageManager.Stub { continue; } final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found preferred activity:"); if (ai != null) { Loading Loading @@ -5713,7 +5651,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, null); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "get installed packages"); // writer Loading Loading @@ -5794,7 +5732,7 @@ public class PackageManagerService extends IPackageManager.Stub { String[] permissions, int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, permissions); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { Loading Loading @@ -5822,7 +5760,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForApplication(flags, userId, null); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { Loading Loading @@ -11263,9 +11201,9 @@ public class PackageManagerService extends IPackageManager.Stub { PACKAGE_MIME_TYPE); verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Query all live verifiers based on current user state final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, verifierUser.getIdentifier()); PACKAGE_MIME_TYPE, 0, verifierUser.getIdentifier()); if (DEBUG_VERIFY) { Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent " Loading services/core/java/com/android/server/pm/Settings.java +45 −40 Original line number Diff line number Diff line Loading @@ -16,23 +16,42 @@ package com.android.server.pm; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.os.Process.SYSTEM_UID; import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.os.Process.PACKAGE_INFO_GID; import static android.os.Process.SYSTEM_UID; import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION; import android.annotation.NonNull; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.PackageCleanItem; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PackageUserState; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.net.Uri; import android.os.Binder; import android.os.Build; Loading @@ -47,11 +66,18 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.AtomicFile; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; import android.util.Log; import android.util.LogPrinter; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.SparseLongArray; import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; Loading @@ -65,58 +91,37 @@ import com.android.server.backup.PreferredActivityBackupHelper; import com.android.server.pm.PackageManagerService.DumpState; import com.android.server.pm.PermissionsState.PermissionState; import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Collection; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.PackageCleanItem; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PermissionInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.PackageUserState; import android.content.pm.VerifierDeviceIdentity; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.Xml; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.Map.Entry; import libcore.io.IoUtils; /** * Holds information about dynamic settings. Loading Loading @@ -2857,7 +2862,7 @@ final class Settings { for (int i=0; i<tmpPa.countCategories(); i++) { String cat = tmpPa.getCategory(i); if (cat.equals(Intent.CATEGORY_DEFAULT)) { flags |= PackageManager.MATCH_DEFAULT_ONLY; flags |= MATCH_DEFAULT_ONLY; } else { intent.addCategory(cat); } Loading Loading @@ -3007,7 +3012,7 @@ final class Settings { filter.addCategory(cat); } } if ((flags&PackageManager.MATCH_DEFAULT_ONLY) != 0) { if ((flags & MATCH_DEFAULT_ONLY) != 0) { filter.addCategory(Intent.CATEGORY_DEFAULT); } if (scheme != null) { Loading Loading @@ -3799,7 +3804,7 @@ final class Settings { } private boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) { if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { if ((flags & MATCH_DISABLED_COMPONENTS) != 0) { return true; } final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); Loading @@ -3815,7 +3820,7 @@ final class Settings { return false; } PackageUserState ustate = packageSettings.readUserState(userId); if ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0) { if ((flags & MATCH_DISABLED_UNTIL_USED_COMPONENTS) != 0) { if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { return true; } Loading @@ -3839,16 +3844,16 @@ final class Settings { } private boolean isMatchLPr(ComponentInfo componentInfo, int flags) { if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) { if ((flags & MATCH_SYSTEM_ONLY) != 0) { final PackageSetting ps = mPackages.get(componentInfo.packageName); if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { return false; } } final boolean matchesUnaware = ((flags & PackageManager.MATCH_ENCRYPTION_UNAWARE) != 0) final boolean matchesUnaware = ((flags & MATCH_ENCRYPTION_UNAWARE) != 0) && !componentInfo.encryptionAware; final boolean matchesAware = ((flags & PackageManager.MATCH_ENCRYPTION_AWARE) != 0) final boolean matchesAware = ((flags & MATCH_ENCRYPTION_AWARE) != 0) && componentInfo.encryptionAware; return matchesUnaware || matchesAware; } Loading Loading
core/java/android/content/pm/ResolveInfo.java +2 −1 Original line number Diff line number Diff line Loading @@ -172,7 +172,8 @@ public class ResolveInfo implements Parcelable { */ public boolean handleAllWebDataURI; private ComponentInfo getComponentInfo() { /** {@hide} */ public ComponentInfo getComponentInfo() { if (activityInfo != null) return activityInfo; if (serviceInfo != null) return serviceInfo; if (providerInfo != null) return providerInfo; Loading
services/core/java/com/android/server/pm/PackageManagerService.java +68 −130 Original line number Diff line number Diff line Loading @@ -59,6 +59,10 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.content.pm.PackageManager.MATCH_ALL; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST; import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; Loading Loading @@ -88,6 +92,8 @@ import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCES import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppGlobals; Loading Loading @@ -2426,113 +2432,60 @@ public class PackageManagerService extends IPackageManager.Stub { return mIsUpgrade; } private String getRequiredVerifierLPr() { final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); // We only care about verifier that's installed under system user. final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); private @NonNull String getRequiredVerifierLPr() { final Intent intent = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); String requiredVerifier = null; final int N = receivers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = receivers.get(i); if (info.activityInfo == null) { continue; final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 1) { return matches.get(0).getComponentInfo().packageName; } else { throw new RuntimeException("There must be exactly one verifier; found " + matches); } final String packageName = info.activityInfo.packageName; if (checkPermission(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; } if (requiredVerifier != null) { throw new RuntimeException("There can be only one required verifier"); } private @NonNull String getRequiredInstallerLPr() { final Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); requiredVerifier = packageName; final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 1) { return matches.get(0).getComponentInfo().packageName; } else { throw new RuntimeException("There must be exactly one installer; found " + matches); } return requiredVerifier; } private String getRequiredInstallerLPr() { Intent installerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE); installerIntent.addCategory(Intent.CATEGORY_DEFAULT); installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); final List<ResolveInfo> installers = queryIntentActivities(installerIntent, PACKAGE_MIME_TYPE, 0, UserHandle.USER_SYSTEM); private @NonNull ComponentName getIntentFilterVerifierComponentNameLPr() { final Intent intent = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); String requiredInstaller = null; final int N = installers.size(); final List<ResolveInfo> matches = queryIntentReceivers(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); ResolveInfo best = null; final int N = matches.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = installers.get(i); final String packageName = info.activityInfo.packageName; if (!info.activityInfo.applicationInfo.isSystemApp()) { continue; } if (requiredInstaller != null) { throw new RuntimeException("There must be one required installer"); } requiredInstaller = packageName; } if (requiredInstaller == null) { throw new RuntimeException("There must be one required installer"); } return requiredInstaller; } private ComponentName getIntentFilterVerifierComponentNameLPr() { final Intent verification = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, UserHandle.USER_SYSTEM); ComponentName verifierComponentName = null; int priority = -1000; final int N = receivers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = receivers.get(i); if (info.activityInfo == null) { continue; } final String packageName = info.activityInfo.packageName; final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { continue; } final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; if (checkPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; } // Select the IntentFilterVerifier with the highest priority if (priority < info.priority) { priority = info.priority; verifierComponentName = new ComponentName(packageName, info.activityInfo.name); if (DEBUG_DOMAIN_VERIFICATION) Slog.d(TAG, "Selecting IntentFilterVerifier: " + verifierComponentName + " with priority: " + info.priority); if (best == null || cur.priority > best.priority) { best = cur; } } return verifierComponentName; if (best != null) { return best.getComponentInfo().getComponentName(); } else { throw new RuntimeException("There must be at least one intent filter verifier"); } } private ComponentName getEphemeralResolverLPr() { private @Nullable ComponentName getEphemeralResolverLPr() { final String[] packageArray = mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage); if (packageArray.length == 0) { Loading @@ -2542,9 +2495,9 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, null /*resolvedType*/, 0 /*flags*/, UserHandle.USER_SYSTEM); final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE); final List<ResolveInfo> resolvers = queryIntentServices(resolverIntent, null, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); final int N = resolvers.size(); if (N == 0) { Loading Loading @@ -2583,36 +2536,21 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private ComponentName getEphemeralInstallerLPr() { Intent installerIntent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); installerIntent.addCategory(Intent.CATEGORY_DEFAULT); installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); final List<ResolveInfo> installers = queryIntentActivities(installerIntent, PACKAGE_MIME_TYPE, 0 /*flags*/, 0 /*userId*/); private @Nullable ComponentName getEphemeralInstallerLPr() { final Intent intent = new Intent(Intent.ACTION_INSTALL_EPHEMERAL_PACKAGE); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE); ComponentName ephemeralInstaller = null; final int N = installers.size(); for (int i = 0; i < N; i++) { final ResolveInfo info = installers.get(i); final String packageName = info.activityInfo.packageName; if (!info.activityInfo.applicationInfo.isSystemApp()) { if (DEBUG_EPHEMERAL) { Slog.d(TAG, "Ephemeral installer is not system app;" + " pkg: " + packageName + ", info:" + info); } continue; } if (ephemeralInstaller != null) { throw new RuntimeException("There must only be one ephemeral installer"); } ephemeralInstaller = new ComponentName(packageName, info.activityInfo.name); final List<ResolveInfo> matches = queryIntentActivities(intent, PACKAGE_MIME_TYPE, MATCH_SYSTEM_ONLY | MATCH_ENCRYPTION_AWARE_AND_UNAWARE, UserHandle.USER_SYSTEM); if (matches.size() == 0) { return null; } else if (matches.size() == 1) { return matches.get(0).getComponentInfo().getComponentName(); } else { throw new RuntimeException( "There must be at most one ephemeral installer; found " + matches); } return ephemeralInstaller; } private void primeDomainVerificationsLPw(int userId) { Loading Loading @@ -2857,7 +2795,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return generatePackageInfo(p, flags, userId); } if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); } } Loading Loading @@ -2907,7 +2845,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (p != null) { return UserHandle.getUid(userId, p.applicationInfo.uid); } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return UserHandle.getUid(userId, ps.appId); Loading Loading @@ -2937,7 +2875,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageSetting ps = (PackageSetting) p.mExtras; return ps.getPermissionsState().computeGids(userId); } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { return ps.getPermissionsState().computeGids(userId); Loading Loading @@ -3045,7 +2983,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps != null) { PackageParser.Package pkg = ps.pkg; if (pkg == null) { if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) == 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) == 0) { return null; } // Only data remains, so we aren't worried about code paths Loading Loading @@ -3084,7 +3022,7 @@ public class PackageManagerService extends IPackageManager.Stub { if ("android".equals(packageName)||"system".equals(packageName)) { return mAndroidApplication; } if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generateApplicationInfoFromSettingsLPw(packageName, flags, userId); } } Loading Loading @@ -4688,7 +4626,7 @@ public class PackageManagerService extends IPackageManager.Stub { ppa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), " "); } final ActivityInfo ai = getActivityInfo(ppa.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found persistent preferred activity:"); if (ai != null) { Loading Loading @@ -4797,7 +4735,7 @@ public class PackageManagerService extends IPackageManager.Stub { continue; } final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, flags | PackageManager.GET_DISABLED_COMPONENTS, userId); flags | MATCH_DISABLED_COMPONENTS, userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found preferred activity:"); if (ai != null) { Loading Loading @@ -5713,7 +5651,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, null); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "get installed packages"); // writer Loading Loading @@ -5794,7 +5732,7 @@ public class PackageManagerService extends IPackageManager.Stub { String[] permissions, int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, permissions); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { Loading Loading @@ -5822,7 +5760,7 @@ public class PackageManagerService extends IPackageManager.Stub { public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) { if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForApplication(flags, userId, null); final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; final boolean listUninstalled = (flags & MATCH_UNINSTALLED_PACKAGES) != 0; // writer synchronized (mPackages) { Loading Loading @@ -11263,9 +11201,9 @@ public class PackageManagerService extends IPackageManager.Stub { PACKAGE_MIME_TYPE); verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Query all live verifiers based on current user state final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE, PackageManager.GET_DISABLED_COMPONENTS, verifierUser.getIdentifier()); PACKAGE_MIME_TYPE, 0, verifierUser.getIdentifier()); if (DEBUG_VERIFY) { Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent " Loading
services/core/java/com/android/server/pm/Settings.java +45 −40 Original line number Diff line number Diff line Loading @@ -16,23 +16,42 @@ package com.android.server.pm; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; import static android.os.Process.SYSTEM_UID; import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE; import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.os.Process.PACKAGE_INFO_GID; import static android.os.Process.SYSTEM_UID; import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION; import android.annotation.NonNull; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.PackageCleanItem; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PackageUserState; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.net.Uri; import android.os.Binder; import android.os.Build; Loading @@ -47,11 +66,18 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.AtomicFile; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; import android.util.Log; import android.util.LogPrinter; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.SparseLongArray; import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; Loading @@ -65,58 +91,37 @@ import com.android.server.backup.PreferredActivityBackupHelper; import com.android.server.pm.PackageManagerService.DumpState; import com.android.server.pm.PermissionsState.PermissionState; import java.io.BufferedInputStream; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Collection; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.PackageCleanItem; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PermissionInfo; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.content.pm.PackageUserState; import android.content.pm.VerifierDeviceIdentity; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.Xml; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.Map.Entry; import libcore.io.IoUtils; /** * Holds information about dynamic settings. Loading Loading @@ -2857,7 +2862,7 @@ final class Settings { for (int i=0; i<tmpPa.countCategories(); i++) { String cat = tmpPa.getCategory(i); if (cat.equals(Intent.CATEGORY_DEFAULT)) { flags |= PackageManager.MATCH_DEFAULT_ONLY; flags |= MATCH_DEFAULT_ONLY; } else { intent.addCategory(cat); } Loading Loading @@ -3007,7 +3012,7 @@ final class Settings { filter.addCategory(cat); } } if ((flags&PackageManager.MATCH_DEFAULT_ONLY) != 0) { if ((flags & MATCH_DEFAULT_ONLY) != 0) { filter.addCategory(Intent.CATEGORY_DEFAULT); } if (scheme != null) { Loading Loading @@ -3799,7 +3804,7 @@ final class Settings { } private boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) { if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { if ((flags & MATCH_DISABLED_COMPONENTS) != 0) { return true; } final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); Loading @@ -3815,7 +3820,7 @@ final class Settings { return false; } PackageUserState ustate = packageSettings.readUserState(userId); if ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0) { if ((flags & MATCH_DISABLED_UNTIL_USED_COMPONENTS) != 0) { if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { return true; } Loading @@ -3839,16 +3844,16 @@ final class Settings { } private boolean isMatchLPr(ComponentInfo componentInfo, int flags) { if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) { if ((flags & MATCH_SYSTEM_ONLY) != 0) { final PackageSetting ps = mPackages.get(componentInfo.packageName); if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { return false; } } final boolean matchesUnaware = ((flags & PackageManager.MATCH_ENCRYPTION_UNAWARE) != 0) final boolean matchesUnaware = ((flags & MATCH_ENCRYPTION_UNAWARE) != 0) && !componentInfo.encryptionAware; final boolean matchesAware = ((flags & PackageManager.MATCH_ENCRYPTION_AWARE) != 0) final boolean matchesAware = ((flags & MATCH_ENCRYPTION_AWARE) != 0) && componentInfo.encryptionAware; return matchesUnaware || matchesAware; } Loading