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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user