From c64322c35212e919906ffd66118c7d5d3ad36636 Mon Sep 17 00:00:00 2001 From: Jacek Surazski Date: Tue, 28 Apr 2009 15:26:38 +0200 Subject: [PATCH] PackageManager keeps track of who installed what. Stores the package name of the installer app in packages.xml --- api/current.xml | 4 +- cmds/pm/src/com/android/commands/pm/Pm.java | 14 ++- core/java/android/app/ApplicationContext.java | 15 ++- .../android/content/pm/IPackageManager.aidl | 7 +- .../android/content/pm/PackageManager.java | 42 ++++++++- .../android/server/PackageManagerService.java | 93 +++++++++++++++---- .../android/test/mock/MockPackageManager.java | 10 +- 7 files changed, 160 insertions(+), 25 deletions(-) diff --git a/api/current.xml b/api/current.xml index 40fe8e7295da2..71b5bc2eea2c0 100644 --- a/api/current.xml +++ b/api/current.xml @@ -33542,7 +33542,7 @@ + + enabledComponents = new HashSet(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 pVersionCode, int pkgFlags) { @@ -5204,6 +5237,14 @@ class PackageManagerService extends IPackageManager.Stub { this.versionCode = pVersionCode; } + public void setInstallerPackageName(String packageName) { + installerPackageName = packageName; + } + + String getInstallerPackageName() { + return installerPackageName; + } + public void setInstallStatus(int newStatus) { installStatus = newStatus; } @@ -5434,6 +5475,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) { @@ -5909,6 +5963,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"); @@ -5943,6 +6000,7 @@ class PackageManagerService extends IPackageManager.Stub { } serializer.endTag(null, "enabled-components"); } + serializer.endTag(null, "package"); } @@ -6264,6 +6322,7 @@ 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; @@ -6284,6 +6343,7 @@ class PackageManagerService extends IPackageManager.Stub { } } systemStr = parser.getAttributeValue(null, "system"); + installerPackageName = parser.getAttributeValue(null, "installer"); if (systemStr != null) { if ("true".equals(systemStr)) { pkgFlags |= ApplicationInfo.FLAG_SYSTEM; @@ -6357,6 +6417,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")) { diff --git a/test-runner/android/test/mock/MockPackageManager.java b/test-runner/android/test/mock/MockPackageManager.java index ea190e2371448..4769057d89bea 100644 --- a/test-runner/android/test/mock/MockPackageManager.java +++ b/test-runner/android/test/mock/MockPackageManager.java @@ -286,7 +286,15 @@ public class MockPackageManager extends PackageManager { @Override public void installPackage(Uri packageURI, IPackageInstallObserver observer, - int flags) { + int flags, String installerPackageName) { + throw new UnsupportedOperationException(); + } + + /** + * @hide - to match hiding in superclass + */ + @Override + public String getInstallerPackageName(String packageName) { throw new UnsupportedOperationException(); }