diff options
author | Alex Klyubin <klyubin@google.com> | 2015-02-11 12:37:12 -0800 |
---|---|---|
committer | Alex Klyubin <klyubin@google.com> | 2015-02-11 12:37:12 -0800 |
commit | 33d3c53da021f0d044028860ace0f4ad817273f5 (patch) | |
tree | 1ebd67dbfa35109595bd6258633abba7931f1290 /services | |
parent | c093955af1434a7023093acb148ab152d915e59c (diff) | |
parent | 517e0274cb2cfd215b20622280d5e256e8282bbb (diff) | |
download | frameworks_base-33d3c53da021f0d044028860ace0f4ad817273f5.zip frameworks_base-33d3c53da021f0d044028860ace0f4ad817273f5.tar.gz frameworks_base-33d3c53da021f0d044028860ace0f4ad817273f5.tar.bz2 |
resolved conflicts for merge of 517e0274 to lmp-mr1-dev-plus-aosp
Change-Id: Ic20b6c8851458483dd73a144bd5ae6e8d141e62a
Diffstat (limited to 'services')
13 files changed, 163 insertions, 75 deletions
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index c1e4994..4d7ebed 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -1865,7 +1865,8 @@ public class BackupManagerService { boolean tryBindTransport(ServiceInfo info) { try { PackageInfo packInfo = mPackageManager.getPackageInfo(info.packageName, 0); - if ((packInfo.applicationInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0) { + if ((packInfo.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) + != 0) { return bindTransport(info); } else { Slog.w(TAG, "Transport package " + info.packageName + " not privileged"); @@ -3196,7 +3197,7 @@ public class BackupManagerService { final boolean isSharedStorage = pkg.packageName.equals(SHARED_BACKUP_AGENT_PACKAGE); final boolean sendApk = mIncludeApks && !isSharedStorage - && ((app.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0) + && ((app.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) == 0) && ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0 || (app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0); diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 42a5195..17b4939 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -813,7 +813,8 @@ public class AppOpsService extends IAppOpsService.Stub { .getApplicationInfo(packageName, 0, UserHandle.getUserId(uid)); if (appInfo != null) { pkgUid = appInfo.uid; - isPrivileged = (appInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0; + isPrivileged = (appInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; } else { if ("media".equals(packageName)) { pkgUid = Process.MEDIA_UID; @@ -996,7 +997,8 @@ public class AppOpsService extends IAppOpsService.Stub { ApplicationInfo appInfo = ActivityThread.getPackageManager() .getApplicationInfo(pkgName, 0, UserHandle.getUserId(uid)); if (appInfo != null) { - isPrivileged = (appInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0; + isPrivileged = (appInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; } } else { // Could not load data, don't add to cache so it will be loaded later. diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index e52b2bf..9339b35 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -3083,7 +3083,8 @@ public class AccountManagerService try { PackageInfo packageInfo = userPackageManager.getPackageInfo(name, 0 /* flags */); if (packageInfo != null - && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0) { + && (packageInfo.applicationInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { return true; } } catch (PackageManager.NameNotFoundException e) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 32787d8..27c5404 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -881,7 +881,8 @@ public final class ActivityStackSupervisor implements DisplayListener { final long origId = Binder.clearCallingIdentity(); if (aInfo != null && - (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { + (aInfo.applicationInfo.privateFlags + &ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { // This may be a heavy-weight process! Check to see if we already // have another, different heavy-weight process running. if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { @@ -1052,8 +1053,8 @@ public final class ActivityStackSupervisor implements DisplayListener { aInfo = mService.getActivityInfoForUser(aInfo, userId); if (aInfo != null && - (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) - != 0) { + (aInfo.applicationInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { throw new IllegalArgumentException( "FLAG_CANT_SAVE_STATE not supported here"); } @@ -1184,7 +1185,7 @@ public final class ActivityStackSupervisor implements DisplayListener { r.icicle, r.persistentState, results, newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); - if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { + if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { // This may be a heavy-weight process! Note that the package // manager will ensure that only activity can run in the main // process of the .apk, which is the only thing that will be diff --git a/services/core/java/com/android/server/firewall/SenderFilter.java b/services/core/java/com/android/server/firewall/SenderFilter.java index c0eee69..0074119 100644 --- a/services/core/java/com/android/server/firewall/SenderFilter.java +++ b/services/core/java/com/android/server/firewall/SenderFilter.java @@ -45,7 +45,8 @@ class SenderFilter { IPackageManager pm = AppGlobals.getPackageManager(); try { - return (pm.getFlagsForUid(callerUid) & ApplicationInfo.FLAG_PRIVILEGED) != 0; + return (pm.getPrivateFlagsForUid(callerUid) & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) + != 0; } catch (RemoteException ex) { Slog.e(IntentFirewall.TAG, "Remote exception while retrieving uid flags", ex); diff --git a/services/core/java/com/android/server/pm/GrantedPermissions.java b/services/core/java/com/android/server/pm/GrantedPermissions.java index 8f0f935..e87546c 100644 --- a/services/core/java/com/android/server/pm/GrantedPermissions.java +++ b/services/core/java/com/android/server/pm/GrantedPermissions.java @@ -21,13 +21,15 @@ import android.util.ArraySet; class GrantedPermissions { int pkgFlags; + int pkgPrivateFlags; ArraySet<String> grantedPermissions = new ArraySet<String>(); int[] gids; - GrantedPermissions(int pkgFlags) { + GrantedPermissions(int pkgFlags, int pkgPrivateFlags) { setFlags(pkgFlags); + setPrivateFlags(pkgPrivateFlags); } @SuppressWarnings("unchecked") @@ -43,8 +45,12 @@ class GrantedPermissions { void setFlags(int pkgFlags) { this.pkgFlags = pkgFlags & (ApplicationInfo.FLAG_SYSTEM - | ApplicationInfo.FLAG_PRIVILEGED - | ApplicationInfo.FLAG_FORWARD_LOCK | ApplicationInfo.FLAG_EXTERNAL_STORAGE); } + + void setPrivateFlags(int pkgPrivateFlags) { + this.pkgPrivateFlags = pkgPrivateFlags + & (ApplicationInfo.PRIVATE_FLAG_PRIVILEGED + | ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK); + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index cdbca1c..4dc65c2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1299,17 +1299,17 @@ public class PackageManagerService extends IPackageManager.Stub { mMetrics = new DisplayMetrics(); mSettings = new Settings(context); mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); mSettings.addSharedUserLPw("android.uid.log", LOG_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID, - ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PRIVILEGED); + ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); // TODO: add a property to control this? long dexOptLRUThresholdInMinutes; @@ -2124,6 +2124,7 @@ public class PackageManagerService extends IPackageManager.Stub { 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.dataDir = getDataPathForPackage(packageName, 0).getPath(); pkg.applicationInfo.primaryCpuAbi = ps.primaryCpuAbiString; @@ -2966,7 +2967,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // reader synchronized (mPackages) { - final SharedUserSetting suid = mSettings.getSharedUserLPw(sharedUserName, 0, false); + final SharedUserSetting suid = mSettings.getSharedUserLPw(sharedUserName, 0, 0, false); if (suid == null) { return -1; } @@ -2990,6 +2991,21 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public int getPrivateFlagsForUid(int uid) { + synchronized (mPackages) { + Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); + if (obj instanceof SharedUserSetting) { + final SharedUserSetting sus = (SharedUserSetting) obj; + return sus.pkgPrivateFlags; + } else if (obj instanceof PackageSetting) { + final PackageSetting ps = (PackageSetting) obj; + return ps.pkgPrivateFlags; + } + } + return 0; + } + + @Override public boolean isUidPrivileged(int uid) { uid = UserHandle.getAppId(uid); // reader @@ -4288,9 +4304,9 @@ public class PackageManagerService extends IPackageManager.Stub { // If new package is not located in "/system/priv-app" (e.g. due to an OTA), // it needs to drop FLAG_PRIVILEGED. if (locationIsPrivileged(scanFile)) { - updatedPkg.pkgFlags |= ApplicationInfo.FLAG_PRIVILEGED; + updatedPkg.pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } else { - updatedPkg.pkgFlags &= ~ApplicationInfo.FLAG_PRIVILEGED; + updatedPkg.pkgPrivateFlags &= ~ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } if (ps != null && !ps.codePath.equals(scanFile)) { @@ -4354,7 +4370,7 @@ public class PackageManagerService extends IPackageManager.Stub { // An updated privileged app will not have the PARSE_IS_PRIVILEGED // flag set initially - if ((updatedPkg.pkgFlags & ApplicationInfo.FLAG_PRIVILEGED) != 0) { + if ((updatedPkg.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; } } @@ -5294,7 +5310,7 @@ public class PackageManagerService extends IPackageManager.Stub { } if ((parseFlags&PackageParser.PARSE_IS_PRIVILEGED) != 0) { - pkg.applicationInfo.flags |= ApplicationInfo.FLAG_PRIVILEGED; + pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } if (mCustomResolverComponentName != null && @@ -5368,7 +5384,7 @@ public class PackageManagerService extends IPackageManager.Stub { // writer synchronized (mPackages) { if (pkg.mSharedUserId != null) { - suid = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0, true); + suid = mSettings.getSharedUserLPw(pkg.mSharedUserId, 0, 0, true); if (suid == null) { throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Creating application package " + pkg.packageName @@ -5442,7 +5458,8 @@ public class PackageManagerService extends IPackageManager.Stub { destResourceFile, pkg.applicationInfo.nativeLibraryRootDir, pkg.applicationInfo.primaryCpuAbi, pkg.applicationInfo.secondaryCpuAbi, - pkg.applicationInfo.flags, user, false); + pkg.applicationInfo.flags, pkg.applicationInfo.privateFlags, + user, false); if (pkgSetting == null) { throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Creating application package " + pkg.packageName + " failed"); @@ -10337,7 +10354,8 @@ public class PackageManagerService extends IPackageManager.Stub { boolean disabledSystem = false; boolean updatedSettings = false; parseFlags |= PackageParser.PARSE_IS_SYSTEM; - if ((deletedPackage.applicationInfo.flags&ApplicationInfo.FLAG_PRIVILEGED) != 0) { + if ((deletedPackage.applicationInfo.privateFlags&ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) + != 0) { parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; } String packageName = deletedPackage.packageName; @@ -10695,15 +10713,15 @@ public class PackageManagerService extends IPackageManager.Stub { } private static boolean isForwardLocked(PackageParser.Package pkg) { - return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0; + return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0; } private static boolean isForwardLocked(ApplicationInfo info) { - return (info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0; + return (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0; } private boolean isForwardLocked(PackageSetting ps) { - return (ps.pkgFlags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0; + return (ps.pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0; } private static boolean isMultiArch(PackageSetting ps) { @@ -10731,7 +10749,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private static boolean isPrivilegedApp(PackageParser.Package pkg) { - return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PRIVILEGED) != 0; + return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; } private static boolean isSystemApp(ApplicationInfo info) { diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 696aa34..8ea0bee 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -32,10 +32,10 @@ final class PackageSetting extends PackageSettingBase { PackageSetting(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags) { + int pVersionCode, int pkgFlags, int privateFlags) { super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - pVersionCode, pkgFlags); + pVersionCode, pkgFlags, privateFlags); } /** @@ -62,6 +62,6 @@ final class PackageSetting extends PackageSettingBase { } public boolean isPrivileged() { - return (pkgFlags & ApplicationInfo.FLAG_PRIVILEGED) != 0; + return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; } } diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index 1dcadb4..4b8ca42 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -112,8 +112,8 @@ class PackageSettingBase extends GrantedPermissions { PackageSettingBase(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, - int pVersionCode, int pkgFlags) { - super(pkgFlags); + int pVersionCode, int pkgFlags, int pkgPrivateFlags) { + super(pkgFlags, pkgPrivateFlags); this.name = name; this.realName = realName; init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, diff --git a/services/core/java/com/android/server/pm/PendingPackage.java b/services/core/java/com/android/server/pm/PendingPackage.java index 5d30e76..bb0dba1 100644 --- a/services/core/java/com/android/server/pm/PendingPackage.java +++ b/services/core/java/com/android/server/pm/PendingPackage.java @@ -24,10 +24,10 @@ final class PendingPackage extends PackageSettingBase { PendingPackage(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, String cpuAbiOverrideString, int sharedId, - int pVersionCode, int pkgFlags) { + int pVersionCode, int pkgFlags, int pkgPrivateFlags) { super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - pVersionCode, pkgFlags); + pVersionCode, pkgFlags, pkgPrivateFlags); this.sharedId = sharedId; } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 524f638..d353494 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -281,11 +281,11 @@ final class Settings { PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage, String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbi, String secondaryCpuAbi, - int pkgFlags, UserHandle user, boolean add) { + int pkgFlags, int pkgPrivateFlags, UserHandle user, boolean add) { final String name = pkg.packageName; PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbi, secondaryCpuAbi, - pkg.mVersionCode, pkgFlags, user, add, true /* allowInstall */); + pkg.mVersionCode, pkgFlags, pkgPrivateFlags, user, add, true /* allowInstall */); return p; } @@ -311,13 +311,13 @@ final class Settings { } SharedUserSetting getSharedUserLPw(String name, - int pkgFlags, boolean create) { + int pkgFlags, int pkgPrivateFlags, boolean create) { SharedUserSetting s = mSharedUsers.get(name); if (s == null) { if (!create) { return null; } - s = new SharedUserSetting(name, pkgFlags); + s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags); s.userId = newUserIdLPw(s); Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId); // < 0 means we couldn't assign a userid; fall out and return @@ -373,7 +373,7 @@ final class Settings { PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, p.legacyNativeLibraryPathString, p.primaryCpuAbiString, p.secondaryCpuAbiString, p.secondaryCpuAbiString, - p.appId, p.versionCode, p.pkgFlags); + p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags); mDisabledSysPackages.remove(name); return ret; } @@ -388,7 +388,7 @@ final class Settings { PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, - String cpuAbiOverrideString, int uid, int vc, int pkgFlags) { + String cpuAbiOverrideString, int uid, int vc, int pkgFlags, int pkgPrivateFlags) { PackageSetting p = mPackages.get(name); if (p != null) { if (p.appId == uid) { @@ -400,7 +400,7 @@ final class Settings { } p = new PackageSetting(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - cpuAbiOverrideString, vc, pkgFlags); + cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags); p.appId = uid; if (addUserIdLPw(uid, p, name)) { mPackages.put(name, p); @@ -409,7 +409,7 @@ final class Settings { return null; } - SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) { + SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags, int pkgPrivateFlags) { SharedUserSetting s = mSharedUsers.get(name); if (s != null) { if (s.userId == uid) { @@ -419,7 +419,7 @@ final class Settings { "Adding duplicate shared user, keeping first: " + name); return null; } - s = new SharedUserSetting(name, pkgFlags); + s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags); s.userId = uid; if (addUserIdLPw(uid, s, name)) { mSharedUsers.put(name, s); @@ -469,7 +469,7 @@ final class Settings { private PackageSetting getPackageLPw(String name, PackageSetting origPackage, String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString, - int vc, int pkgFlags, UserHandle installUser, boolean add, + int vc, int pkgFlags, int pkgPrivateFlags, UserHandle installUser, boolean add, boolean allowInstall) { PackageSetting p = mPackages.get(name); UserManagerService userManager = UserManagerService.getInstance(); @@ -511,9 +511,8 @@ final class Settings { // If what we are scanning is a system (and possibly privileged) package, // then make it so, regardless of whether it was previously installed only // in the data partition. - final int sysPrivFlags = pkgFlags - & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_PRIVILEGED); - p.pkgFlags |= sysPrivFlags; + p.pkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM; + p.pkgPrivateFlags |= pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } } if (p == null) { @@ -521,7 +520,7 @@ final class Settings { // We are consuming the data from an existing package. p = new PackageSetting(origPackage.name, name, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - null /* cpuAbiOverrideString */, vc, pkgFlags); + null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags); if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name + " is adopting original package " + origPackage.name); // Note that we will retain the new package's signature so @@ -539,7 +538,7 @@ final class Settings { } else { p = new PackageSetting(name, realName, codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString, - null /* cpuAbiOverrideString */, vc, pkgFlags); + null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags); p.setTimeStamp(codePath.lastModified()); p.sharedUser = sharedUser; // If this is not a system app, it starts out stopped. @@ -1818,7 +1817,8 @@ final class Settings { serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString); } - serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags)); + serializer.attribute(null, "publicFlags", Integer.toString(pkg.pkgFlags)); + serializer.attribute(null, "privateFlags", Integer.toString(pkg.pkgPrivateFlags)); serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); @@ -2127,8 +2127,8 @@ final class Settings { PackageSetting p = getPackageLPw(pp.name, null, pp.realName, (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, pp.legacyNativeLibraryPathString, pp.primaryCpuAbiString, - pp.secondaryCpuAbiString, pp.versionCode, pp.pkgFlags, null, - true /* add */, false /* allowInstall */); + pp.secondaryCpuAbiString, pp.versionCode, pp.pkgFlags, pp.pkgPrivateFlags, + null, true /* add */, false /* allowInstall */); if (p == null) { PackageManagerService.reportSettingsProblem(Log.WARN, "Unable to create application package for " + pp.name); @@ -2596,14 +2596,15 @@ final class Settings { } int pkgFlags = 0; + int pkgPrivateFlags = 0; pkgFlags |= ApplicationInfo.FLAG_SYSTEM; final File codePathFile = new File(codePathStr); if (PackageManagerService.locationIsPrivileged(codePathFile)) { - pkgFlags |= ApplicationInfo.FLAG_PRIVILEGED; + pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; } PackageSetting ps = new PackageSetting(name, realName, codePathFile, new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiStr, - secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags); + secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags); String timeStampStr = parser.getAttributeValue(null, "ft"); if (timeStampStr != null) { try { @@ -2662,6 +2663,11 @@ final class Settings { mDisabledSysPackages.put(name, ps); } + private static int PRE_M_APP_INFO_FLAG_HIDDEN = 1<<27; + private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28; + private static int PRE_M_APP_INFO_FLAG_FORWARD_LOCK = 1<<29; + private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30; + private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { String name = null; String realName = null; @@ -2678,6 +2684,7 @@ final class Settings { String installerPackageName = null; String uidError = null; int pkgFlags = 0; + int pkgPrivateFlags = 0; long timeStamp = 0; long firstInstallTime = 0; long lastUpdateTime = 0; @@ -2713,22 +2720,54 @@ final class Settings { } installerPackageName = parser.getAttributeValue(null, "installer"); - systemStr = parser.getAttributeValue(null, "flags"); + systemStr = parser.getAttributeValue(null, "publicFlags"); if (systemStr != null) { try { pkgFlags = Integer.parseInt(systemStr); } catch (NumberFormatException e) { } + systemStr = parser.getAttributeValue(null, "privateFlags"); + if (systemStr != null) { + try { + pkgPrivateFlags = Integer.parseInt(systemStr); + } catch (NumberFormatException e) { + } + } } else { - // For backward compatibility - systemStr = parser.getAttributeValue(null, "system"); + // Pre-M -- both public and private flags were stored in one "flags" field. + systemStr = parser.getAttributeValue(null, "flags"); if (systemStr != null) { - pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM - : 0; + try { + pkgFlags = Integer.parseInt(systemStr); + } catch (NumberFormatException e) { + } + if ((pkgFlags & PRE_M_APP_INFO_FLAG_HIDDEN) != 0) { + pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN; + } + if ((pkgFlags & PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE) != 0) { + pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE; + } + if ((pkgFlags & PRE_M_APP_INFO_FLAG_FORWARD_LOCK) != 0) { + pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK; + } + if ((pkgFlags & PRE_M_APP_INFO_FLAG_PRIVILEGED) != 0) { + pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; + } + pkgFlags &= ~(PRE_M_APP_INFO_FLAG_HIDDEN + | PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE + | PRE_M_APP_INFO_FLAG_FORWARD_LOCK + | PRE_M_APP_INFO_FLAG_PRIVILEGED); } else { - // Old settings that don't specify system... just treat - // them as system, good enough. - pkgFlags |= ApplicationInfo.FLAG_SYSTEM; + // For backward compatibility + systemStr = parser.getAttributeValue(null, "system"); + if (systemStr != null) { + pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM + : 0; + } else { + // Old settings that don't specify system... just treat + // them as system, good enough. + pkgFlags |= ApplicationInfo.FLAG_SYSTEM; + } } } String timeStampStr = parser.getAttributeValue(null, "ft"); @@ -2781,7 +2820,8 @@ final class Settings { } else if (userId > 0) { packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString, - secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags); + secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags, + pkgPrivateFlags); if (PackageManagerService.DEBUG_SETTINGS) Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" + userId + " pkg=" + packageSetting); @@ -2800,7 +2840,7 @@ final class Settings { packageSetting = new PendingPackage(name.intern(), realName, new File( codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString, - userId, versionCode, pkgFlags); + userId, versionCode, pkgFlags, pkgPrivateFlags); packageSetting.setTimeStamp(timeStamp); packageSetting.firstInstallTime = firstInstallTime; packageSetting.lastUpdateTime = lastUpdateTime; @@ -2967,6 +3007,7 @@ final class Settings { String name = null; String idStr = null; int pkgFlags = 0; + int pkgPrivateFlags = 0; SharedUserSetting su = null; try { name = parser.getAttributeValue(null, ATTR_NAME); @@ -2985,7 +3026,8 @@ final class Settings { + " has bad userId " + idStr + " at " + parser.getPositionDescription()); } else { - if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) { + if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags, pkgPrivateFlags)) + == null) { PackageManagerService .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at " + parser.getPositionDescription()); @@ -3302,9 +3344,12 @@ final class Settings { ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION", ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE", ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP", - ApplicationInfo.FLAG_PRIVILEGED, "PRIVILEGED", - ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK", - ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", + }; + + static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] { + ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED", + ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK, "FORWARD_LOCK", + ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", }; void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag, PackageSetting ps, @@ -3391,6 +3436,8 @@ final class Settings { pw.println(ps.pkg.applicationInfo.toString()); pw.print(prefix); pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println(); + pw.print(prefix); pw.print(" priavateFlags="); printFlags(pw, + ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println(); pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); if (ps.pkg.mOperationPending) { pw.print(prefix); pw.println(" mOperationPending=true"); diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java index 2b406f7..d95739c 100644 --- a/services/core/java/com/android/server/pm/SharedUserSetting.java +++ b/services/core/java/com/android/server/pm/SharedUserSetting.java @@ -28,14 +28,16 @@ final class SharedUserSetting extends GrantedPermissions { // flags that are associated with this uid, regardless of any package flags int uidFlags; + int uidPrivateFlags; final ArraySet<PackageSetting> packages = new ArraySet<PackageSetting>(); final PackageSignatures signatures = new PackageSignatures(); - SharedUserSetting(String _name, int _pkgFlags) { - super(_pkgFlags); + SharedUserSetting(String _name, int _pkgFlags, int _pkgPrivateFlags) { + super(_pkgFlags, _pkgPrivateFlags); uidFlags = _pkgFlags; + uidPrivateFlags = _pkgPrivateFlags; name = _name; } @@ -55,12 +57,20 @@ final class SharedUserSetting extends GrantedPermissions { } setFlags(aggregatedFlags); } + if ((this.pkgPrivateFlags & packageSetting.pkgPrivateFlags) != 0) { + int aggregatedPrivateFlags = uidPrivateFlags; + for (PackageSetting ps : packages) { + aggregatedPrivateFlags |= ps.pkgPrivateFlags; + } + setPrivateFlags(aggregatedPrivateFlags); + } } } void addPackage(PackageSetting packageSetting) { if (packages.add(packageSetting)) { setFlags(this.pkgFlags | packageSetting.pkgFlags); + setPrivateFlags(this.pkgPrivateFlags | packageSetting.pkgPrivateFlags); } } } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index d484b8f..f84cb30 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1592,7 +1592,8 @@ public class UserManagerService extends IUserManager.Stub { try { for (ApplicationInfo appInfo : apps) { if ((appInfo.flags & ApplicationInfo.FLAG_INSTALLED) != 0 - && (appInfo.flags & ApplicationInfo.FLAG_HIDDEN) != 0) { + && (appInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_HIDDEN) + != 0) { mPm.setApplicationHiddenSettingAsUser(appInfo.packageName, false, userHandle); } |