donut snapshot
This commit is contained in:
@@ -59,6 +59,7 @@ import android.content.pm.ServiceInfo;
|
||||
import android.content.pm.Signature;
|
||||
import android.net.Uri;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.Parcel;
|
||||
@@ -140,8 +141,9 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
Process.THREAD_PRIORITY_BACKGROUND);
|
||||
final Handler mHandler;
|
||||
|
||||
final int mSdkVersion = SystemProperties.getInt(
|
||||
"ro.build.version.sdk", 0);
|
||||
final int mSdkVersion = Build.VERSION.SDK_INT;
|
||||
final String mSdkCodename = "REL".equals(Build.VERSION.CODENAME)
|
||||
? null : Build.VERSION.CODENAME;
|
||||
|
||||
final Context mContext;
|
||||
final boolean mFactoryTest;
|
||||
@@ -1751,7 +1753,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
parseFlags |= mDefParseFlags;
|
||||
PackageParser pp = new PackageParser(scanFile.getPath());
|
||||
pp.setSeparateProcesses(mSeparateProcesses);
|
||||
pp.setSdkVersion(mSdkVersion);
|
||||
pp.setSdkVersion(mSdkVersion, mSdkCodename);
|
||||
final PackageParser.Package pkg = pp.parsePackage(scanFile,
|
||||
destCodeFile.getAbsolutePath(), mMetrics, parseFlags);
|
||||
if (pkg == null) {
|
||||
@@ -1761,8 +1763,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
PackageSetting ps;
|
||||
PackageSetting updatedPkg;
|
||||
synchronized (mPackages) {
|
||||
ps = mSettings.peekPackageLP(pkg.packageName,
|
||||
scanFile.toString());
|
||||
ps = mSettings.peekPackageLP(pkg.packageName);
|
||||
updatedPkg = mSettings.mDisabledSysPackages.get(pkg.packageName);
|
||||
}
|
||||
if (updatedPkg != null) {
|
||||
@@ -1771,13 +1772,21 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
if ((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) {
|
||||
// Check for updated system applications here
|
||||
if ((updatedPkg != null) && (ps == null)) {
|
||||
// The system package has been updated and the code path does not match
|
||||
// Ignore entry. Just return
|
||||
Log.w(TAG, "Package:" + pkg.packageName +
|
||||
" has been updated. Ignoring the one from path:"+scanFile);
|
||||
mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
|
||||
return null;
|
||||
if (updatedPkg != null) {
|
||||
if ((ps != null) && (!ps.codePath.getPath().equals(scanFile.getPath()))) {
|
||||
if (pkg.mVersionCode <= ps.versionCode) {
|
||||
// The system package has been updated and the code path does not match
|
||||
// Ignore entry. Just return
|
||||
Log.w(TAG, "Package:" + pkg.packageName +
|
||||
" has been updated. Ignoring the one from path:"+scanFile);
|
||||
mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
|
||||
return null;
|
||||
} else {
|
||||
// Delete the older apk pointed to by ps
|
||||
deletePackageResourcesLI(ps.name, ps.codePathString, ps.resourcePathString);
|
||||
mSettings.enableSystemPackageLP(ps.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!collectCertificatesLI(pp, ps, pkg, scanFile, parseFlags)) {
|
||||
@@ -2932,11 +2941,12 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dumpFilter(Printer out, String prefix,
|
||||
protected void dumpFilter(PrintWriter out, String prefix,
|
||||
PackageParser.ActivityIntentInfo filter) {
|
||||
out.println(prefix
|
||||
+ Integer.toHexString(System.identityHashCode(filter.activity))
|
||||
+ " " + filter.activity.component.flattenToShortString());
|
||||
out.print(prefix); out.print(
|
||||
Integer.toHexString(System.identityHashCode(filter.activity)));
|
||||
out.print(' ');
|
||||
out.println(filter.activity.componentShortName);
|
||||
}
|
||||
|
||||
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
|
||||
@@ -3064,11 +3074,12 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dumpFilter(Printer out, String prefix,
|
||||
protected void dumpFilter(PrintWriter out, String prefix,
|
||||
PackageParser.ServiceIntentInfo filter) {
|
||||
out.println(prefix
|
||||
+ Integer.toHexString(System.identityHashCode(filter.service))
|
||||
+ " " + filter.service.component.flattenToShortString());
|
||||
out.print(prefix); out.print(
|
||||
Integer.toHexString(System.identityHashCode(filter.service)));
|
||||
out.print(' ');
|
||||
out.println(filter.service.componentShortName);
|
||||
}
|
||||
|
||||
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
|
||||
@@ -3220,20 +3231,27 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
private final String mRootDir;
|
||||
private final boolean mIsRom;
|
||||
}
|
||||
|
||||
|
||||
/* Called when a downloaded package installation has been confirmed by the user */
|
||||
public void installPackage(
|
||||
final Uri packageURI, final IPackageInstallObserver observer, final int flags) {
|
||||
installPackage(packageURI, observer, flags, null);
|
||||
}
|
||||
|
||||
/* Called when a downloaded package installation has been confirmed by the user */
|
||||
public void installPackage(
|
||||
final Uri packageURI, final IPackageInstallObserver observer, final int flags,
|
||||
final String installerPackageName) {
|
||||
mContext.enforceCallingOrSelfPermission(
|
||||
android.Manifest.permission.INSTALL_PACKAGES, null);
|
||||
|
||||
|
||||
// Queue up an async operation since the package installation may take a little while.
|
||||
mHandler.post(new Runnable() {
|
||||
public void run() {
|
||||
mHandler.removeCallbacks(this);
|
||||
PackageInstalledInfo res;
|
||||
synchronized (mInstallLock) {
|
||||
res = installPackageLI(packageURI, flags, true);
|
||||
res = installPackageLI(packageURI, flags, true, installerPackageName);
|
||||
}
|
||||
if (observer != null) {
|
||||
try {
|
||||
@@ -3281,7 +3299,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
File tmpPackageFile,
|
||||
String destFilePath, File destPackageFile, File destResourceFile,
|
||||
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
|
||||
PackageInstalledInfo res) {
|
||||
String installerPackageName, PackageInstalledInfo res) {
|
||||
// Remember this for later, in case we need to rollback this install
|
||||
boolean dataDirExists = (new File(mAppDataDir, pkgName)).exists();
|
||||
res.name = pkgName;
|
||||
@@ -3317,7 +3335,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
destResourceFile, pkg,
|
||||
newPackage,
|
||||
true,
|
||||
forwardLocked,
|
||||
forwardLocked,
|
||||
installerPackageName,
|
||||
res);
|
||||
// delete the partially installed application. the data directory will have to be
|
||||
// restored if it was already existing
|
||||
@@ -3338,26 +3357,27 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
File tmpPackageFile,
|
||||
String destFilePath, File destPackageFile, File destResourceFile,
|
||||
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
|
||||
PackageInstalledInfo res) {
|
||||
PackageParser.Package deletedPackage;
|
||||
String installerPackageName, PackageInstalledInfo res) {
|
||||
|
||||
PackageParser.Package oldPackage;
|
||||
// First find the old package info and check signatures
|
||||
synchronized(mPackages) {
|
||||
deletedPackage = mPackages.get(pkgName);
|
||||
if(checkSignaturesLP(pkg, deletedPackage) != PackageManager.SIGNATURE_MATCH) {
|
||||
oldPackage = mPackages.get(pkgName);
|
||||
if(checkSignaturesLP(pkg, oldPackage) != PackageManager.SIGNATURE_MATCH) {
|
||||
res.returnCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
|
||||
return;
|
||||
}
|
||||
}
|
||||
boolean sysPkg = ((deletedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
|
||||
boolean sysPkg = ((oldPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
|
||||
if(sysPkg) {
|
||||
replaceSystemPackageLI(deletedPackage,
|
||||
replaceSystemPackageLI(oldPackage,
|
||||
tmpPackageFile, destFilePath,
|
||||
destPackageFile, destResourceFile, pkg, forwardLocked,
|
||||
newInstall, res);
|
||||
newInstall, installerPackageName, res);
|
||||
} else {
|
||||
replaceNonSystemPackageLI(deletedPackage, tmpPackageFile, destFilePath,
|
||||
replaceNonSystemPackageLI(oldPackage, tmpPackageFile, destFilePath,
|
||||
destPackageFile, destResourceFile, pkg, forwardLocked,
|
||||
newInstall, res);
|
||||
newInstall, installerPackageName, res);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3365,12 +3385,18 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
File tmpPackageFile,
|
||||
String destFilePath, File destPackageFile, File destResourceFile,
|
||||
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
|
||||
PackageInstalledInfo res) {
|
||||
String installerPackageName, PackageInstalledInfo res) {
|
||||
PackageParser.Package newPackage = null;
|
||||
String pkgName = deletedPackage.packageName;
|
||||
boolean deletedPkg = true;
|
||||
boolean updatedSettings = false;
|
||||
int parseFlags = PackageManager.REPLACE_EXISTING_PACKAGE;
|
||||
|
||||
String oldInstallerPackageName = null;
|
||||
synchronized (mPackages) {
|
||||
oldInstallerPackageName = mSettings.getInstallerPackageName(pkgName);
|
||||
}
|
||||
|
||||
int parseFlags = PackageManager.INSTALL_REPLACE_EXISTING;
|
||||
// First delete the existing package while retaining the data directory
|
||||
if (!deletePackageLI(pkgName, false, PackageManager.DONT_DELETE_DATA,
|
||||
res.removedInfo)) {
|
||||
@@ -3398,6 +3424,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
newPackage,
|
||||
true,
|
||||
forwardLocked,
|
||||
installerPackageName,
|
||||
res);
|
||||
updatedSettings = true;
|
||||
}
|
||||
@@ -3441,8 +3468,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
installPackageLI(
|
||||
Uri.fromFile(new File(deletedPackage.mPath)),
|
||||
isForwardLocked(deletedPackage)
|
||||
? PackageManager.FORWARD_LOCK_PACKAGE
|
||||
: 0, false);
|
||||
? PackageManager.INSTALL_FORWARD_LOCK
|
||||
: 0, false, oldInstallerPackageName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3451,10 +3478,10 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
File tmpPackageFile,
|
||||
String destFilePath, File destPackageFile, File destResourceFile,
|
||||
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
|
||||
PackageInstalledInfo res) {
|
||||
String installerPackageName, PackageInstalledInfo res) {
|
||||
PackageParser.Package newPackage = null;
|
||||
boolean updatedSettings = false;
|
||||
int parseFlags = PackageManager.REPLACE_EXISTING_PACKAGE |
|
||||
int parseFlags = PackageManager.INSTALL_REPLACE_EXISTING |
|
||||
PackageParser.PARSE_IS_SYSTEM;
|
||||
String packageName = deletedPackage.packageName;
|
||||
res.returnCode = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
|
||||
@@ -3501,7 +3528,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
destResourceFile, pkg,
|
||||
newPackage,
|
||||
true,
|
||||
forwardLocked,
|
||||
forwardLocked,
|
||||
installerPackageName,
|
||||
res);
|
||||
updatedSettings = true;
|
||||
}
|
||||
@@ -3528,6 +3556,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
synchronized(mPackages) {
|
||||
if(updatedSettings) {
|
||||
mSettings.enableSystemPackageLP(packageName);
|
||||
mSettings.setInstallerPackageName(packageName,
|
||||
oldPkgSetting.installerPackageName);
|
||||
}
|
||||
mSettings.writeLP();
|
||||
}
|
||||
@@ -3541,7 +3571,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
PackageParser.Package newPackage,
|
||||
boolean replacingExistingPackage,
|
||||
boolean forwardLocked,
|
||||
PackageInstalledInfo res) {
|
||||
String installerPackageName, PackageInstalledInfo res) {
|
||||
synchronized (mPackages) {
|
||||
//write settings. the installStatus will be incomplete at this stage.
|
||||
//note that the new package setting would have already been
|
||||
@@ -3588,6 +3618,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
res.uid = newPackage.applicationInfo.uid;
|
||||
res.pkg = newPackage;
|
||||
mSettings.setInstallStatus(pkgName, PKG_INSTALL_COMPLETE);
|
||||
mSettings.setInstallerPackageName(pkgName, installerPackageName);
|
||||
res.returnCode = PackageManager.INSTALL_SUCCEEDED;
|
||||
//to update install status
|
||||
mSettings.writeLP();
|
||||
@@ -3595,7 +3626,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
|
||||
private PackageInstalledInfo installPackageLI(Uri pPackageURI,
|
||||
int pFlags, boolean newInstall) {
|
||||
int pFlags, boolean newInstall, String installerPackageName) {
|
||||
File tmpPackageFile = null;
|
||||
String pkgName = null;
|
||||
boolean forwardLocked = false;
|
||||
@@ -3666,13 +3697,13 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
res.name = pkgName;
|
||||
//initialize some variables before installing pkg
|
||||
final String pkgFileName = pkgName + ".apk";
|
||||
final File destDir = ((pFlags&PackageManager.FORWARD_LOCK_PACKAGE) != 0)
|
||||
final File destDir = ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0)
|
||||
? mDrmAppPrivateInstallDir
|
||||
: mAppInstallDir;
|
||||
final File destPackageFile = new File(destDir, pkgFileName);
|
||||
final String destFilePath = destPackageFile.getAbsolutePath();
|
||||
File destResourceFile;
|
||||
if ((pFlags&PackageManager.FORWARD_LOCK_PACKAGE) != 0) {
|
||||
if ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0) {
|
||||
final String publicZipFileName = pkgName + ".zip";
|
||||
destResourceFile = new File(mAppInstallDir, publicZipFileName);
|
||||
forwardLocked = true;
|
||||
@@ -3684,13 +3715,19 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
parseFlags |= mDefParseFlags;
|
||||
PackageParser pp = new PackageParser(tmpPackageFile.getPath());
|
||||
pp.setSeparateProcesses(mSeparateProcesses);
|
||||
pp.setSdkVersion(mSdkVersion);
|
||||
pp.setSdkVersion(mSdkVersion, mSdkCodename);
|
||||
final PackageParser.Package pkg = pp.parsePackage(tmpPackageFile,
|
||||
destPackageFile.getAbsolutePath(), mMetrics, parseFlags);
|
||||
if (pkg == null) {
|
||||
res.returnCode = pp.getParseError();
|
||||
break main_flow;
|
||||
}
|
||||
if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_TEST_ONLY) != 0) {
|
||||
if ((pFlags&PackageManager.INSTALL_ALLOW_TEST) == 0) {
|
||||
res.returnCode = PackageManager.INSTALL_FAILED_TEST_ONLY;
|
||||
break main_flow;
|
||||
}
|
||||
}
|
||||
if (GET_CERTIFICATES && !pp.collectCertificates(pkg, parseFlags)) {
|
||||
res.returnCode = pp.getParseError();
|
||||
break main_flow;
|
||||
@@ -3698,7 +3735,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
|
||||
synchronized (mPackages) {
|
||||
//check if installing already existing package
|
||||
if ((pFlags&PackageManager.REPLACE_EXISTING_PACKAGE) != 0
|
||||
if ((pFlags&PackageManager.INSTALL_REPLACE_EXISTING) != 0
|
||||
&& mPackages.containsKey(pkgName)) {
|
||||
replacingExistingPackage = true;
|
||||
}
|
||||
@@ -3708,13 +3745,13 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
replacePackageLI(pkgName,
|
||||
tmpPackageFile,
|
||||
destFilePath, destPackageFile, destResourceFile,
|
||||
pkg, forwardLocked, newInstall,
|
||||
pkg, forwardLocked, newInstall, installerPackageName,
|
||||
res);
|
||||
} else {
|
||||
installNewPackageLI(pkgName,
|
||||
tmpPackageFile,
|
||||
destFilePath, destPackageFile, destResourceFile,
|
||||
pkg, forwardLocked, newInstall,
|
||||
pkg, forwardLocked, newInstall, installerPackageName,
|
||||
res);
|
||||
}
|
||||
} finally {
|
||||
@@ -3994,7 +4031,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
* Tries to delete system package.
|
||||
*/
|
||||
private boolean deleteSystemPackageLI(PackageParser.Package p,
|
||||
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
|
||||
int flags, PackageRemovedInfo outInfo) {
|
||||
ApplicationInfo applicationInfo = p.applicationInfo;
|
||||
//applicable for non-partially installed applications only
|
||||
if (applicationInfo == null) {
|
||||
@@ -4016,6 +4053,19 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
// Delete the updated package
|
||||
outInfo.isRemovedPackageSystemUpdate = true;
|
||||
boolean deleteCodeAndResources = false;
|
||||
if (ps.versionCode < p.mVersionCode) {
|
||||
// Delete code and resources for downgrades
|
||||
deleteCodeAndResources = true;
|
||||
if ((flags & PackageManager.DONT_DELETE_DATA) == 0) {
|
||||
flags &= ~PackageManager.DONT_DELETE_DATA;
|
||||
}
|
||||
} else {
|
||||
// Preserve data by setting flag
|
||||
if ((flags & PackageManager.DONT_DELETE_DATA) == 0) {
|
||||
flags |= PackageManager.DONT_DELETE_DATA;
|
||||
}
|
||||
}
|
||||
boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
|
||||
if (!ret) {
|
||||
return false;
|
||||
@@ -4039,6 +4089,28 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void deletePackageResourcesLI(String packageName,
|
||||
String sourceDir, String publicSourceDir) {
|
||||
File sourceFile = new File(sourceDir);
|
||||
if (!sourceFile.exists()) {
|
||||
Log.w(TAG, "Package source " + sourceDir + " does not exist.");
|
||||
}
|
||||
// Delete application's code and resources
|
||||
sourceFile.delete();
|
||||
final File publicSourceFile = new File(publicSourceDir);
|
||||
if (publicSourceFile.exists()) {
|
||||
publicSourceFile.delete();
|
||||
}
|
||||
if (mInstaller != null) {
|
||||
int retCode = mInstaller.rmdex(sourceFile.toString());
|
||||
if (retCode < 0) {
|
||||
Log.w(TAG, "Couldn't remove dex file for package: "
|
||||
+ packageName + " at location " + sourceFile.toString() + ", retcode=" + retCode);
|
||||
// we don't consider this to be a failure of the core package deletion
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean deleteInstalledPackageLI(PackageParser.Package p,
|
||||
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
|
||||
ApplicationInfo applicationInfo = p.applicationInfo;
|
||||
@@ -4046,11 +4118,6 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
Log.w(TAG, "Package " + p.packageName + " has no applicationInfo.");
|
||||
return false;
|
||||
}
|
||||
// Delete application's source directory
|
||||
File sourceFile = new File(applicationInfo.sourceDir);
|
||||
if (!sourceFile.exists()) {
|
||||
Log.w(TAG, "Package source " + applicationInfo.sourceDir + " does not exist.");
|
||||
}
|
||||
outInfo.uid = applicationInfo.uid;
|
||||
|
||||
// Delete package data from internal structures and also remove data if flag is set
|
||||
@@ -4058,19 +4125,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
|
||||
// Delete application code and resources
|
||||
if (deleteCodeAndResources) {
|
||||
sourceFile.delete();
|
||||
final File publicSourceFile = new File(applicationInfo.publicSourceDir);
|
||||
if (publicSourceFile.exists()) {
|
||||
publicSourceFile.delete();
|
||||
}
|
||||
if (mInstaller != null) {
|
||||
int retCode = mInstaller.rmdex(sourceFile.toString());
|
||||
if (retCode < 0) {
|
||||
Log.w(TAG, "Couldn't remove dex file for package: "
|
||||
+ p.packageName + " at location " + sourceFile.toString() + ", retcode=" + retCode);
|
||||
// we don't consider this to be a failure of the core package deletion
|
||||
}
|
||||
}
|
||||
deletePackageResourcesLI(applicationInfo.packageName,
|
||||
applicationInfo.sourceDir, applicationInfo.publicSourceDir);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -4118,7 +4174,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
Log.i(TAG, "Removing system package:"+p.packageName);
|
||||
// When an updated system application is deleted we delete the existing resources as well and
|
||||
// fall back to existing code in system partition
|
||||
return deleteSystemPackageLI(p, true, flags, outInfo);
|
||||
return deleteSystemPackageLI(p, flags, outInfo);
|
||||
}
|
||||
Log.i(TAG, "Removing non-system package:"+p.packageName);
|
||||
return deleteInstalledPackageLI (p, deleteCodeAndResources, flags, outInfo);
|
||||
@@ -4513,6 +4569,16 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
public String getInstallerPackageName(String packageName) {
|
||||
synchronized (mPackages) {
|
||||
PackageSetting pkg = mSettings.mPackages.get(packageName);
|
||||
if (pkg == null) {
|
||||
throw new IllegalArgumentException("Unknown package: " + packageName);
|
||||
}
|
||||
return pkg.installerPackageName;
|
||||
}
|
||||
}
|
||||
|
||||
public int getApplicationEnabledSetting(String appPackageName) {
|
||||
synchronized (mPackages) {
|
||||
PackageSetting pkg = mSettings.mPackages.get(appPackageName);
|
||||
@@ -4578,80 +4644,83 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
return;
|
||||
}
|
||||
|
||||
Printer printer = new PrintWriterPrinter(pw);
|
||||
synchronized (mPackages) {
|
||||
pw.println("Activity Resolver Table:");
|
||||
mActivities.dump(printer, " ");
|
||||
mActivities.dump(pw, " ");
|
||||
pw.println(" ");
|
||||
pw.println("Receiver Resolver Table:");
|
||||
mReceivers.dump(printer, " ");
|
||||
mReceivers.dump(pw, " ");
|
||||
pw.println(" ");
|
||||
pw.println("Service Resolver Table:");
|
||||
mServices.dump(printer, " ");
|
||||
mServices.dump(pw, " ");
|
||||
pw.println(" ");
|
||||
pw.println("Preferred Activities:");
|
||||
mSettings.mPreferredActivities.dump(printer, " ");
|
||||
mSettings.mPreferredActivities.dump(pw, " ");
|
||||
pw.println(" ");
|
||||
pw.println("Preferred Packages:");
|
||||
{
|
||||
for (PackageSetting ps : mSettings.mPreferredPackages) {
|
||||
pw.println(" " + ps.name);
|
||||
pw.print(" "); pw.println(ps.name);
|
||||
}
|
||||
}
|
||||
pw.println(" ");
|
||||
pw.println("Permissions:");
|
||||
{
|
||||
for (BasePermission p : mSettings.mPermissions.values()) {
|
||||
pw.println(" Permission [" + p.name + "] ("
|
||||
+ Integer.toHexString(System.identityHashCode(p))
|
||||
+ "):");
|
||||
pw.println(" sourcePackage=" + p.sourcePackage);
|
||||
pw.println(" uid=" + p.uid
|
||||
+ " gids=" + arrayToString(p.gids)
|
||||
+ " type=" + p.type);
|
||||
pw.print(" Permission ["); pw.print(p.name); pw.print("] (");
|
||||
pw.print(Integer.toHexString(System.identityHashCode(p)));
|
||||
pw.println("):");
|
||||
pw.print(" sourcePackage="); pw.println(p.sourcePackage);
|
||||
pw.print(" uid="); pw.print(p.uid);
|
||||
pw.print(" gids="); pw.print(arrayToString(p.gids));
|
||||
pw.print(" type="); pw.println(p.type);
|
||||
}
|
||||
}
|
||||
pw.println(" ");
|
||||
pw.println("Packages:");
|
||||
{
|
||||
for (PackageSetting ps : mSettings.mPackages.values()) {
|
||||
pw.println(" Package [" + ps.name + "] ("
|
||||
+ Integer.toHexString(System.identityHashCode(ps))
|
||||
+ "):");
|
||||
pw.println(" userId=" + ps.userId
|
||||
+ " gids=" + arrayToString(ps.gids));
|
||||
pw.println(" sharedUser=" + ps.sharedUser);
|
||||
pw.println(" pkg=" + ps.pkg);
|
||||
pw.println(" codePath=" + ps.codePathString);
|
||||
pw.println(" resourcePath=" + ps.resourcePathString);
|
||||
pw.print(" Package ["); pw.print(ps.name); pw.print("] (");
|
||||
pw.print(Integer.toHexString(System.identityHashCode(ps)));
|
||||
pw.println("):");
|
||||
pw.print(" userId="); pw.print(ps.userId);
|
||||
pw.print(" gids="); pw.println(arrayToString(ps.gids));
|
||||
pw.print(" sharedUser="); pw.println(ps.sharedUser);
|
||||
pw.print(" pkg="); pw.println(ps.pkg);
|
||||
pw.print(" codePath="); pw.println(ps.codePathString);
|
||||
pw.print(" resourcePath="); pw.println(ps.resourcePathString);
|
||||
if (ps.pkg != null) {
|
||||
pw.println(" dataDir=" + ps.pkg.applicationInfo.dataDir);
|
||||
pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
|
||||
}
|
||||
pw.println(" timeStamp=" + ps.getTimeStampStr());
|
||||
pw.println(" signatures=" + ps.signatures);
|
||||
pw.println(" permissionsFixed=" + ps.permissionsFixed
|
||||
+ " pkgFlags=0x" + Integer.toHexString(ps.pkgFlags)
|
||||
+ " installStatus=" + ps.installStatus
|
||||
+ " enabled=" + ps.enabled);
|
||||
pw.print(" timeStamp="); pw.println(ps.getTimeStampStr());
|
||||
pw.print(" signatures="); pw.println(ps.signatures);
|
||||
pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed);
|
||||
pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
|
||||
pw.print(" installStatus="); pw.print(ps.installStatus);
|
||||
pw.print(" enabled="); pw.println(ps.enabled);
|
||||
if (ps.disabledComponents.size() > 0) {
|
||||
pw.println(" disabledComponents:");
|
||||
for (String s : ps.disabledComponents) {
|
||||
pw.println(" " + s);
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
}
|
||||
if (ps.enabledComponents.size() > 0) {
|
||||
pw.println(" enabledComponents:");
|
||||
for (String s : ps.enabledComponents) {
|
||||
pw.println(" " + s);
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
}
|
||||
pw.println(" grantedPermissions:");
|
||||
for (String s : ps.grantedPermissions) {
|
||||
pw.println(" " + s);
|
||||
if (ps.grantedPermissions.size() > 0) {
|
||||
pw.println(" grantedPermissions:");
|
||||
for (String s : ps.grantedPermissions) {
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
}
|
||||
pw.println(" loadedPermissions:");
|
||||
for (String s : ps.loadedPermissions) {
|
||||
pw.println(" " + s);
|
||||
if (ps.loadedPermissions.size() > 0) {
|
||||
pw.println(" loadedPermissions:");
|
||||
for (String s : ps.loadedPermissions) {
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4659,18 +4728,18 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
pw.println("Shared Users:");
|
||||
{
|
||||
for (SharedUserSetting su : mSettings.mSharedUsers.values()) {
|
||||
pw.println(" SharedUser [" + su.name + "] ("
|
||||
+ Integer.toHexString(System.identityHashCode(su))
|
||||
+ "):");
|
||||
pw.println(" userId=" + su.userId
|
||||
+ " gids=" + arrayToString(su.gids));
|
||||
pw.print(" SharedUser ["); pw.print(su.name); pw.print("] (");
|
||||
pw.print(Integer.toHexString(System.identityHashCode(su)));
|
||||
pw.println("):");
|
||||
pw.print(" userId="); pw.print(su.userId);
|
||||
pw.print(" gids="); pw.println(arrayToString(su.gids));
|
||||
pw.println(" grantedPermissions:");
|
||||
for (String s : su.grantedPermissions) {
|
||||
pw.println(" " + s);
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
pw.println(" loadedPermissions:");
|
||||
for (String s : su.loadedPermissions) {
|
||||
pw.println(" " + s);
|
||||
pw.print(" "); pw.println(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5147,6 +5216,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
final String resourcePathString;
|
||||
private long timeStamp;
|
||||
private String timeStampString = "0";
|
||||
final int versionCode;
|
||||
|
||||
PackageSignatures signatures = new PackageSignatures();
|
||||
|
||||
@@ -5158,17 +5228,29 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
HashSet<String> enabledComponents = new HashSet<String>(0);
|
||||
int enabled = COMPONENT_ENABLED_STATE_DEFAULT;
|
||||
int installStatus = PKG_INSTALL_COMPLETE;
|
||||
|
||||
/* package name of the app that installed this package */
|
||||
String installerPackageName;
|
||||
|
||||
PackageSettingBase(String name, File codePath, File resourcePath,
|
||||
int pkgFlags) {
|
||||
int pVersionCode, int pkgFlags) {
|
||||
super(pkgFlags);
|
||||
this.name = name;
|
||||
this.codePath = codePath;
|
||||
this.codePathString = codePath.toString();
|
||||
this.resourcePath = resourcePath;
|
||||
this.resourcePathString = resourcePath.toString();
|
||||
this.versionCode = pVersionCode;
|
||||
}
|
||||
|
||||
public void setInstallerPackageName(String packageName) {
|
||||
installerPackageName = packageName;
|
||||
}
|
||||
|
||||
String getInstallerPackageName() {
|
||||
return installerPackageName;
|
||||
}
|
||||
|
||||
public void setInstallStatus(int newStatus) {
|
||||
installStatus = newStatus;
|
||||
}
|
||||
@@ -5247,8 +5329,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
SharedUserSetting sharedUser;
|
||||
|
||||
PackageSetting(String name, File codePath, File resourcePath,
|
||||
int pkgFlags) {
|
||||
super(name, codePath, resourcePath, pkgFlags);
|
||||
int pVersionCode, int pkgFlags) {
|
||||
super(name, codePath, resourcePath, pVersionCode, pkgFlags);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -5302,16 +5384,19 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
private final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
|
||||
new IntentResolver<PreferredActivity, PreferredActivity>() {
|
||||
@Override
|
||||
protected void dumpFilter(Printer out, String prefix,
|
||||
protected void dumpFilter(PrintWriter out, String prefix,
|
||||
PreferredActivity filter) {
|
||||
out.println(prefix
|
||||
+ Integer.toHexString(System.identityHashCode(filter))
|
||||
+ " " + filter.mActivity.flattenToShortString()
|
||||
+ " match=0x" + Integer.toHexString(filter.mMatch));
|
||||
out.print(prefix); out.print(
|
||||
Integer.toHexString(System.identityHashCode(filter)));
|
||||
out.print(' ');
|
||||
out.print(filter.mActivity.flattenToShortString());
|
||||
out.print(" match=0x");
|
||||
out.println( Integer.toHexString(filter.mMatch));
|
||||
if (filter.mSetComponents != null) {
|
||||
out.println(prefix + " Selected from:");
|
||||
out.print(prefix); out.println(" Selected from:");
|
||||
for (int i=0; i<filter.mSetComponents.length; i++) {
|
||||
out.println(prefix + " " + filter.mSetComponents[i]);
|
||||
out.print(prefix); out.print(" ");
|
||||
out.println(filter.mSetComponents[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5343,8 +5428,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
final int sharedId;
|
||||
|
||||
PendingPackage(String name, File codePath, File resourcePath,
|
||||
int sharedId, int pkgFlags) {
|
||||
super(name, codePath, resourcePath, pkgFlags);
|
||||
int sharedId, int pVersionCode, int pkgFlags) {
|
||||
super(name, codePath, resourcePath, pVersionCode, pkgFlags);
|
||||
this.sharedId = sharedId;
|
||||
}
|
||||
}
|
||||
@@ -5368,7 +5453,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
int pkgFlags, boolean create, boolean add) {
|
||||
final String name = pkg.packageName;
|
||||
PackageSetting p = getPackageLP(name, sharedUser, codePath,
|
||||
resourcePath, pkgFlags, create, add);
|
||||
resourcePath, pkg.mVersionCode, pkgFlags, create, add);
|
||||
|
||||
if (p != null) {
|
||||
p.pkg = pkg;
|
||||
@@ -5376,12 +5461,15 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
return p;
|
||||
}
|
||||
|
||||
PackageSetting peekPackageLP(String name, String codePath) {
|
||||
PackageSetting peekPackageLP(String name) {
|
||||
return mPackages.get(name);
|
||||
/*
|
||||
PackageSetting p = mPackages.get(name);
|
||||
if (p != null && p.codePath.getPath().equals(codePath)) {
|
||||
return p;
|
||||
}
|
||||
return null;
|
||||
*/
|
||||
}
|
||||
|
||||
void setInstallStatus(String pkgName, int status) {
|
||||
@@ -5393,6 +5481,19 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
void setInstallerPackageName(String pkgName,
|
||||
String installerPkgName) {
|
||||
PackageSetting p = mPackages.get(pkgName);
|
||||
if(p != null) {
|
||||
p.setInstallerPackageName(installerPkgName);
|
||||
}
|
||||
}
|
||||
|
||||
String getInstallerPackageName(String pkgName) {
|
||||
PackageSetting p = mPackages.get(pkgName);
|
||||
return (p == null) ? null : p.getInstallerPackageName();
|
||||
}
|
||||
|
||||
int getInstallStatus(String pkgName) {
|
||||
PackageSetting p = mPackages.get(pkgName);
|
||||
if(p != null) {
|
||||
@@ -5453,13 +5554,13 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
|
||||
}
|
||||
PackageSetting ret = addPackageLP(name, p.codePath,
|
||||
p.resourcePath, p.userId, p.pkgFlags);
|
||||
p.resourcePath, p.userId, p.versionCode, p.pkgFlags);
|
||||
mDisabledSysPackages.remove(name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
PackageSetting addPackageLP(String name, File codePath,
|
||||
File resourcePath, int uid, int pkgFlags) {
|
||||
File resourcePath, int uid, int vc, int pkgFlags) {
|
||||
PackageSetting p = mPackages.get(name);
|
||||
if (p != null) {
|
||||
if (p.userId == uid) {
|
||||
@@ -5469,7 +5570,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
"Adding duplicate package, keeping first: " + name);
|
||||
return null;
|
||||
}
|
||||
p = new PackageSetting(name, codePath, resourcePath, pkgFlags);
|
||||
p = new PackageSetting(name, codePath, resourcePath, vc, pkgFlags);
|
||||
p.userId = uid;
|
||||
if (addUserIdLP(uid, p, name)) {
|
||||
mPackages.put(name, p);
|
||||
@@ -5499,7 +5600,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
|
||||
private PackageSetting getPackageLP(String name,
|
||||
SharedUserSetting sharedUser, File codePath, File resourcePath,
|
||||
int pkgFlags, boolean create, boolean add) {
|
||||
int vc, int pkgFlags, boolean create, boolean add) {
|
||||
PackageSetting p = mPackages.get(name);
|
||||
if (p != null) {
|
||||
if (!p.codePath.equals(codePath)) {
|
||||
@@ -5541,7 +5642,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
if (!create) {
|
||||
return null;
|
||||
}
|
||||
p = new PackageSetting(name, codePath, resourcePath, pkgFlags);
|
||||
p = new PackageSetting(name, codePath, resourcePath, vc, pkgFlags);
|
||||
p.setTimeStamp(codePath.lastModified());
|
||||
if (sharedUser != null) {
|
||||
p.userId = sharedUser.userId;
|
||||
@@ -5808,6 +5909,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
serializer.attribute(null, "name", pkg.name);
|
||||
serializer.attribute(null, "codePath", pkg.codePathString);
|
||||
serializer.attribute(null, "ts", pkg.getTimeStampStr());
|
||||
serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
|
||||
if (!pkg.resourcePathString.equals(pkg.codePathString)) {
|
||||
serializer.attribute(null, "resourcePath", pkg.resourcePathString);
|
||||
}
|
||||
@@ -5851,6 +5953,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
(pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0
|
||||
? "true" : "false");
|
||||
serializer.attribute(null, "ts", pkg.getTimeStampStr());
|
||||
serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
|
||||
if (pkg.sharedUser == null) {
|
||||
serializer.attribute(null, "userId",
|
||||
Integer.toString(pkg.userId));
|
||||
@@ -5866,6 +5969,9 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
if(pkg.installStatus == PKG_INSTALL_INCOMPLETE) {
|
||||
serializer.attribute(null, "installStatus", "false");
|
||||
}
|
||||
if (pkg.installerPackageName != null) {
|
||||
serializer.attribute(null, "installer", pkg.installerPackageName);
|
||||
}
|
||||
pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
|
||||
if ((pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||
serializer.startTag(null, "perms");
|
||||
@@ -5900,6 +6006,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
}
|
||||
serializer.endTag(null, "enabled-components");
|
||||
}
|
||||
|
||||
serializer.endTag(null, "package");
|
||||
}
|
||||
|
||||
@@ -6042,7 +6149,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
if (idObj != null && idObj instanceof SharedUserSetting) {
|
||||
PackageSetting p = getPackageLP(pp.name,
|
||||
(SharedUserSetting)idObj, pp.codePath, pp.resourcePath,
|
||||
pp.pkgFlags, true, true);
|
||||
pp.versionCode, pp.pkgFlags, true, true);
|
||||
if (p == null) {
|
||||
Log.w(TAG, "Unable to create application package for "
|
||||
+ pp.name);
|
||||
@@ -6161,12 +6268,20 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
if(resourcePathStr == null) {
|
||||
resourcePathStr = codePathStr;
|
||||
}
|
||||
String version = parser.getAttributeValue(null, "version");
|
||||
int versionCode = 0;
|
||||
if (version != null) {
|
||||
try {
|
||||
versionCode = Integer.parseInt(version);
|
||||
} catch (NumberFormatException e) {
|
||||
}
|
||||
}
|
||||
|
||||
int pkgFlags = 0;
|
||||
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
|
||||
PackageSetting ps = new PackageSetting(name,
|
||||
new File(codePathStr),
|
||||
new File(resourcePathStr), pkgFlags);
|
||||
new File(resourcePathStr), versionCode, pkgFlags);
|
||||
String timeStampStr = parser.getAttributeValue(null, "ts");
|
||||
if (timeStampStr != null) {
|
||||
try {
|
||||
@@ -6213,17 +6328,28 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
String codePathStr = null;
|
||||
String resourcePathStr = null;
|
||||
String systemStr = null;
|
||||
String installerPackageName = null;
|
||||
int pkgFlags = 0;
|
||||
String timeStampStr;
|
||||
long timeStamp = 0;
|
||||
PackageSettingBase packageSetting = null;
|
||||
String version = null;
|
||||
int versionCode = 0;
|
||||
try {
|
||||
name = parser.getAttributeValue(null, "name");
|
||||
idStr = parser.getAttributeValue(null, "userId");
|
||||
sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
|
||||
codePathStr = parser.getAttributeValue(null, "codePath");
|
||||
resourcePathStr = parser.getAttributeValue(null, "resourcePath");
|
||||
version = parser.getAttributeValue(null, "version");
|
||||
if (version != null) {
|
||||
try {
|
||||
versionCode = Integer.parseInt(version);
|
||||
} catch (NumberFormatException e) {
|
||||
}
|
||||
}
|
||||
systemStr = parser.getAttributeValue(null, "system");
|
||||
installerPackageName = parser.getAttributeValue(null, "installer");
|
||||
if (systemStr != null) {
|
||||
if ("true".equals(systemStr)) {
|
||||
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
|
||||
@@ -6256,7 +6382,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
+ parser.getPositionDescription());
|
||||
} else if (userId > 0) {
|
||||
packageSetting = addPackageLP(name.intern(), new File(codePathStr),
|
||||
new File(resourcePathStr), userId, pkgFlags);
|
||||
new File(resourcePathStr), userId, versionCode, pkgFlags);
|
||||
if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name
|
||||
+ ": userId=" + userId + " pkg=" + packageSetting);
|
||||
if (packageSetting == null) {
|
||||
@@ -6272,7 +6398,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
? Integer.parseInt(sharedIdStr) : 0;
|
||||
if (userId > 0) {
|
||||
packageSetting = new PendingPackage(name.intern(), new File(codePathStr),
|
||||
new File(resourcePathStr), userId, pkgFlags);
|
||||
new File(resourcePathStr), userId, versionCode, pkgFlags);
|
||||
packageSetting.setTimeStamp(timeStamp, timeStampStr);
|
||||
mPendingPackages.add((PendingPackage) packageSetting);
|
||||
if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name
|
||||
@@ -6297,6 +6423,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
||||
+ parser.getPositionDescription());
|
||||
}
|
||||
if (packageSetting != null) {
|
||||
packageSetting.installerPackageName = installerPackageName;
|
||||
final String enabledStr = parser.getAttributeValue(null, "enabled");
|
||||
if (enabledStr != null) {
|
||||
if (enabledStr.equalsIgnoreCase("true")) {
|
||||
|
||||
Reference in New Issue
Block a user