Merge "Always populate the ApplicationInfo object" into oc-dr1-dev
am: bb6653c404
Change-Id: I7224af4db28368292609a6c7728bcfd9a299b784
This commit is contained in:
@@ -8938,9 +8938,12 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
boolean updatedPkgBetter = false;
|
||||
final boolean isUpdatedPkg = updatedPkg != null;
|
||||
final boolean isUpdatedSystemPkg = isUpdatedPkg
|
||||
&& (policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0;
|
||||
boolean isUpdatedPkgBetter = false;
|
||||
// First check if this is a system package that may involve an update
|
||||
if (updatedPkg != null && (policyFlags & PackageParser.PARSE_IS_SYSTEM) != 0) {
|
||||
if (isUpdatedSystemPkg) {
|
||||
// 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)) {
|
||||
@@ -8984,10 +8987,6 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
updatedChildPkg.versionCode = pkg.mVersionCode;
|
||||
}
|
||||
}
|
||||
|
||||
throw new PackageManagerException(Log.WARN, "Package " + ps.name + " at "
|
||||
+ scanFile + " ignored: updated version " + ps.versionCode
|
||||
+ " better than this " + pkg.mVersionCode);
|
||||
} else {
|
||||
// The current app on the system partition is better than
|
||||
// what we have updated to on the data partition; switch
|
||||
@@ -9014,12 +9013,44 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
synchronized (mPackages) {
|
||||
mSettings.enableSystemPackageLPw(ps.name);
|
||||
}
|
||||
updatedPkgBetter = true;
|
||||
isUpdatedPkgBetter = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (updatedPkg != null) {
|
||||
String resourcePath = null;
|
||||
String baseResourcePath = null;
|
||||
if ((policyFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !isUpdatedPkgBetter) {
|
||||
if (ps != null && ps.resourcePathString != null) {
|
||||
resourcePath = ps.resourcePathString;
|
||||
baseResourcePath = ps.resourcePathString;
|
||||
} else {
|
||||
// Should not happen at all. Just log an error.
|
||||
Slog.e(TAG, "Resource path not set for package " + pkg.packageName);
|
||||
}
|
||||
} else {
|
||||
resourcePath = pkg.codePath;
|
||||
baseResourcePath = pkg.baseCodePath;
|
||||
}
|
||||
|
||||
// Set application objects path explicitly.
|
||||
pkg.setApplicationVolumeUuid(pkg.volumeUuid);
|
||||
pkg.setApplicationInfoCodePath(pkg.codePath);
|
||||
pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath);
|
||||
pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths);
|
||||
pkg.setApplicationInfoResourcePath(resourcePath);
|
||||
pkg.setApplicationInfoBaseResourcePath(baseResourcePath);
|
||||
pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths);
|
||||
|
||||
// throw an exception if we have an update to a system application, but, it's not more
|
||||
// recent than the package we've already scanned
|
||||
if (isUpdatedSystemPkg && !isUpdatedPkgBetter) {
|
||||
throw new PackageManagerException(Log.WARN, "Package " + ps.name + " at "
|
||||
+ scanFile + " ignored: updated version " + ps.versionCode
|
||||
+ " better than this " + pkg.mVersionCode);
|
||||
}
|
||||
|
||||
if (isUpdatedPkg) {
|
||||
// An updated system app will not have the PARSE_IS_SYSTEM flag set
|
||||
// initially
|
||||
policyFlags |= PackageParser.PARSE_IS_SYSTEM;
|
||||
@@ -9039,7 +9070,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
* same name installed earlier.
|
||||
*/
|
||||
boolean shouldHideSystemApp = false;
|
||||
if (updatedPkg == null && ps != null
|
||||
if (!isUpdatedPkg && ps != null
|
||||
&& (policyFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0 && !isSystemApp(ps)) {
|
||||
/*
|
||||
* Check to make sure the signatures match first. If they don't,
|
||||
@@ -9094,31 +9125,6 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: extend to support forward-locked splits
|
||||
String resourcePath = null;
|
||||
String baseResourcePath = null;
|
||||
if ((policyFlags & PackageParser.PARSE_FORWARD_LOCK) != 0 && !updatedPkgBetter) {
|
||||
if (ps != null && ps.resourcePathString != null) {
|
||||
resourcePath = ps.resourcePathString;
|
||||
baseResourcePath = ps.resourcePathString;
|
||||
} else {
|
||||
// Should not happen at all. Just log an error.
|
||||
Slog.e(TAG, "Resource path not set for package " + pkg.packageName);
|
||||
}
|
||||
} else {
|
||||
resourcePath = pkg.codePath;
|
||||
baseResourcePath = pkg.baseCodePath;
|
||||
}
|
||||
|
||||
// Set application objects path explicitly.
|
||||
pkg.setApplicationVolumeUuid(pkg.volumeUuid);
|
||||
pkg.setApplicationInfoCodePath(pkg.codePath);
|
||||
pkg.setApplicationInfoBaseCodePath(pkg.baseCodePath);
|
||||
pkg.setApplicationInfoSplitCodePaths(pkg.splitCodePaths);
|
||||
pkg.setApplicationInfoResourcePath(resourcePath);
|
||||
pkg.setApplicationInfoBaseResourcePath(baseResourcePath);
|
||||
pkg.setApplicationInfoSplitResourcePaths(pkg.splitCodePaths);
|
||||
|
||||
final int userId = ((user == null) ? 0 : user.getIdentifier());
|
||||
if (ps != null && ps.getInstantApp(userId)) {
|
||||
scanFlags |= SCAN_AS_INSTANT_APP;
|
||||
|
||||
Reference in New Issue
Block a user