Loading core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ public abstract class PackageManager { MATCH_DISABLED_COMPONENTS, MATCH_DISABLED_UNTIL_USED_COMPONENTS, MATCH_SYSTEM_ONLY, MATCH_FACTORY_ONLY, MATCH_DEBUG_TRIAGED_MISSING, }) @Retention(RetentionPolicy.SOURCE) Loading Loading @@ -414,6 +415,13 @@ public abstract class PackageManager { */ public static final int MATCH_SYSTEM_ONLY = 0x00100000; /** * Internal {@link PackageInfo} flag: include only components on the system image. * This will not return information on any unbundled update to system components. * @hide */ public static final int MATCH_FACTORY_ONLY = 0x00200000; /** * Internal flag used to indicate that a system component has done their * homework and verified that they correctly handle packages and components Loading services/core/java/com/android/server/pm/PackageManagerService.java +33 −40 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; 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_DEVICE_ADMIN; Loading Loading @@ -2886,12 +2887,15 @@ public class PackageManagerService extends IPackageManager.Stub { return cur; } PackageInfo generatePackageInfo(PackageParser.Package p, int flags, int userId) { private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) { if (!sUserManager.exists(userId)) return null; final PackageSetting ps = (PackageSetting) p.mExtras; if (ps == null) { return null; } final PackageParser.Package p = ps.pkg; if (p == null) { return null; } final PermissionsState permissionsState = ps.getPermissionsState(); Loading Loading @@ -2961,14 +2965,28 @@ public class PackageManagerService extends IPackageManager.Stub { false /* requireFullPermission */, false /* checkShell */, "get package info"); // reader synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); final boolean matchFactoryOnly = (flags & MATCH_FACTORY_ONLY) != 0; PackageParser.Package p = null; if (matchFactoryOnly) { final PackageSetting ps = mSettings.getDisabledSystemPkgLPr(packageName); if (ps != null) { return generatePackageInfo(ps, flags, userId); } } if (p == null) { p = mPackages.get(packageName); if (matchFactoryOnly && !isSystemApp(p)) { return null; } } if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getPackageInfo " + packageName + ": " + p); if (p != null) { return generatePackageInfo(p, flags, userId); return generatePackageInfo((PackageSetting)p.mExtras, flags, userId); } if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); if (!matchFactoryOnly && (flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); return generatePackageInfo(ps, flags, userId); } } return null; Loading Loading @@ -3129,8 +3147,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { if (ps.pkg == null) { PackageInfo pInfo = generatePackageInfoFromSettingsLPw(packageName, flags, userId); final PackageInfo pInfo = generatePackageInfo(ps, flags, userId); if (pInfo != null) { return pInfo.applicationInfo; } Loading @@ -3142,31 +3159,6 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private PackageInfo generatePackageInfoFromSettingsLPw(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { PackageParser.Package pkg = ps.pkg; if (pkg == null) { if ((flags & MATCH_UNINSTALLED_PACKAGES) == 0) { return null; } // Only data remains, so we aren't worried about code paths pkg = new PackageParser.Package(packageName); pkg.applicationInfo.packageName = packageName; pkg.applicationInfo.flags = ps.pkgFlags | ApplicationInfo.FLAG_IS_DATA_ONLY; pkg.applicationInfo.privateFlags = ps.pkgPrivateFlags; pkg.applicationInfo.uid = ps.appId; pkg.applicationInfo.initForUser(userId); pkg.applicationInfo.primaryCpuAbi = ps.primaryCpuAbiString; pkg.applicationInfo.secondaryCpuAbi = ps.secondaryCpuAbiString; } return generatePackageInfo(pkg, flags, userId); } return null; } @Override public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; Loading Loading @@ -5915,11 +5907,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (listUninstalled) { list = new ArrayList<PackageInfo>(mSettings.mPackages.size()); for (PackageSetting ps : mSettings.mPackages.values()) { PackageInfo pi; final PackageInfo pi; if (ps.pkg != null) { pi = generatePackageInfo(ps.pkg, flags, userId); pi = generatePackageInfo(ps, flags, userId); } else { pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId); pi = generatePackageInfo(ps, flags, userId); } if (pi != null) { list.add(pi); Loading @@ -5928,7 +5920,8 @@ public class PackageManagerService extends IPackageManager.Stub { } else { list = new ArrayList<PackageInfo>(mPackages.size()); for (PackageParser.Package p : mPackages.values()) { PackageInfo pi = generatePackageInfo(p, flags, userId); final PackageInfo pi = generatePackageInfo((PackageSetting)p.mExtras, flags, userId); if (pi != null) { list.add(pi); } Loading @@ -5955,11 +5948,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (numMatch == 0) { return; } PackageInfo pi; final PackageInfo pi; if (ps.pkg != null) { pi = generatePackageInfo(ps.pkg, flags, userId); pi = generatePackageInfo(ps, flags, userId); } else { pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId); pi = generatePackageInfo(ps, flags, userId); } // The above might return null in cases of uninstalled apps or install-state // skew across users/profiles. Loading Loading
core/java/android/content/pm/PackageManager.java +8 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,7 @@ public abstract class PackageManager { MATCH_DISABLED_COMPONENTS, MATCH_DISABLED_UNTIL_USED_COMPONENTS, MATCH_SYSTEM_ONLY, MATCH_FACTORY_ONLY, MATCH_DEBUG_TRIAGED_MISSING, }) @Retention(RetentionPolicy.SOURCE) Loading Loading @@ -414,6 +415,13 @@ public abstract class PackageManager { */ public static final int MATCH_SYSTEM_ONLY = 0x00100000; /** * Internal {@link PackageInfo} flag: include only components on the system image. * This will not return information on any unbundled update to system components. * @hide */ public static final int MATCH_FACTORY_ONLY = 0x00200000; /** * Internal flag used to indicate that a system component has done their * homework and verified that they correctly handle packages and components Loading
services/core/java/com/android/server/pm/PackageManagerService.java +33 −40 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; 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_DEVICE_ADMIN; Loading Loading @@ -2886,12 +2887,15 @@ public class PackageManagerService extends IPackageManager.Stub { return cur; } PackageInfo generatePackageInfo(PackageParser.Package p, int flags, int userId) { private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) { if (!sUserManager.exists(userId)) return null; final PackageSetting ps = (PackageSetting) p.mExtras; if (ps == null) { return null; } final PackageParser.Package p = ps.pkg; if (p == null) { return null; } final PermissionsState permissionsState = ps.getPermissionsState(); Loading Loading @@ -2961,14 +2965,28 @@ public class PackageManagerService extends IPackageManager.Stub { false /* requireFullPermission */, false /* checkShell */, "get package info"); // reader synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); final boolean matchFactoryOnly = (flags & MATCH_FACTORY_ONLY) != 0; PackageParser.Package p = null; if (matchFactoryOnly) { final PackageSetting ps = mSettings.getDisabledSystemPkgLPr(packageName); if (ps != null) { return generatePackageInfo(ps, flags, userId); } } if (p == null) { p = mPackages.get(packageName); if (matchFactoryOnly && !isSystemApp(p)) { return null; } } if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getPackageInfo " + packageName + ": " + p); if (p != null) { return generatePackageInfo(p, flags, userId); return generatePackageInfo((PackageSetting)p.mExtras, flags, userId); } if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); if (!matchFactoryOnly && (flags & MATCH_UNINSTALLED_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); return generatePackageInfo(ps, flags, userId); } } return null; Loading Loading @@ -3129,8 +3147,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { if (ps.pkg == null) { PackageInfo pInfo = generatePackageInfoFromSettingsLPw(packageName, flags, userId); final PackageInfo pInfo = generatePackageInfo(ps, flags, userId); if (pInfo != null) { return pInfo.applicationInfo; } Loading @@ -3142,31 +3159,6 @@ public class PackageManagerService extends IPackageManager.Stub { return null; } private PackageInfo generatePackageInfoFromSettingsLPw(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { PackageParser.Package pkg = ps.pkg; if (pkg == null) { if ((flags & MATCH_UNINSTALLED_PACKAGES) == 0) { return null; } // Only data remains, so we aren't worried about code paths pkg = new PackageParser.Package(packageName); pkg.applicationInfo.packageName = packageName; pkg.applicationInfo.flags = ps.pkgFlags | ApplicationInfo.FLAG_IS_DATA_ONLY; pkg.applicationInfo.privateFlags = ps.pkgPrivateFlags; pkg.applicationInfo.uid = ps.appId; pkg.applicationInfo.initForUser(userId); pkg.applicationInfo.primaryCpuAbi = ps.primaryCpuAbiString; pkg.applicationInfo.secondaryCpuAbi = ps.secondaryCpuAbiString; } return generatePackageInfo(pkg, flags, userId); } return null; } @Override public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; Loading Loading @@ -5915,11 +5907,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (listUninstalled) { list = new ArrayList<PackageInfo>(mSettings.mPackages.size()); for (PackageSetting ps : mSettings.mPackages.values()) { PackageInfo pi; final PackageInfo pi; if (ps.pkg != null) { pi = generatePackageInfo(ps.pkg, flags, userId); pi = generatePackageInfo(ps, flags, userId); } else { pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId); pi = generatePackageInfo(ps, flags, userId); } if (pi != null) { list.add(pi); Loading @@ -5928,7 +5920,8 @@ public class PackageManagerService extends IPackageManager.Stub { } else { list = new ArrayList<PackageInfo>(mPackages.size()); for (PackageParser.Package p : mPackages.values()) { PackageInfo pi = generatePackageInfo(p, flags, userId); final PackageInfo pi = generatePackageInfo((PackageSetting)p.mExtras, flags, userId); if (pi != null) { list.add(pi); } Loading @@ -5955,11 +5948,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (numMatch == 0) { return; } PackageInfo pi; final PackageInfo pi; if (ps.pkg != null) { pi = generatePackageInfo(ps.pkg, flags, userId); pi = generatePackageInfo(ps, flags, userId); } else { pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId); pi = generatePackageInfo(ps, flags, userId); } // The above might return null in cases of uninstalled apps or install-state // skew across users/profiles. Loading