Fix targetSdkVersion, make resize mode a flag, delayed dexopt, easy ApplicationInfo.

- Fix a bug where targetSdkVersion could not be set if minSdkVersion.  Stupid, stupid.
  Also make sure to fail if minSdkVersion is for a code name.  Really stupid.

- Change the API for resize compatibility mode to be a bit in the flags field, instead
  of a separate boolean.

- Implement delayed dexopting, to avoid the looong full dexopt during boot.  This is
  only enabled for "eng" builds.  When in this mode, the activity manager will make
  sure that a dexopt has been done before loading an .apk into a process, and will
  try to avoid displaying ANRs if they are due to the dexopt causing some operation
  to take longer than it normally would (though I make no guarantees about this
  totally working).

- Add API to Context to get the ApplicationInfo for its package, for easy access to
  things like targetSdkVersion.
This commit is contained in:
Dianne Hackborn
2009-06-18 17:10:57 -07:00
parent e748161ca8
commit 5c1e00b14d
15 changed files with 263 additions and 84 deletions

View File

@@ -187,7 +187,7 @@ public final class ActivityThread {
try {
appInfo = getPackageManager().getApplicationInfo(
pkgInfo.getPackageName(),
PackageManager.GET_SUPPORTS_DENSITIES | PackageManager.GET_EXPANDABLE);
PackageManager.GET_SUPPORTS_DENSITIES);
} catch (RemoteException e) {
throw new AssertionError(e);
}
@@ -287,6 +287,10 @@ public final class ActivityThread {
return mPackageName;
}
public ApplicationInfo getApplicationInfo() {
return mApplicationInfo;
}
public boolean isSecurityViolation() {
return mSecurityViolation;
}

View File

