donut snapshot
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 06435c8..ee53274 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -56,12 +56,11 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.Signature;
-import android.content.res.CompatibilityInfo;
-import android.content.res.Configuration;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
+import android.os.Debug;
import android.os.HandlerThread;
import android.os.Parcel;
import android.os.RemoteException;
@@ -251,6 +250,9 @@
final HashMap<String, PackageParser.PermissionGroup> mPermissionGroups =
new HashMap<String, PackageParser.PermissionGroup>();
+ // Broadcast actions that are only available to the system.
+ final HashSet<String> mProtectedBroadcasts = new HashSet<String>();
+
boolean mSystemReady;
boolean mSafeMode;
boolean mHasSystemUidErrors;
@@ -260,7 +262,6 @@
final ResolveInfo mResolveInfo = new ResolveInfo();
ComponentName mResolveComponentName;
PackageParser.Package mPlatformPackage;
- private boolean mCompatibilityModeEnabled = true;
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
@@ -763,7 +764,7 @@
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (Config.LOGV) Log.v(
- TAG, "getApplicationInfo " + packageName
+ TAG, "getPackageInfo " + packageName
+ ": " + p);
if (p != null) {
return generatePackageInfo(p, flags);
@@ -794,7 +795,7 @@
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (Config.LOGV) Log.v(
- TAG, "getApplicationInfo " + packageName
+ TAG, "getPackageGids" + packageName
+ ": " + p);
if (p != null) {
final PackageSetting ps = (PackageSetting)p.mExtras;
@@ -892,11 +893,7 @@
+ ": " + p);
if (p != null) {
// Note: isEnabledLP() does not apply here - always return info
- ApplicationInfo appInfo = PackageParser.generateApplicationInfo(p, flags);
- if (!mCompatibilityModeEnabled) {
- appInfo.disableCompatibilityMode();
- }
- return appInfo;
+ return PackageParser.generateApplicationInfo(p, flags);
}
if ("android".equals(packageName)||"system".equals(packageName)) {
return mAndroidApplication;
@@ -1128,6 +1125,12 @@
}
}
+ public boolean isProtectedBroadcast(String actionName) {
+ synchronized (mPackages) {
+ return mProtectedBroadcasts.contains(actionName);
+ }
+ }
+
public int checkSignatures(String pkg1, String pkg2) {
synchronized (mPackages) {
PackageParser.Package p1 = mPackages.get(pkg1);
@@ -2039,8 +2042,9 @@
+ suid.userId + "): packages=" + suid.packages);
}
}
-
- // Just create the setting, don't add it yet
+
+ // Just create the setting, don't add it yet. For already existing packages
+ // the PkgSetting exists already and doesn't have to be created.
pkgSetting = mSettings.getPackageLP(pkg, suid, destCodeFile,
destResourceFile, pkg.applicationInfo.flags, true, false);
if (pkgSetting == null) {
@@ -2265,7 +2269,7 @@
// Add the new setting to mSettings
mSettings.insertPackageSettingLP(pkgSetting, pkg.packageName, suid);
// Add the new setting to mPackages
- mPackages.put(pkg.applicationInfo.packageName, pkg);
+ mPackages.put(pkg.applicationInfo.packageName, pkg);
int N = pkg.providers.size();
StringBuilder r = null;
int i;
@@ -2500,6 +2504,13 @@
if (Config.LOGD) Log.d(TAG, " Instrumentation: " + r);
}
+ if (pkg.protectedBroadcasts != null) {
+ N = pkg.protectedBroadcasts.size();
+ for (i=0; i<N; i++) {
+ mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
+ }
+ }
+
pkgSetting.setTimeStamp(scanFileTime);
}
@@ -4801,11 +4812,12 @@
mSystemReady = true;
// Read the compatibilty setting when the system is ready.
- mCompatibilityModeEnabled = android.provider.Settings.System.getInt(
+ boolean compatibilityModeEnabled = android.provider.Settings.System.getInt(
mContext.getContentResolver(),
android.provider.Settings.System.COMPATIBILITY_MODE, 1) == 1;
+ PackageParser.setCompatibilityModeEnabled(compatibilityModeEnabled);
if (DEBUG_SETTINGS) {
- Log.d(TAG, "compatibility mode:" + mCompatibilityModeEnabled);
+ Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
}
}
@@ -4889,6 +4901,26 @@
pw.print(" resourcePath="); pw.println(ps.resourcePathString);
if (ps.pkg != null) {
pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
+ pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
+ pw.print(" densities="); pw.println(ps.pkg.supportsDensityList);
+ ArrayList<String> screens = new ArrayList<String>();
+ if ((ps.pkg.applicationInfo.flags &
+ ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
+ screens.add("medium");
+ }
+ if ((ps.pkg.applicationInfo.flags &
+ ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
+ screens.add("large");
+ }
+ if ((ps.pkg.applicationInfo.flags &
+ ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
+ screens.add("small,");
+ }
+ if ((ps.pkg.applicationInfo.flags &
+ ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
+ screens.add("resizeable,");
+ }
+ pw.print(" supportsScreens="); pw.println(screens);
}
pw.print(" timeStamp="); pw.println(ps.getTimeStampStr());
pw.print(" signatures="); pw.println(ps.signatures);
@@ -5408,10 +5440,10 @@
*/
static class PackageSettingBase extends GrantedPermissions {
final String name;
- final File codePath;
- final String codePathString;
- final File resourcePath;
- final String resourcePathString;
+ File codePath;
+ String codePathString;
+ File resourcePath;
+ String resourcePathString;
private long timeStamp;
private String timeStampString = "0";
final int versionCode;
@@ -5809,11 +5841,16 @@
// and data partition. Just let the most recent version
// take precedence.
return p;
- } else if ((p.pkg != null) && (p.pkg.applicationInfo != null)) {
+ } else {
// Let the app continue with previous uid if code path changes.
reportSettingsProblem(Log.WARN,
"Package " + name + " codePath changed from " + p.codePath
- + " to " + codePath + "; Retaining data and using new code");
+ + " to " + codePath + "; Retaining data and using new code from " +
+ codePath);
+ p.codePath = codePath;
+ p.resourcePath = resourcePath;
+ p.codePathString = codePath.toString();
+ p.resourcePathString = resourcePath.toString();
}
} else if (p.sharedUser != sharedUser) {
reportSettingsProblem(Log.WARN,
@@ -5837,6 +5874,7 @@
if (sharedUser != null) {
p.userId = sharedUser.userId;
} else if (MULTIPLE_APPLICATION_UIDS) {
+ // Assign new user id
p.userId = newUserIdLP(p);
} else {
p.userId = FIRST_APPLICATION_UID;