@@ -282,6 +282,14 @@ class ApplicationContext extends Context {
throw new RuntimeException("Not supported in system context");
}
@Override
public ApplicationInfo getApplicationInfo() {
if (mPackageInfo != null) {
return mPackageInfo.getApplicationInfo();
}
throw new RuntimeException("Not supported in system context");
}
@Override
public String getPackageResourcePath() {
if (mPackageInfo != null) {

View File

@@ -16,6 +16,7 @@
package android.content;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
@@ -233,6 +234,9 @@ public abstract class Context {
/** Return the name of this application's package. */
public abstract String getPackageName();
/** Return the full application info for this context's package. */
public abstract ApplicationInfo getApplicationInfo();
/**
* {@hide}
* Return the full path to this context's resource files. This is the ZIP files

View File

@@ -16,6 +16,7 @@
package android.content;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
@@ -119,6 +120,11 @@ public class ContextWrapper extends Context {
return mBase.getPackageName();
}
@Override
public ApplicationInfo getApplicationInfo() {
return mBase.getApplicationInfo();
}
@Override
public String getPackageResourcePath() {
return mBase.getPackageResourcePath();

View File

@@ -136,6 +136,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public static final int FLAG_TEST_ONLY = 1<<8;
/**
* Value for {@link #flags}: true when the application's window can be
* expanded over default window size in target density (320x480 for
* 1.0 density, 480x720 for 1.5 density etc)
*/
public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<9;
/**
* Value for {@link #flags}: this is false if the application has set
* its android:allowBackup to false, true otherwise.
@@ -200,12 +207,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public int[] supportsDensities;
/**
* True when the application's window can be expanded over default window
* size in target density (320x480 for 1.0 density, 480x720 for 1.5 density etc)
*/
public boolean expandable = false;
/**
* The minimum SDK version this application targets. It may run on earilier
* versions, but it knows how to work with any new behavior added at this
@@ -240,7 +241,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
pw.println(prefix + "supportsDensities=" + supportsDensities);
pw.println(prefix + "expandable=" + expandable);
super.dumpBack(pw, prefix);
}
@@ -288,7 +288,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
manageSpaceActivityName = orig.manageSpaceActivityName;
descriptionRes = orig.descriptionRes;
supportsDensities = orig.supportsDensities;
expandable = orig.expandable;
}
@@ -321,7 +320,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeString(backupAgentName);
dest.writeInt(descriptionRes);
dest.writeIntArray(supportsDensities);
dest.writeInt(expandable ? 1 : 0);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -353,7 +351,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
backupAgentName = source.readString();
descriptionRes = source.readInt();
supportsDensities = source.createIntArray();
expandable = source.readInt() != 0;
}
/**
@@ -383,7 +380,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* @hide
*/
public void disableCompatibilityMode() {
expandable = true;
flags |= FLAG_SUPPORTS_LARGE_SCREENS;
supportsDensities = ANY_DENSITIES_ARRAY;
}
}

View File

@@ -301,4 +301,11 @@ interface IPackageManager {
boolean isSafeMode();
void systemReady();
boolean hasSystemUidErrors();
/**
* Ask the package manager to perform dex-opt (if needed) on the given
* package, if it already hasn't done mode. Only does this if running
* in the special development "no pre-dexopt" mode.
*/
boolean performDexOpt(String packageName);
}

View File

@@ -180,12 +180,6 @@ public abstract class PackageManager {
*/
public static final int MATCH_DEFAULT_ONLY = 0x00010000;
/**
* {@link ApplicationInfo} flag: return the
* {link ApplicationInfo#expandable} boolean flag of the package.
*/
public static final int GET_EXPANDABLE = 0x00020000;
/**
* Permission check result: this is returned by {@link #checkPermission}
* if the permission has been granted to the given package.

View File

@@ -777,7 +777,7 @@ public class PackageParser {
targetCode = minCode = val.string.toString();
} else {
// If it's not a string, it's an integer.
minVers = val.data;
targetVers = minVers = val.data;
}
}
@@ -798,6 +798,25 @@ public class PackageParser {
sa.recycle();
if (minCode != null) {
if (!minCode.equals(mSdkCodename)) {
if (mSdkCodename != null) {
outError[0] = "Requires development platform " + minCode
+ " (current platform is " + mSdkCodename + ")";
} else {
outError[0] = "Requires development platform " + minCode
+ " but this is a release platform.";
}
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
}
} else if (minVers > mSdkVersion) {
outError[0] = "Requires newer sdk version #" + minVers
+ " (current version is #" + mSdkVersion + ")";
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
}
if (targetCode != null) {
if (!targetCode.equals(mSdkCodename)) {
if (mSdkCodename != null) {
@@ -817,13 +836,6 @@ public class PackageParser {
pkg.applicationInfo.targetSdkVersion = targetVers;
}
if (minVers > mSdkVersion) {
outError[0] = "Requires newer sdk version #" + minVers
+ " (current version is #" + mSdkVersion + ")";
mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
return null;
}
if (maxVers < mSdkVersion) {
outError[0] = "Requires older sdk version #" + maxVers
+ " (current version is #" + mSdkVersion + ")";
@@ -865,7 +877,7 @@ public class PackageParser {
XmlUtils.skipCurrentTag(parser);
} else if (tagName.equals("expandable")) {
pkg.expandable = true;
pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
XmlUtils.skipCurrentTag(parser);
} else {
Log.w(TAG, "Bad element under <manifest>: "
@@ -2262,9 +2274,6 @@ public class PackageParser {
public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>();
public int[] supportsDensities = null;
// If the application's window is expandable.
public boolean expandable;
// If this is a 3rd party app, this is the path of the zip file.
public String mPath;
@@ -2287,6 +2296,17 @@ public class PackageParser {
// preferred up order.
public int mPreferredOrder = 0;
// For use by package manager service to keep track of which apps
// have been installed with forward locking.
public boolean mForwardLocked;
// For use by the package manager to keep track of the path to the
// file an app came from.
public String mScanPath;
// For use by package manager to keep track of where it has done dexopt.
public boolean mDidDexOpt;
// Additional data supplied by callers.
public Object mExtras;
@@ -2439,9 +2459,6 @@ public class PackageParser {
&& p.supportsDensities != null) {
return true;
}
if ((flags & PackageManager.GET_EXPANDABLE) != 0) {
return true;
}
return false;
}
@@ -2462,9 +2479,6 @@ public class PackageParser {
if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
ai.supportsDensities = p.supportsDensities;
}
if ((flags & PackageManager.GET_EXPANDABLE) != 0) {
ai.expandable = p.expandable;
}
return ai;
}

View File

@@ -69,7 +69,8 @@ public class CompatibilityInfo {
public final boolean mScalingRequired;
public CompatibilityInfo(ApplicationInfo appInfo) {
mExpandable = mConfiguredExpandable = appInfo.expandable;
mExpandable = mConfiguredExpandable =
(appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0;
float packageDensityScale = -1.0f;
if (appInfo.supportsDensities != null) {