diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 51b2d3d58322c..7015381dc4fbe 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -553,12 +553,8 @@ public final class Pm { sessionParams.abiOverride = checkAbiArgument(nextOptionData()); break; case "--ephemeral": - case "--instant": sessionParams.setInstallAsInstantApp(true /*isInstantApp*/); break; - case "--full": - sessionParams.setInstallAsInstantApp(false /*isInstantApp*/); - break; case "--user": params.userId = UserHandle.parseUserArg(nextOptionData()); break; diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 165229912547c..333e412e1c337 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1687,7 +1687,7 @@ public class ApplicationPackageManager extends PackageManager { public int installExistingPackageAsUser(String packageName, int userId) throws NameNotFoundException { try { - int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/, + int res = mPM.installExistingPackageAsUser(packageName, userId, PackageManager.INSTALL_REASON_UNKNOWN); if (res == INSTALL_FAILED_INVALID_URI) { throw new NameNotFoundException("Package " + packageName + " doesn't exist"); diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 56609eb57b0d0..e6cae69324025 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -284,6 +284,8 @@ public class IntentFilter implements Parcelable { /** Whether or not the intent filter is visible to ephemeral apps. */ private boolean mVisibleToEphemeral; + /** Whether or not the intent filter is part of an ephemeral app. */ + private boolean mEphemeral; // These functions are the start of more optimized code for managing // the string sets... not yet implemented. @@ -654,10 +656,19 @@ public class IntentFilter implements Parcelable { mVisibleToEphemeral = visibleToEmphemeral; } /** @hide */ - public boolean isVisibleToInstantApp() { + public boolean isVisibleToEphemeral() { return mVisibleToEphemeral; } + /** @hide */ + public void setEphemeral(boolean ephemeral) { + mEphemeral = ephemeral; + } + /** @hide */ + public boolean isEphemeral() { + return mEphemeral; + } + /** * Add a new Intent action to match against. If any actions are included * in the filter, then an Intent's action must be one of those values for diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 9737b11a0133b..1fa4181cc2f8a 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -498,12 +498,11 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int PRIVATE_FLAG_DIRECT_BOOT_AWARE = 1 << 6; /** - * Value for {@link #privateFlags}: {@code true} if the application is installed - * as instant app. - * - * @hide + * Value for {@link #flags}: {@code true} if the application is blocked via restrictions + * and for most purposes is considered as not installed. + * {@hide} */ - public static final int PRIVATE_FLAG_INSTANT = 1 << 7; + public static final int PRIVATE_FLAG_EPHEMERAL = 1 << 7; /** * When set, at least one component inside this application is direct boot @@ -682,21 +681,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * * {@hide} */ - public String seInfo = "default"; - - /** - * The seinfo tag generated per-user. This value may change based upon the - * user's configuration. For example, when an instant app is installed for - * a user. It is an error if this field is ever {@code null} when trying to - * start a new process. - *

NOTE: We need to separate this out because we modify per-user values - * multiple times. This needs to be refactored since we're performing more - * work than necessary and these values should only be set once. When that - * happens, we can merge the per-user value with the seInfo state above. - * - * {@hide} - */ - public String seInfoUser; + public String seinfo = "default"; /** * Paths to all shared libraries this application is linked against. This @@ -1024,9 +1009,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { if (resourceDirs != null) { pw.println(prefix + "resourceDirs=" + Arrays.toString(resourceDirs)); } - if ((flags&DUMP_FLAG_DETAILS) != 0 && seInfo != null) { - pw.println(prefix + "seinfo=" + seInfo); - pw.println(prefix + "seinfoUser=" + seInfoUser); + if ((flags&DUMP_FLAG_DETAILS) != 0 && seinfo != null) { + pw.println(prefix + "seinfo=" + seinfo); } pw.println(prefix + "dataDir=" + dataDir); if ((flags&DUMP_FLAG_DETAILS) != 0) { @@ -1136,8 +1120,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { primaryCpuAbi = orig.primaryCpuAbi; secondaryCpuAbi = orig.secondaryCpuAbi; resourceDirs = orig.resourceDirs; - seInfo = orig.seInfo; - seInfoUser = orig.seInfoUser; + seinfo = orig.seinfo; sharedLibraryFiles = orig.sharedLibraryFiles; dataDir = orig.dataDir; deviceEncryptedDataDir = deviceProtectedDataDir = orig.deviceProtectedDataDir; @@ -1198,8 +1181,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeString(primaryCpuAbi); dest.writeString(secondaryCpuAbi); dest.writeStringArray(resourceDirs); - dest.writeString(seInfo); - dest.writeString(seInfoUser); + dest.writeString(seinfo); dest.writeStringArray(sharedLibraryFiles); dest.writeString(dataDir); dest.writeString(deviceProtectedDataDir); @@ -1260,8 +1242,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { primaryCpuAbi = source.readString(); secondaryCpuAbi = source.readString(); resourceDirs = source.readStringArray(); - seInfo = source.readString(); - seInfoUser = source.readString(); + seinfo = source.readString(); sharedLibraryFiles = source.readStringArray(); dataDir = source.readString(); deviceEncryptedDataDir = deviceProtectedDataDir = source.readString(); @@ -1349,6 +1330,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } else { dataDir = credentialProtectedDataDir; } + // TODO: modify per-user ephemerality } /** @@ -1433,7 +1415,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * @hide */ public boolean isInstantApp() { - return (privateFlags & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0; + return (privateFlags & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0; } /** diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index ffb777db579c5..9d36a730ac090 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -553,8 +553,7 @@ interface IPackageManager { boolean setInstallLocation(int loc); int getInstallLocation(); - int installExistingPackageAsUser(String packageName, int userId, int installFlags, - int installReason); + int installExistingPackageAsUser(String packageName, int userId, int installReason); void verifyPendingInstall(int id, int verificationCode); void extendVerificationTimeout(int id, int verificationCodeAtTimeout, long millisecondsToDelay); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 278a6d09d9fe2..4de967c50dcd6 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1096,11 +1096,9 @@ public class PackageInstaller { @SystemApi public void setInstallAsInstantApp(boolean isInstantApp) { if (isInstantApp) { - installFlags |= PackageManager.INSTALL_INSTANT_APP; - installFlags &= ~PackageManager.INSTALL_FULL_APP; + installFlags |= PackageManager.INSTALL_EPHEMERAL; } else { - installFlags &= ~PackageManager.INSTALL_INSTANT_APP; - installFlags |= PackageManager.INSTALL_FULL_APP; + installFlags &= ~PackageManager.INSTALL_EPHEMERAL; } } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5733982315d7e..308153dd3538c 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -452,17 +452,17 @@ public abstract class PackageManager { /** * Internal {@link PackageInfo} flag: include components that are part of an - * instant app. By default, instant app components are not matched. + * ephemeral app. By default, ephemeral components are not matched. * @hide */ - public static final int MATCH_INSTANT = 0x00800000; + public static final int MATCH_EPHEMERAL = 0x00800000; /** * Internal {@link PackageInfo} flag: include only components that are exposed to * ephemeral apps. * @hide */ - public static final int MATCH_VISIBLE_TO_INSTANT_APP_ONLY = 0x01000000; + public static final int MATCH_VISIBLE_TO_EPHEMERAL_ONLY = 0x01000000; /** * Internal flag used to indicate that a system component has done their @@ -613,7 +613,7 @@ public abstract class PackageManager { INSTALL_GRANT_RUNTIME_PERMISSIONS, INSTALL_FORCE_VOLUME_UUID, INSTALL_FORCE_PERMISSION_PROMPT, - INSTALL_INSTANT_APP, + INSTALL_EPHEMERAL, INSTALL_DONT_KILL_APP, }) @Retention(RetentionPolicy.SOURCE) @@ -714,16 +714,7 @@ public abstract class PackageManager { * * @hide */ - public static final int INSTALL_INSTANT_APP = 0x00000800; - - /** - * Flag parameter for {@link #installPackage} to indicate that this package is - * to be installed as a heavy weight app. This is fundamentally the opposite of - * {@link #INSTALL_INSTANT_APP}. - * - * @hide - */ - public static final int INSTALL_FULL_APP = 0x00004000; + public static final int INSTALL_EPHEMERAL = 0x00000800; /** * Flag parameter for {@link #installPackage} to indicate that this package contains @@ -1194,12 +1185,12 @@ public abstract class PackageManager { public static final int INSTALL_FAILED_ABORTED = -115; /** - * Installation failed return code: instant app installs are incompatible with some + * Installation failed return code: ephemeral app installs are incompatible with some * other installation flags supplied for the operation; or other circumstances such - * as trying to upgrade a system app via an instant app install. + * as trying to upgrade a system app via an ephemeral install. * @hide */ - public static final int INSTALL_FAILED_INSTANT_APP_INVALID = -116; + public static final int INSTALL_FAILED_EPHEMERAL_INVALID = -116; /** @hide */ @IntDef(flag = true, value = { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 98e71a0b4fa21..7a9aaaf401326 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -720,8 +720,6 @@ public class PackageParser { public final static int PARSE_COLLECT_CERTIFICATES = 1<<8; public final static int PARSE_TRUSTED_OVERLAY = 1<<9; public final static int PARSE_ENFORCE_CODE = 1<<10; - /** @deprecated remove when fixing b/34761192 */ - @Deprecated public final static int PARSE_IS_EPHEMERAL = 1<<11; public final static int PARSE_FORCE_SDK = 1<<12; @@ -2014,6 +2012,10 @@ public class PackageParser { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; } + if ((flags & PARSE_IS_EPHEMERAL) != 0) { + pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_EPHEMERAL; + } + if (sa.getBoolean(com.android.internal.R.styleable.AndroidManifest_isolatedSplits, false)) { pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING; } @@ -4147,8 +4149,11 @@ public class PackageParser { ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE; } - final boolean visibleToEphemeral = - sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false); + final boolean hasVisibleToEphemeral = + sa.hasValue(R.styleable.AndroidManifestActivity_visibleToInstantApps); + final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0); + final boolean visibleToEphemeral = isEphemeral + || sa.getBoolean(R.styleable.AndroidManifestActivity_visibleToInstantApps, false); if (visibleToEphemeral) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4183,6 +4188,8 @@ public class PackageParser { intent, outError)) { return null; } + intent.setEphemeral(isEphemeral); + intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); if (intent.countActions() == 0) { Slog.w(TAG, "No actions in intent filter at " + mArchiveSourcePath + " " @@ -4191,8 +4198,7 @@ public class PackageParser { a.intents.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter - intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); - if (intent.isVisibleToInstantApp()) { + if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } } else if (!receiver && parser.getName().equals("preferred")) { @@ -4201,6 +4207,8 @@ public class PackageParser { intent, outError)) { return null; } + intent.setEphemeral(isEphemeral); + intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); if (intent.countActions() == 0) { Slog.w(TAG, "No actions in preferred at " + mArchiveSourcePath + " " @@ -4212,8 +4220,7 @@ public class PackageParser { owner.preferredActivityFilters.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter - intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); - if (intent.isVisibleToInstantApp()) { + if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } } else if (parser.getName().equals("meta-data")) { @@ -4465,8 +4472,9 @@ public class PackageParser { } // TODO add visibleToInstantApps attribute to activity alias - final boolean visibleToEphemeral = - ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0); + final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0); + final boolean visibleToEphemeral = isEphemeral + || ((a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) != 0); sa.recycle(); @@ -4494,12 +4502,13 @@ public class PackageParser { + mArchiveSourcePath + " " + parser.getPositionDescription()); } else { - intent.setVisibleToEphemeral( - visibleToEphemeral || isWebBrowsableIntent(intent)); + intent.setEphemeral(isEphemeral); + intent.setVisibleToEphemeral(visibleToEphemeral + || isWebBrowsableIntent(intent)); a.intents.add(intent); } // adjust activity flags when we implicitly expose it via a browsable filter - if (intent.isVisibleToInstantApp()) { + if (intent.isVisibleToEphemeral()) { a.info.flags |= ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL; } } else if (parser.getName().equals("meta-data")) { @@ -4640,8 +4649,11 @@ public class PackageParser { ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE; } - final boolean visibleToEphemeral = - sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false); + final boolean hasVisibleToEphemeral = + sa.hasValue(R.styleable.AndroidManifestProvider_visibleToInstantApps); + final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0); + final boolean visibleToEphemeral = isEphemeral + || sa.getBoolean(R.styleable.AndroidManifestProvider_visibleToInstantApps, false); if (visibleToEphemeral) { p.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4669,7 +4681,7 @@ public class PackageParser { p.info.authority = cpname.intern(); if (!parseProviderTags( - res, parser, visibleToEphemeral, p, outError)) { + res, parser, isEphemeral, hasVisibleToEphemeral, visibleToEphemeral, p, outError)) { return null; } @@ -4677,7 +4689,8 @@ public class PackageParser { } private boolean parseProviderTags(Resources res, XmlResourceParser parser, - boolean visibleToEphemeral, Provider outInfo, String[] outError) + boolean isEphemeral, boolean hasVisibleToEphemeral, boolean visibleToEphemeral, + Provider outInfo, String[] outError) throws XmlPullParserException, IOException { int outerDepth = parser.getDepth(); int type; @@ -4694,10 +4707,11 @@ public class PackageParser { intent, outError)) { return false; } + intent.setEphemeral(isEphemeral); + intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); outInfo.intents.add(intent); // adjust provider flags when we implicitly expose it via a browsable filter - intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); - if (intent.isVisibleToInstantApp()) { + if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) { outInfo.info.flags |= ProviderInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4949,8 +4963,11 @@ public class PackageParser { ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE; } - final boolean visibleToEphemeral = - sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false); + final boolean hasVisibleToEphemeral = + sa.hasValue(R.styleable.AndroidManifestService_visibleToInstantApps); + final boolean isEphemeral = ((flags & PARSE_IS_EPHEMERAL) != 0); + final boolean visibleToEphemeral = isEphemeral + || sa.getBoolean(R.styleable.AndroidManifestService_visibleToInstantApps, false); if (visibleToEphemeral) { s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL; } @@ -4982,9 +4999,10 @@ public class PackageParser { intent, outError)) { return null; } - // adjust activity flags when we implicitly expose it via a browsable filter + intent.setEphemeral(isEphemeral); intent.setVisibleToEphemeral(visibleToEphemeral || isWebBrowsableIntent(intent)); - if (intent.isVisibleToInstantApp()) { + // adjust activity flags when we implicitly expose it via a browsable filter + if (!hasVisibleToEphemeral && intent.isVisibleToEphemeral()) { s.info.flags |= ServiceInfo.FLAG_VISIBLE_TO_EPHEMERAL; } s.intents.add(intent); @@ -6464,9 +6482,6 @@ public class PackageParser { if (state.stopped) { return true; } - if (state.instantApp != p.applicationInfo.isInstantApp()) { - return true; - } if ((flags & PackageManager.GET_META_DATA) != 0 && (metaData != null || p.mAppMetaData != null)) { return true; @@ -6502,11 +6517,6 @@ public class PackageParser { } else { ai.flags &= ~ApplicationInfo.FLAG_SUSPENDED; } - if (state.instantApp) { - ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT; - } else { - ai.privateFlags &= ~ApplicationInfo.PRIVATE_FLAG_INSTANT; - } if (state.hidden) { ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN; } else { @@ -6527,7 +6537,6 @@ public class PackageParser { if (ai.category == ApplicationInfo.CATEGORY_UNDEFINED) { ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName); } - ai.seInfoUser = SELinuxUtil.assignSeinfoUser(state); } public static ApplicationInfo generateApplicationInfo(Package p, int flags, diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java index 24f116452f0bc..e19aa99599efa 100644 --- a/core/java/android/content/pm/PackageUserState.java +++ b/core/java/android/content/pm/PackageUserState.java @@ -43,7 +43,6 @@ public class PackageUserState { public boolean hidden; // Is the app restricted by owner / admin public boolean suspended; public boolean blockUninstall; - public boolean instantApp; public int enabled; public String lastDisableAppCaller; public int domainVerificationStatus; @@ -72,7 +71,6 @@ public class PackageUserState { hidden = o.hidden; suspended = o.suspended; blockUninstall = o.blockUninstall; - instantApp = o.instantApp; enabled = o.enabled; lastDisableAppCaller = o.lastDisableAppCaller; domainVerificationStatus = o.domainVerificationStatus; @@ -190,9 +188,6 @@ public class PackageUserState { if (blockUninstall != oldState.blockUninstall) { return false; } - if (instantApp != oldState.instantApp) { - return false; - } if (enabled != oldState.enabled) { return false; } diff --git a/core/java/android/content/pm/SELinuxUtil.java b/core/java/android/content/pm/SELinuxUtil.java deleted file mode 100644 index 871f67214fc77..0000000000000 --- a/core/java/android/content/pm/SELinuxUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.content.pm; - -import com.android.internal.util.ArrayUtils; - -/** - * Utility methods that need to be used in application space. - * @hide - */ -public final class SELinuxUtil { - - /** Append to existing seinfo label for instant apps @hide */ - private static final String INSTANT_APP_STR = ":ephemeralapp"; - - /** Append to existing seinfo when modifications are complete @hide */ - private static final String COMPLETE_TAG = "complete"; - private static final String COMPLETE_STR = ":" + COMPLETE_TAG; - - /** @hide */ - public static String assignSeinfoUser(PackageUserState userState) { - String seInfo = ""; - if (userState.instantApp) - seInfo += INSTANT_APP_STR; - seInfo += COMPLETE_STR; - return seInfo; - } - -} diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b554e2d13e726..2dfba28ad6e38 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4128,20 +4128,20 @@ public final class Settings { } /** - * System settings which can be accessed by instant apps. + * System settings which can be accessed by ephemeral apps. * @hide */ - public static final Set INSTANT_APP_SETTINGS = new ArraySet<>(); + public static final Set EPHEMERAL_SETTINGS = new ArraySet<>(); static { - INSTANT_APP_SETTINGS.add(TEXT_AUTO_REPLACE); - INSTANT_APP_SETTINGS.add(TEXT_AUTO_CAPS); - INSTANT_APP_SETTINGS.add(TEXT_AUTO_PUNCTUATE); - INSTANT_APP_SETTINGS.add(TEXT_SHOW_PASSWORD); - INSTANT_APP_SETTINGS.add(DATE_FORMAT); - INSTANT_APP_SETTINGS.add(FONT_SCALE); - INSTANT_APP_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED); - INSTANT_APP_SETTINGS.add(TIME_12_24); - INSTANT_APP_SETTINGS.add(SOUND_EFFECTS_ENABLED); + EPHEMERAL_SETTINGS.add(TEXT_AUTO_REPLACE); + EPHEMERAL_SETTINGS.add(TEXT_AUTO_CAPS); + EPHEMERAL_SETTINGS.add(TEXT_AUTO_PUNCTUATE); + EPHEMERAL_SETTINGS.add(TEXT_SHOW_PASSWORD); + EPHEMERAL_SETTINGS.add(DATE_FORMAT); + EPHEMERAL_SETTINGS.add(FONT_SCALE); + EPHEMERAL_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED); + EPHEMERAL_SETTINGS.add(TIME_12_24); + EPHEMERAL_SETTINGS.add(SOUND_EFFECTS_ENABLED); } /** @@ -6988,17 +6988,17 @@ public final class Settings { } /** - * Secure settings which can be accessed by instant apps. + * Secure settings which can be accessed by ephemeral apps. * @hide */ - public static final Set INSTANT_APP_SETTINGS = new ArraySet<>(); + public static final Set EPHEMERAL_SETTINGS = new ArraySet<>(); static { - INSTANT_APP_SETTINGS.add(ENABLED_ACCESSIBILITY_SERVICES); - INSTANT_APP_SETTINGS.add(ACCESSIBILITY_SPEAK_PASSWORD); - INSTANT_APP_SETTINGS.add(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED); + EPHEMERAL_SETTINGS.add(ENABLED_ACCESSIBILITY_SERVICES); + EPHEMERAL_SETTINGS.add(ACCESSIBILITY_SPEAK_PASSWORD); + EPHEMERAL_SETTINGS.add(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED); - INSTANT_APP_SETTINGS.add(DEFAULT_INPUT_METHOD); - INSTANT_APP_SETTINGS.add(ENABLED_INPUT_METHODS); + EPHEMERAL_SETTINGS.add(DEFAULT_INPUT_METHOD); + EPHEMERAL_SETTINGS.add(ENABLED_INPUT_METHODS); } /** @@ -10136,16 +10136,16 @@ public final class Settings { public static final String CELL_ON = "cell_on"; /** - * Global settings which can be accessed by instant apps. + * Global settings which can be accessed by ephemeral apps. * @hide */ - public static final Set INSTANT_APP_SETTINGS = new ArraySet<>(); + public static final Set EPHEMERAL_SETTINGS = new ArraySet<>(); static { - INSTANT_APP_SETTINGS.add(WAIT_FOR_DEBUGGER); - INSTANT_APP_SETTINGS.add(DEVICE_PROVISIONED); - INSTANT_APP_SETTINGS.add(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES); - INSTANT_APP_SETTINGS.add(DEVELOPMENT_FORCE_RTL); - INSTANT_APP_SETTINGS.add(EPHEMERAL_COOKIE_MAX_SIZE_BYTES); + EPHEMERAL_SETTINGS.add(WAIT_FOR_DEBUGGER); + EPHEMERAL_SETTINGS.add(DEVICE_PROVISIONED); + EPHEMERAL_SETTINGS.add(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES); + EPHEMERAL_SETTINGS.add(DEVELOPMENT_FORCE_RTL); + EPHEMERAL_SETTINGS.add(EPHEMERAL_COOKIE_MAX_SIZE_BYTES); } /** diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java index e088717f5fe41..eec3cb0be11f5 100644 --- a/core/java/com/android/internal/content/PackageHelper.java +++ b/core/java/com/android/internal/content/PackageHelper.java @@ -534,7 +534,7 @@ public class PackageHelper { final int prefer; final boolean checkBoth; boolean ephemeral = false; - if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + if ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) { prefer = RECOMMEND_INSTALL_INTERNAL; ephemeral = true; checkBoth = false; diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java index 0fc9a4d6e408e..4c1119757eba3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java @@ -116,7 +116,7 @@ public class AppRestrictionsHelper { if (info == null || !info.enabled || (info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { mIPm.installExistingPackageAsUser(packageName, mUser.getIdentifier(), - 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN); + PackageManager.INSTALL_REASON_UNKNOWN); if (DEBUG) { Log.d(TAG, "Installing " + packageName); } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java index 8cfec7a520b7f..4df199cbd4bd5 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java @@ -146,7 +146,7 @@ public class AppRestrictionsHelperTest extends BaseTest { mHelper.applyUserAppsStates(mockListener); verify(mIpm, times(1)).installExistingPackageAsUser("app1", testUserId, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN); + PackageManager.INSTALL_REASON_UNKNOWN); verify(mIpm, times(1)).setApplicationHiddenSettingAsUser("app2", false, testUserId); verify(mockListener).onDisableUiForPackage("app2"); verify(mPm, times(1)).deletePackageAsUser(eq("app3"), any(IPackageDeleteObserver.class), diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index a3a8553585b2c..edcb9b51fceb8 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1531,14 +1531,14 @@ public class SettingsProvider extends ContentProvider { } } - private Set getInstantAppAccessibleSettings(int settingsType) { + private Set getEphemeralAccessibleSettings(int settingsType) { switch (settingsType) { case SETTINGS_TYPE_GLOBAL: - return Settings.Global.INSTANT_APP_SETTINGS; + return Settings.Global.EPHEMERAL_SETTINGS; case SETTINGS_TYPE_SECURE: - return Settings.Secure.INSTANT_APP_SETTINGS; + return Settings.Secure.EPHEMERAL_SETTINGS; case SETTINGS_TYPE_SYSTEM: - return Settings.System.INSTANT_APP_SETTINGS; + return Settings.System.EPHEMERAL_SETTINGS; default: throw new IllegalArgumentException("Invalid settings type: " + settingsType); } @@ -1547,7 +1547,7 @@ public class SettingsProvider extends ContentProvider { private List getSettingsNamesLocked(int settingsType, int userId) { ApplicationInfo ai = getCallingApplicationInfoOrThrow(userId); if (ai.isInstantApp()) { - return new ArrayList(getInstantAppAccessibleSettings(settingsType)); + return new ArrayList(getEphemeralAccessibleSettings(settingsType)); } else { return mSettingsRegistry.getSettingsNamesLocked(settingsType, userId); } @@ -1561,7 +1561,7 @@ public class SettingsProvider extends ContentProvider { if (!ai.isInstantApp()) { return; } - if (!getInstantAppAccessibleSettings(settingsType).contains(settingName)) { + if (!getEphemeralAccessibleSettings(settingsType).contains(settingName)) { throw new SecurityException("Setting " + settingName + " is not accessible from" + " ephemeral package " + getCallingPackage()); } diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java index 40499c96eb4b8..14abb537db9f8 100644 --- a/services/core/java/com/android/server/IntentResolver.java +++ b/services/core/java/com/android/server/IntentResolver.java @@ -351,7 +351,7 @@ public abstract class IntentResolver { } public List queryIntentFromList(Intent intent, String resolvedType, boolean defaultOnly, - ArrayList listCut, int userId) { + boolean visibleToEphemeral, boolean isEphemeral, ArrayList listCut, int userId) { ArrayList resultList = new ArrayList(); final boolean debug = localLOGV || @@ -361,8 +361,8 @@ public abstract class IntentResolver { final String scheme = intent.getScheme(); int N = listCut.size(); for (int i = 0; i < N; ++i) { - buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, - listCut.get(i), resultList, userId); + buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral, + isEphemeral, resolvedType, scheme, listCut.get(i), resultList, userId); } filterResults(resultList); sortResults(resultList); @@ -370,7 +370,7 @@ public abstract class IntentResolver { } public List queryIntent(Intent intent, String resolvedType, boolean defaultOnly, - int userId) { + boolean visibleToEphemeral, boolean isEphemeral, int userId) { String scheme = intent.getScheme(); ArrayList finalList = new ArrayList(); @@ -443,20 +443,20 @@ public abstract class IntentResolver { FastImmutableArraySet categories = getFastIntentCategories(intent); if (firstTypeCut != null) { - buildResolveList(intent, categories, debug, defaultOnly, resolvedType, - scheme, firstTypeCut, finalList, userId); + buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral, + isEphemeral, resolvedType, scheme, firstTypeCut, finalList, userId); } if (secondTypeCut != null) { - buildResolveList(intent, categories, debug, defaultOnly, resolvedType, - scheme, secondTypeCut, finalList, userId); + buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral, + isEphemeral, resolvedType, scheme, secondTypeCut, finalList, userId); } if (thirdTypeCut != null) { - buildResolveList(intent, categories, debug, defaultOnly, resolvedType, - scheme, thirdTypeCut, finalList, userId); + buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral, + isEphemeral, resolvedType, scheme, thirdTypeCut, finalList, userId); } if (schemeCut != null) { - buildResolveList(intent, categories, debug, defaultOnly, resolvedType, - scheme, schemeCut, finalList, userId); + buildResolveList(intent, categories, debug, defaultOnly, visibleToEphemeral, + isEphemeral, resolvedType, scheme, schemeCut, finalList, userId); } filterResults(finalList); sortResults(finalList); @@ -694,8 +694,8 @@ public abstract class IntentResolver { } private void buildResolveList(Intent intent, FastImmutableArraySet categories, - boolean debug, boolean defaultOnly, String resolvedType, String scheme, - F[] src, List dest, int userId) { + boolean debug, boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, + String resolvedType, String scheme, F[] src, List dest, int userId) { final String action = intent.getAction(); final Uri data = intent.getData(); final String packageName = intent.getPackage(); @@ -735,6 +735,15 @@ public abstract class IntentResolver { continue; } + // throw out filters that aren't visible to ephemeral apps + if (visibleToEphemeral && !filter.isVisibleToEphemeral()) { + continue; + } + // throw out ephemeral filters if we're not explicitly requesting them + if (!isEphemeral && filter.isEphemeral()) { + continue; + } + // Are we verified ? if (filter.getAutoVerify()) { if (localVerificationLOGV || debug) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index d9123f41729ce..a73eb18b3c61f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -293,7 +293,6 @@ import android.service.voice.IVoiceInteractionSession; import android.service.voice.VoiceInteractionManagerInternal; import android.service.voice.VoiceInteractionSession; import android.telecom.TelecomManager; -import android.text.TextUtils; import android.text.format.DateUtils; import android.text.format.Time; import android.text.style.SuggestionSpan; @@ -3777,11 +3776,6 @@ public class ActivityManagerService extends IActivityManager.Stub app.requiredAbi = requiredAbi; app.instructionSet = instructionSet; - // the per-user SELinux context must be set - if (TextUtils.isEmpty(app.info.seInfoUser)) { - throw new IllegalStateException("SELinux tag not defined"); - } - final String seInfo = app.info.seInfo + app.info.seInfoUser; // Start the process. It will either succeed and return a result containing // the PID of the new process, or else throw a RuntimeException. boolean isActivityProcess = (entryPoint == null); @@ -3793,12 +3787,12 @@ public class ActivityManagerService extends IActivityManager.Stub if (hostingType.equals("webview_service")) { startResult = Process.startWebView(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, - app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, + app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, app.info.dataDir, null, entryPointArgs); } else { startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, - app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, + app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, entryPointArgs); } checkTime(startTime, "startProcess: returned from zygote!"); @@ -3814,7 +3808,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { AppGlobals.getPackageManager().logAppProcessStartIfNeeded(app.processName, app.uid, - seInfo, app.info.sourceDir, startResult.pid); + app.info.seinfo, app.info.sourceDir, startResult.pid); } catch (RemoteException ex) { // Ignore } @@ -18780,7 +18774,8 @@ public class ActivityManagerService extends IActivityManager.Stub } List registeredReceiversForUser = mReceiverResolver.queryIntent(intent, - resolvedType, false /*defaultOnly*/, users[i]); + resolvedType, false, false /*visibleToEphemeral*/, + false /*isInstant*/, users[i]); if (registeredReceivers == null) { registeredReceivers = registeredReceiversForUser; } else if (registeredReceiversForUser != null) { @@ -18789,7 +18784,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } else { registeredReceivers = mReceiverResolver.queryIntent(intent, - resolvedType, false /*defaultOnly*/, userId); + resolvedType, false, false /*visibleToEphemeral*/, + false /*isInstant*/, userId); } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 2f844863abdf7..95734a4ed7822 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1196,7 +1196,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) { try { return AppGlobals.getPackageManager().resolveIntent(intent, resolvedType, - PackageManager.MATCH_INSTANT | PackageManager.MATCH_DEFAULT_ONLY | flags + PackageManager.MATCH_DEFAULT_ONLY | flags | ActivityManagerService.STOCK_PM_FLAGS, userId); } catch (RemoteException e) { } diff --git a/services/core/java/com/android/server/firewall/IntentFirewall.java b/services/core/java/com/android/server/firewall/IntentFirewall.java index 376a864e77726..93c14b94d27e2 100644 --- a/services/core/java/com/android/server/firewall/IntentFirewall.java +++ b/services/core/java/com/android/server/firewall/IntentFirewall.java @@ -151,7 +151,8 @@ public class IntentFirewall { // For the first pass, find all the rules that have at least one intent-filter or // component-filter that matches this intent List candidateRules; - candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, 0); + candidateRules = resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, + false /*visibleToEphemeral*/, false /*isInstant*/, 0); if (candidateRules == null) { candidateRules = new ArrayList(); } diff --git a/services/core/java/com/android/server/pm/EphemeralResolver.java b/services/core/java/com/android/server/pm/EphemeralResolver.java index d99a1b685da30..3c554221e17f1 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolver.java +++ b/services/core/java/com/android/server/pm/EphemeralResolver.java @@ -234,7 +234,8 @@ public abstract class EphemeralResolver { } } List matchedResolveInfoList = ephemeralResolver.queryIntent( - intent, resolvedType, false /*defaultOnly*/, userId); + intent, resolvedType, false /*defaultOnly*/, false /*visibleToEphemeral*/, + false /*isInstant*/, userId); if (!matchedResolveInfoList.isEmpty()) { return matchedResolveInfoList.get(0); } diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java index 23925ad18f1b0..42934a43fb25e 100644 --- a/services/core/java/com/android/server/pm/InstantAppRegistry.java +++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java @@ -217,7 +217,7 @@ class InstantAppRegistry { propagateInstantAppPermissionsIfNeeded(pkg.packageName, userId); // Track instant apps - if (ps.getInstantApp(userId)) { + if (pkg.applicationInfo.isInstantApp()) { addInstantAppLPw(userId, ps.appId); } @@ -257,7 +257,7 @@ class InstantAppRegistry { continue; } - if (ps.getInstantApp(userId)) { + if (pkg.applicationInfo.isInstantApp()) { // Add a record for an uninstalled instant app addUninstalledInstantAppLPw(pkg, userId); removeInstantAppLPw(userId, ps.appId); @@ -533,12 +533,11 @@ class InstantAppRegistry { final int packageCount = mService.mPackages.size(); for (int i = 0; i < packageCount; i++) { - final PackageParser.Package pkg = mService.mPackages.valueAt(i); - final PackageSetting ps = (PackageSetting) pkg.mExtras; - if (ps == null || !ps.getInstantApp(userId)) { + PackageParser.Package pkg = mService.mPackages.valueAt(i); + if (!pkg.applicationInfo.isInstantApp()) { continue; } - final InstantAppInfo info = createInstantAppInfoForPackage( + InstantAppInfo info = createInstantAppInfoForPackage( pkg, userId, true); if (info == null) { continue; diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 0df4570f87f20..cb32eb77cc95f 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -683,9 +683,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub { File stageDir = null; String stageCid = null; if ((params.installFlags & PackageManager.INSTALL_INTERNAL) != 0) { - final boolean isInstant = - (params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0; - stageDir = buildStageDir(params.volumeUuid, sessionId, isInstant); + final boolean isEphemeral = + (params.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0; + stageDir = buildStageDir(params.volumeUuid, sessionId, isEphemeral); } else { stageCid = buildExternalStageCid(sessionId); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 463cfac6127fd..067a136427816 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -704,7 +704,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final ApkLite apk; try { int flags = PackageParser.PARSE_COLLECT_CERTIFICATES; - if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + if ((params.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) { flags |= PackageParser.PARSE_IS_EPHEMERAL; } apk = PackageParser.parseApkLite(addedFile, flags); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8ef472eb917b1..15920a74ce445 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -41,7 +41,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_ALREADY_EXISTS; import static android.content.pm.PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER; import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE; import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION; -import static android.content.pm.PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID; +import static android.content.pm.PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID; import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; @@ -164,7 +164,6 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; -import android.content.pm.SELinuxUtil; import android.content.pm.ServiceInfo; import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; @@ -422,11 +421,8 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_CHECK_ONLY = 1<<13; static final int SCAN_DONT_KILL_APP = 1<<14; static final int SCAN_IGNORE_FROZEN = 1<<15; - static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<16; - static final int SCAN_AS_INSTANT_APP = 1<<17; - static final int SCAN_AS_FULL_APP = 1<<18; - /** Should not be with the scan flags */ - static final int FLAGS_REMOVE_CHATTY = 1<<31; + static final int REMOVE_CHATTY = 1<<16; + static final int SCAN_FIRST_BOOT_OR_UPGRADE = 1<<17; private static final String STATIC_SHARED_LIB_DELIMITER = "_"; @@ -1782,32 +1778,28 @@ public class PackageManagerService extends IPackageManager.Stub { // the first time vs. those who are seeing an update. int[] firstUsers = EMPTY_INT_ARRAY; int[] updateUsers = EMPTY_INT_ARRAY; - final boolean allNewUsers = res.origUsers == null || res.origUsers.length == 0; - final PackageSetting ps = (PackageSetting) res.pkg.mExtras; - for (int newUser : res.newUsers) { - if (ps.getInstantApp(newUser)) { - continue; - } - if (allNewUsers) { - firstUsers = ArrayUtils.appendInt(firstUsers, newUser); - continue; - } - boolean isNew = true; - for (int origUser : res.origUsers) { - if (origUser == newUser) { - isNew = false; - break; + if (res.origUsers == null || res.origUsers.length == 0) { + firstUsers = res.newUsers; + } else { + for (int newUser : res.newUsers) { + boolean isNew = true; + for (int origUser : res.origUsers) { + if (origUser == newUser) { + isNew = false; + break; + } + } + if (isNew) { + firstUsers = ArrayUtils.appendInt(firstUsers, newUser); + } else { + updateUsers = ArrayUtils.appendInt(updateUsers, newUser); } - } - if (isNew) { - firstUsers = ArrayUtils.appendInt(firstUsers, newUser); - } else { - updateUsers = ArrayUtils.appendInt(updateUsers, newUser); } } - // Send installed broadcasts if the package is not a static shared lib. - if (res.pkg.staticSharedLibName == null) { + // Send installed broadcasts if the install/update is not ephemeral + // and the package is not a static shared lib. + if (!isEphemeral(res.pkg) && res.pkg.staticSharedLibName == null) { mProcessLoggingHandler.invalidateProcessLoggingBaseApkHash(res.pkg.baseCodePath); // Send added for users that see the package for the first time @@ -1894,14 +1886,16 @@ public class PackageManagerService extends IPackageManager.Stub { } } - // Notify DexManager that the package was installed for new users. - // The updated users should already be indexed and the package code paths - // should not change. - // Don't notify the manager for ephemeral apps as they are not expected to - // survive long enough to benefit of background optimizations. - for (int userId : firstUsers) { - PackageInfo info = getPackageInfo(packageName, /*flags*/ 0, userId); - mDexManager.notifyPackageInstalled(info, userId); + if (!isEphemeral(res.pkg)) { + // Notify DexManager that the package was installed for new users. + // The updated users should already be indexed and the package code paths + // should not change. + // Don't notify the manager for ephemeral apps as they are not expected to + // survive long enough to benefit of background optimizations. + for (int userId : firstUsers) { + PackageInfo info = getPackageInfo(packageName, /*flags*/ 0, userId); + mDexManager.notifyPackageInstalled(info, userId); + } } } @@ -3335,14 +3329,14 @@ public class PackageManagerService extends IPackageManager.Stub { && callingAppId != Process.ROOT_UID && checkUidPermission(Manifest.permission.ACCESS_INSTANT_APPS, Binder.getCallingUid()) != PackageManager.PERMISSION_GRANTED) { - final String instantAppPackageName = getInstantAppPackageName(Binder.getCallingUid()); - if (instantAppPackageName != null) { + final String ephemeralPackageName = getEphemeralPackageName(Binder.getCallingUid()); + if (ephemeralPackageName != null) { // ephemeral apps can only get information on themselves - if (!instantAppPackageName.equals(p.packageName)) { + if (!ephemeralPackageName.equals(p.packageName)) { return null; } } else { - if (ps.getInstantApp(userId)) { + if (p.applicationInfo.isInstantApp()) { // only get access to the ephemeral app if we've been granted access if (!mInstantAppRegistry.isInstantAccessGranted( userId, callingAppId, ps.appId)) { @@ -3953,17 +3947,17 @@ public class PackageManagerService extends IPackageManager.Stub { flags |= PackageManager.MATCH_SYSTEM_ONLY; } final int callingUid = Binder.getCallingUid(); - if (getInstantAppPackageName(callingUid) != null) { + if (callingUid == Process.SYSTEM_UID || callingUid == 0) { + // The system sees all components + flags |= PackageManager.MATCH_EPHEMERAL; + } else if (getEphemeralPackageName(callingUid) != null) { // But, ephemeral apps see both ephemeral and exposed, non-ephemeral components - flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY; - flags |= PackageManager.MATCH_INSTANT; + flags |= PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY; + flags |= PackageManager.MATCH_EPHEMERAL; } else { // Otherwise, prevent leaking ephemeral components - flags &= ~PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY; - if (callingUid != Process.SYSTEM_UID && callingUid != 0) { - // Unless called from the system process - flags &= ~PackageManager.MATCH_INSTANT; - } + flags &= ~PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY; + flags &= ~PackageManager.MATCH_EPHEMERAL; } return updateFlagsForComponent(flags, userId, cookie); } @@ -4692,8 +4686,7 @@ public class PackageManagerService extends IPackageManager.Stub { return; } - final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps.getInstantApp(userId) && !bp.isInstant()) { + if (pkg.applicationInfo.isInstantApp() && !bp.isInstant()) { throw new SecurityException("Cannot grant non-ephemeral permission" + name + " for package " + packageName); } @@ -5742,7 +5735,8 @@ public class PackageManagerService extends IPackageManager.Stub { List pprefs = ppir != null ? ppir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, - userId) + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0, + (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId) : null; if (pprefs != null && pprefs.size() > 0) { final int M = pprefs.size(); @@ -5814,7 +5808,8 @@ public class PackageManagerService extends IPackageManager.Stub { List prefs = pir != null ? pir.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, - userId) + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0, + (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId) : null; if (prefs != null && prefs.size() > 0) { boolean changed = false; @@ -5985,7 +5980,8 @@ public class PackageManagerService extends IPackageManager.Stub { String resolvedType, int userId) { CrossProfileIntentResolver resolver = mSettings.mCrossProfileIntentResolvers.get(userId); if (resolver != null) { - return resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, userId); + return resolver.queryIntent(intent, resolvedType, false /*defaultOnly*/, + false /*visibleToEphemeral*/, false /*isInstant*/, userId); } return null; } @@ -6004,17 +6000,16 @@ public class PackageManagerService extends IPackageManager.Stub { } /** - * Returns the package name of the calling Uid if it's an instant app. If it isn't - * instant, returns {@code null}. + * Returns the package name of the calling Uid if it's an ephemeral app. If it isn't + * ephemeral, returns {@code null}. */ - private String getInstantAppPackageName(int callingUid) { + private String getEphemeralPackageName(int callingUid) { final int appId = UserHandle.getAppId(callingUid); synchronized (mPackages) { final Object obj = mSettings.getUserIdLPr(appId); if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; - final boolean isInstantApp = ps.getInstantApp(UserHandle.getUserId(callingUid)); - return isInstantApp ? ps.pkg.packageName : null; + return ps.pkg.applicationInfo.isInstantApp() ? ps.pkg.packageName : null; } } return null; @@ -6023,7 +6018,7 @@ public class PackageManagerService extends IPackageManager.Stub { private @NonNull List queryIntentActivitiesInternal(Intent intent, String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return Collections.emptyList(); - final String instantAppPkgName = getInstantAppPackageName(Binder.getCallingUid()); + final String ephemeralPkgName = getEphemeralPackageName(Binder.getCallingUid()); flags = updateFlagsForResolve(flags, userId, intent); enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission */, false /* checkShell */, @@ -6045,14 +6040,14 @@ public class PackageManagerService extends IPackageManager.Stub { // an ephemeral application or 2) the calling package is ephemeral and the // activity is not visible to ephemeral applications. boolean matchEphemeral = - (flags & PackageManager.MATCH_INSTANT) != 0; + (flags & PackageManager.MATCH_EPHEMERAL) != 0; boolean ephemeralVisibleOnly = - (flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0; + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0; boolean blockResolution = - (!matchEphemeral && instantAppPkgName == null + (!matchEphemeral && ephemeralPkgName == null && (ai.applicationInfo.privateFlags - & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0) - || (ephemeralVisibleOnly && instantAppPkgName != null + & ApplicationInfo.PRIVATE_FLAG_EPHEMERAL) != 0) + || (ephemeralVisibleOnly && ephemeralPkgName != null && (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_EPHEMERAL) == 0); if (!blockResolution) { final ResolveInfo ri = new ResolveInfo(); @@ -6079,7 +6074,7 @@ public class PackageManagerService extends IPackageManager.Stub { List xpResult = new ArrayList(1); xpResult.add(xpResolveInfo); return filterForEphemeral( - filterIfNotSystemUser(xpResult, userId), instantAppPkgName); + filterIfNotSystemUser(xpResult, userId), ephemeralPkgName); } // Check for results in the current profile. @@ -6119,13 +6114,13 @@ public class PackageManagerService extends IPackageManager.Stub { // And we are not going to add emphemeral app, so we can return the // result straight away. result.add(xpDomainInfo.resolveInfo); - return filterForEphemeral(result, instantAppPkgName); + return filterForEphemeral(result, ephemeralPkgName); } } else if (result.size() <= 1 && !addEphemeral) { // No result in parent user and <= 1 result in current profile, and we // are not going to add emphemeral app, so we can return the result without // further processing. - return filterForEphemeral(result, instantAppPkgName); + return filterForEphemeral(result, ephemeralPkgName); } // We have more than one candidate (combining results from current and parent // profile), so we need filtering and sorting. @@ -6139,7 +6134,7 @@ public class PackageManagerService extends IPackageManager.Stub { result = filterForEphemeral(filterIfNotSystemUser( mActivities.queryIntentForPackage( intent, resolvedType, flags, pkg.activities, userId), - userId), instantAppPkgName); + userId), ephemeralPkgName); } else { // the caller wants to resolve for a particular package; however, there // were no installed results, so, try to find an ephemeral result @@ -6177,7 +6172,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (sortResult) { Collections.sort(result, mResolvePrioritySorter); } - return filterForEphemeral(result, instantAppPkgName); + return filterForEphemeral(result, ephemeralPkgName); } private static class CrossProfileDomainInfo { @@ -7141,9 +7136,9 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } synchronized (mPackages) { - final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps != null) { - return ps.getInstantApp(userId); + PackageParser.Package pkg = mPackages.get(packageName); + if (pkg != null) { + return pkg.applicationInfo.isInstantApp(); } } return false; @@ -7646,7 +7641,7 @@ public class PackageManagerService extends IPackageManager.Stub { * @throws PackageManagerException on a parse error. */ private PackageParser.Package scanPackageLI(PackageParser.Package pkg, File scanFile, - final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) + final int policyFlags, int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { // If the package has children and this is the first dive in the function // we scan the package with the SCAN_CHECK_ONLY flag set to see whether all @@ -7686,7 +7681,7 @@ public class PackageManagerService extends IPackageManager.Stub { * @throws PackageManagerException on a parse error. */ private PackageParser.Package scanPackageInternalLI(PackageParser.Package pkg, File scanFile, - int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) + int policyFlags, int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { PackageSetting ps = null; PackageSetting updatedPkg; @@ -7922,11 +7917,6 @@ public class PackageManagerService extends IPackageManager.Stub { 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; - } - // Note that we invoke the following method only if we are about to unpack an application PackageParser.Package scannedPkg = scanPackageLI(pkg, policyFlags, scanFlags | SCAN_UPDATE_SIGNATURE, currentTime, user); @@ -8864,7 +8854,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private PackageParser.Package scanPackageTracedLI(PackageParser.Package pkg, - final int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user) + final int policyFlags, int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage"); // If the package has children and this is the first dive in the function @@ -8903,8 +8893,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private PackageParser.Package scanPackageLI(PackageParser.Package pkg, final int policyFlags, - int scanFlags, long currentTime, @Nullable UserHandle user) - throws PackageManagerException { + int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { boolean success = false; try { final PackageParser.Package res = scanPackageDirtyLI(pkg, policyFlags, scanFlags, @@ -8970,7 +8959,7 @@ public class PackageManagerService extends IPackageManager.Stub { } private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, - final int policyFlags, final int scanFlags, long currentTime, @Nullable UserHandle user) + final int policyFlags, final int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { if (DEBUG_PACKAGE_SCANNING) { if ((policyFlags & PackageParser.PARSE_CHATTY) != 0) @@ -9108,16 +9097,16 @@ public class PackageManagerService extends IPackageManager.Stub { if (pkgSetting == null) { final String parentPackageName = (pkg.parentPackage != null) ? pkg.parentPackage.packageName : null; - final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; + // REMOVE SharedUserSetting from method; update in a separate call pkgSetting = Settings.createNewSetting(pkg.packageName, origPackage, disabledPkgSetting, realName, suid, destCodeFile, destResourceFile, pkg.applicationInfo.nativeLibraryRootDir, pkg.applicationInfo.primaryCpuAbi, pkg.applicationInfo.secondaryCpuAbi, pkg.mVersionCode, pkg.applicationInfo.flags, pkg.applicationInfo.privateFlags, user, - true /*allowInstall*/, instantApp, parentPackageName, - pkg.getChildPackageNames(), UserManagerService.getInstance(), - usesStaticLibraries, pkg.usesStaticLibrariesVersions); + true /*allowInstall*/, parentPackageName, pkg.getChildPackageNames(), + UserManagerService.getInstance(), usesStaticLibraries, + pkg.usesStaticLibrariesVersions); // SIDE EFFECTS; updates system state; move elsewhere if (origPackage != null) { mSettings.addRenamedPackageLPw(pkg.packageName, origPackage.name); @@ -9184,8 +9173,9 @@ public class PackageManagerService extends IPackageManager.Stub { } if (mFoundPolicyFile) { - SELinuxMMAC.assignSeInfoValue(pkg); + SELinuxMMAC.assignSeinfoValue(pkg); } + pkg.applicationInfo.uid = pkgSetting.appId; pkg.mExtras = pkgSetting; @@ -9420,11 +9410,11 @@ public class PackageManagerService extends IPackageManager.Stub { } } } else { - final int userId = user == null ? 0 : user.getIdentifier(); // Modify state for the given package setting commitPackageSettings(pkg, pkgSetting, user, scanFlags, (policyFlags & PackageParser.PARSE_CHATTY) != 0 /*chatty*/); - if (pkgSetting.getInstantApp(userId)) { + if (isEphemeral(pkg)) { + final int userId = user == null ? 0 : user.getIdentifier(); mInstantAppRegistry.addInstantAppLPw(userId, pkgSetting.appId); } } @@ -9539,10 +9529,10 @@ public class PackageManagerService extends IPackageManager.Stub { "Packages declaring static-shared libs must target O SDK or higher"); } - // Package declaring static a shared lib cannot be instant apps - if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) { + // Package declaring static a shared lib cannot be ephemeral + if (pkg.applicationInfo.isInstantApp()) { throw new PackageManagerException( - "Packages declaring static-shared libs cannot be instant apps"); + "Packages declaring static-shared libs cannot be ephemeral"); } // Package declaring static a shared lib cannot be renamed since the package @@ -9785,6 +9775,7 @@ public class PackageManagerService extends IPackageManager.Stub { mPlatformPackage = pkg; pkg.mVersionCode = mSdkVersion; mAndroidApplication = pkg.applicationInfo; + if (!mResolverReplaced) { mResolveActivity.applicationInfo = mAndroidApplication; mResolveActivity.name = ResolverActivity.class.getName(); @@ -10073,10 +10064,10 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.PermissionGroup cur = mPermissionGroups.get(pg.info.name); final String curPackageName = cur == null ? null : cur.info.packageName; // Dont allow ephemeral apps to define new permission groups. - if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) { + if (pkg.applicationInfo.isInstantApp()) { Slog.w(TAG, "Permission group " + pg.info.name + " from package " + pg.info.packageName - + " ignored: instant apps cannot define new permission groups."); + + " ignored: ephemeral apps cannot define new permission groups."); continue; } final boolean isPackageUpdate = pg.info.packageName.equals(curPackageName); @@ -10118,10 +10109,10 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.Permission p = pkg.permissions.get(i); // Dont allow ephemeral apps to define new permissions. - if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) { + if (pkg.applicationInfo.isInstantApp()) { Slog.w(TAG, "Permission " + p.info.name + " from package " + p.info.packageName - + " ignored: instant apps cannot define new permissions."); + + " ignored: ephemeral apps cannot define new permissions."); continue; } @@ -11743,10 +11734,13 @@ public class PackageManagerService extends IPackageManager.Stub { final class ActivityIntentResolver extends IntentResolver { public List queryIntent(Intent intent, String resolvedType, - boolean defaultOnly, int userId) { + boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) { if (!sUserManager.exists(userId)) return null; - mFlags = (defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0); - return super.queryIntent(intent, resolvedType, defaultOnly, userId); + mFlags = (defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0) + | (visibleToEphemeral ? PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY : 0) + | (isEphemeral ? PackageManager.MATCH_EPHEMERAL : 0); + return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral, + isEphemeral, userId); } public List queryIntent(Intent intent, String resolvedType, int flags, @@ -11755,7 +11749,8 @@ public class PackageManagerService extends IPackageManager.Stub { mFlags = flags; return super.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, - userId); + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0, + (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId); } public List queryIntentForPackage(Intent intent, String resolvedType, @@ -11766,6 +11761,9 @@ public class PackageManagerService extends IPackageManager.Stub { } mFlags = flags; final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0; + final boolean vislbleToEphemeral = + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0; + final boolean isEphemeral = (flags & PackageManager.MATCH_EPHEMERAL) != 0; final int N = packageActivities.size(); ArrayList listCut = new ArrayList(N); @@ -11780,7 +11778,8 @@ public class PackageManagerService extends IPackageManager.Stub { listCut.add(array); } } - return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId); + return super.queryIntentFromList(intent, resolvedType, defaultOnly, + vislbleToEphemeral, isEphemeral, listCut, userId); } /** @@ -12192,24 +12191,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps == null) { return null; } - final PackageUserState userState = ps.readUserState(userId); ActivityInfo ai = PackageParser.generateActivityInfo(activity, mFlags, - userState, userId); + ps.readUserState(userId), userId); if (ai == null) { return null; } - final boolean matchVisibleToInstantApp = - (mFlags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0; - final boolean isInstantApp = (mFlags & PackageManager.MATCH_INSTANT) != 0; - // throw out filters that aren't visible to ephemeral apps - if (matchVisibleToInstantApp - && !(info.isVisibleToInstantApp() || userState.instantApp)) { - return null; - } - // throw out ephemeral filters if we're not explicitly requesting them - if (!isInstantApp && userState.instantApp) { - return null; - } final ResolveInfo res = new ResolveInfo(); res.activityInfo = ai; if ((mFlags&PackageManager.GET_RESOLVED_FILTER) != 0) { @@ -12278,9 +12264,10 @@ public class PackageManagerService extends IPackageManager.Stub { private final class ServiceIntentResolver extends IntentResolver { public List queryIntent(Intent intent, String resolvedType, - boolean defaultOnly, int userId) { + boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) { mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0; - return super.queryIntent(intent, resolvedType, defaultOnly, userId); + return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral, + isEphemeral, userId); } public List queryIntent(Intent intent, String resolvedType, int flags, @@ -12289,7 +12276,8 @@ public class PackageManagerService extends IPackageManager.Stub { mFlags = flags; return super.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, - userId); + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0, + (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId); } public List queryIntentForPackage(Intent intent, String resolvedType, @@ -12300,6 +12288,9 @@ public class PackageManagerService extends IPackageManager.Stub { } mFlags = flags; final boolean defaultOnly = (flags&PackageManager.MATCH_DEFAULT_ONLY) != 0; + final boolean vislbleToEphemeral = + (flags&PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0; + final boolean isEphemeral = (flags&PackageManager.MATCH_EPHEMERAL) != 0; final int N = packageServices.size(); ArrayList listCut = new ArrayList(N); @@ -12314,7 +12305,8 @@ public class PackageManagerService extends IPackageManager.Stub { listCut.add(array); } } - return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId); + return super.queryIntentFromList(intent, resolvedType, defaultOnly, + vislbleToEphemeral, isEphemeral, listCut, userId); } public final void addService(PackageParser.Service s) { @@ -12489,9 +12481,10 @@ public class PackageManagerService extends IPackageManager.Stub { private final class ProviderIntentResolver extends IntentResolver { public List queryIntent(Intent intent, String resolvedType, - boolean defaultOnly, int userId) { + boolean defaultOnly, boolean visibleToEphemeral, boolean isEphemeral, int userId) { mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0; - return super.queryIntent(intent, resolvedType, defaultOnly, userId); + return super.queryIntent(intent, resolvedType, defaultOnly, visibleToEphemeral, + isEphemeral, userId); } public List queryIntent(Intent intent, String resolvedType, int flags, @@ -12501,7 +12494,8 @@ public class PackageManagerService extends IPackageManager.Stub { mFlags = flags; return super.queryIntent(intent, resolvedType, (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, - userId); + (flags & PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0, + (flags & PackageManager.MATCH_EPHEMERAL) != 0, userId); } public List queryIntentForPackage(Intent intent, String resolvedType, @@ -12513,6 +12507,9 @@ public class PackageManagerService extends IPackageManager.Stub { } mFlags = flags; final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0; + final boolean isEphemeral = (flags&PackageManager.MATCH_EPHEMERAL) != 0; + final boolean vislbleToEphemeral = + (flags&PackageManager.MATCH_VISIBLE_TO_EPHEMERAL_ONLY) != 0; final int N = packageProviders.size(); ArrayList listCut = new ArrayList(N); @@ -12527,7 +12524,8 @@ public class PackageManagerService extends IPackageManager.Stub { listCut.add(array); } } - return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut, userId); + return super.queryIntentFromList(intent, resolvedType, defaultOnly, + vislbleToEphemeral, isEphemeral, listCut, userId); } public final void addProvider(PackageParser.Provider p) { @@ -13068,7 +13066,7 @@ public class PackageManagerService extends IPackageManager.Stub { String installerPackageName, int installerUid, UserHandle user, Certificate[][] certificates) { if (DEBUG_EPHEMERAL) { - if ((sessionParams.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + if ((sessionParams.installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) { Slog.d(TAG, "Ephemeral install of " + packageName); } } @@ -13283,8 +13281,7 @@ public class PackageManagerService extends IPackageManager.Stub { * @hide */ @Override - public int installExistingPackageAsUser(String packageName, int userId, int installFlags, - int installReason) { + public int installExistingPackageAsUser(String packageName, int userId, int installReason) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null); PackageSetting pkgSetting; @@ -13299,10 +13296,6 @@ public class PackageManagerService extends IPackageManager.Stub { long callingId = Binder.clearCallingIdentity(); try { boolean installed = false; - final boolean instantApp = - (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0; - final boolean fullApp = - (installFlags & PackageManager.INSTALL_FULL_APP) != 0; // writer synchronized (mPackages) { @@ -13317,11 +13310,7 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.writePackageRestrictionsLPr(userId); mSettings.writeKernelMappingLPr(pkgSetting); installed = true; - } else if (fullApp && pkgSetting.getInstantApp(userId)) { - // upgrade app from instant to full; we don't allow app downgrade - installed = true; } - setInstantAppForUser(pkgSetting, userId, instantApp, fullApp); } if (installed) { @@ -13343,29 +13332,6 @@ public class PackageManagerService extends IPackageManager.Stub { return PackageManager.INSTALL_SUCCEEDED; } - void setInstantAppForUser(PackageSetting pkgSetting, int userId, - boolean instantApp, boolean fullApp) { - // no state specified; do nothing - if (!instantApp && !fullApp) { - return; - } - if (userId != UserHandle.USER_ALL) { - if (instantApp && !pkgSetting.getInstantApp(userId)) { - pkgSetting.setInstantApp(true /*instantApp*/, userId); - } else if (fullApp && pkgSetting.getInstantApp(userId)) { - pkgSetting.setInstantApp(false /*instantApp*/, userId); - } - } else { - for (int currentUserId : sUserManager.getUserIds()) { - if (instantApp && !pkgSetting.getInstantApp(currentUserId)) { - pkgSetting.setInstantApp(true /*instantApp*/, currentUserId); - } else if (fullApp && pkgSetting.getInstantApp(currentUserId)) { - pkgSetting.setInstantApp(false /*instantApp*/, currentUserId); - } - } - } - } - boolean isUserRestricted(int userId, String restrictionKey) { Bundle restrictions = sUserManager.getUserRestrictions(userId); if (restrictions.getBoolean(restrictionKey, false)) { @@ -13724,7 +13690,7 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } // Ephemeral apps don't get the full verification treatment - if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) { + if ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0) { if (DEBUG_EPHEMERAL) { Slog.d(TAG, "INSTALL_EPHEMERAL so skipping verification"); } @@ -14516,7 +14482,7 @@ public class PackageManagerService extends IPackageManager.Stub { final boolean onSd = (installFlags & PackageManager.INSTALL_EXTERNAL) != 0; final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0; - final boolean ephemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0; + final boolean ephemeral = (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0; PackageInfoLite pkgLite = null; if (onInt && onSd) { @@ -14600,7 +14566,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_EPHEMERAL) { Slog.v(TAG, "...setting INSTALL_EPHEMERAL install flag"); } - installFlags |= PackageManager.INSTALL_INSTANT_APP; + installFlags |= PackageManager.INSTALL_EPHEMERAL; installFlags &= ~(PackageManager.INSTALL_EXTERNAL |PackageManager.INSTALL_INTERNAL); } else { @@ -14934,7 +14900,7 @@ public class PackageManagerService extends IPackageManager.Stub { } protected boolean isEphemeral() { - return (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0; + return (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0; } UserHandle getUser() { @@ -15014,7 +14980,7 @@ public class PackageManagerService extends IPackageManager.Stub { } try { - final boolean isEphemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0; + final boolean isEphemeral = (installFlags & PackageManager.INSTALL_EPHEMERAL) != 0; final File tempDir = mInstallerService.allocateStageDirLegacy(volumeUuid, isEphemeral); codeFile = tempDir; @@ -15841,7 +15807,7 @@ public class PackageManagerService extends IPackageManager.Stub { private void replacePackageLIF(PackageParser.Package pkg, final int policyFlags, int scanFlags, UserHandle user, String installerPackageName, PackageInstalledInfo res, int installReason) { - final boolean isInstantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; + final boolean isEphemeral = (policyFlags & PackageParser.PARSE_IS_EPHEMERAL) != 0; final PackageParser.Package oldPackage; final String pkgName = pkg.packageName; @@ -15865,17 +15831,17 @@ public class PackageManagerService extends IPackageManager.Stub { return; } - final PackageSetting ps = mSettings.mPackages.get(pkgName); - // don't allow an upgrade from full to ephemeral - if (isInstantApp && !ps.getInstantApp(user.getIdentifier())) { - // can't downgrade from full to instant - Slog.w(TAG, "Can't replace app with instant app: " + pkgName); - res.setReturnCode(PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID); + final boolean oldIsEphemeral = oldPackage.applicationInfo.isInstantApp(); + if (isEphemeral && !oldIsEphemeral) { + // can't downgrade from full to ephemeral + Slog.w(TAG, "Can't replace app with ephemeral: " + pkgName); + res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID); return; } // verify signatures are valid + final PackageSetting ps = mSettings.mPackages.get(pkgName); if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) { if (!checkUpgradeKeySetLP(ps, pkg)) { res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE, @@ -16077,10 +16043,6 @@ public class PackageManagerService extends IPackageManager.Stub { childPs.oldCodePaths = ps.oldCodePaths; } } - // set instant app status, but, only if it's explicitly specified - final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; - final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0; - setInstantAppForUser(ps, user.getIdentifier(), instantApp, fullApp); prepareAppDataAfterInstallLIF(newPackage); addedPkg = true; } catch (PackageManagerException e) { @@ -16552,8 +16514,7 @@ public class PackageManagerService extends IPackageManager.Stub { final boolean forwardLocked = ((installFlags & PackageManager.INSTALL_FORWARD_LOCK) != 0); final boolean onExternal = (((installFlags & PackageManager.INSTALL_EXTERNAL) != 0) || (args.volumeUuid != null)); - final boolean instantApp = ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0); - final boolean fullApp = ((installFlags & PackageManager.INSTALL_FULL_APP) != 0); + final boolean ephemeral = ((installFlags & PackageManager.INSTALL_EPHEMERAL) != 0); final boolean forceSdk = ((installFlags & PackageManager.INSTALL_FORCE_SDK) != 0); boolean replace = false; int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE; @@ -16564,12 +16525,6 @@ public class PackageManagerService extends IPackageManager.Stub { if ((installFlags & PackageManager.INSTALL_DONT_KILL_APP) != 0) { scanFlags |= SCAN_DONT_KILL_APP; } - if (instantApp) { - scanFlags |= SCAN_AS_INSTANT_APP; - } - if (fullApp) { - scanFlags |= SCAN_AS_FULL_APP; - } // Result object to be returned res.setReturnCode(PackageManager.INSTALL_SUCCEEDED); @@ -16577,10 +16532,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile); // Sanity check - if (instantApp && (forwardLocked || onExternal)) { + if (ephemeral && (forwardLocked || onExternal)) { Slog.i(TAG, "Incompatible ephemeral install; fwdLocked=" + forwardLocked + " external=" + onExternal); - res.setReturnCode(PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID); + res.setReturnCode(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID); return; } @@ -16589,7 +16544,7 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageParser.PARSE_ENFORCE_CODE | (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0) | (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0) - | (instantApp ? PackageParser.PARSE_IS_EPHEMERAL : 0) + | (ephemeral ? PackageParser.PARSE_IS_EPHEMERAL : 0) | (forceSdk ? PackageParser.PARSE_FORCE_SDK : 0); PackageParser pp = new PackageParser(); pp.setSeparateProcesses(mSeparateProcesses); @@ -16608,7 +16563,7 @@ public class PackageManagerService extends IPackageManager.Stub { // // Ephemeral apps must have target SDK >= O. // // TODO: Update conditional and error message when O gets locked down -// if (instantApp && pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) { +// if (ephemeral && pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) { // res.setError(PackageManager.INSTALL_FAILED_EPHEMERAL_INVALID, // "Ephemeral apps must have target SDK version of at least O"); // return; @@ -16851,10 +16806,10 @@ public class PackageManagerService extends IPackageManager.Stub { res.setError(INSTALL_FAILED_INVALID_INSTALL_LOCATION, "Cannot install updates to system apps on sdcard"); return; - } else if (instantApp) { - // Abort update; system app can't be replaced with an instant app - res.setError(INSTALL_FAILED_INSTANT_APP_INVALID, - "Cannot update a system app with an instant app"); + } else if (ephemeral) { + // Abort update; system app can't be replaced with an ephemeral app + res.setError(INSTALL_FAILED_EPHEMERAL_INVALID, + "Cannot update a system app with an ephemeral app"); return; } } @@ -17101,6 +17056,14 @@ public class PackageManagerService extends IPackageManager.Stub { return (ps.pkgFlags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; } + private static boolean isEphemeral(PackageParser.Package pkg) { + return pkg.applicationInfo.isInstantApp(); + } + + private static boolean isEphemeral(PackageSetting ps) { + return ps.pkg != null && isEphemeral(ps.pkg); + } + private static boolean isSystemApp(PackageParser.Package pkg) { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; } @@ -17123,6 +17086,9 @@ public class PackageManagerService extends IPackageManager.Stub { private int packageFlagsToInstallFlags(PackageSetting ps) { int installFlags = 0; + if (isEphemeral(ps)) { + installFlags |= PackageManager.INSTALL_EPHEMERAL; + } if (isExternal(ps) && TextUtils.isEmpty(ps.volumeUuid)) { // This existing package was an external ASEC install when we have // the external flag without a UUID @@ -17524,7 +17490,7 @@ public class PackageManagerService extends IPackageManager.Stub { try (PackageFreezer freezer = freezePackageForDelete(packageName, freezeUser, deleteFlags, "deletePackageX")) { res = deletePackageLIF(packageName, UserHandle.of(removeUser), true, allUsers, - deleteFlags | FLAGS_REMOVE_CHATTY, info, true, null); + deleteFlags | REMOVE_CHATTY, info, true, null); } synchronized (mPackages) { if (res) { @@ -17674,7 +17640,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } - removePackageLI(ps, (flags & FLAGS_REMOVE_CHATTY) != 0); + removePackageLI(ps, (flags & REMOVE_CHATTY) != 0); if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { final PackageParser.Package resolvedPkg; @@ -18233,18 +18199,11 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.d(TAG, "Marking package:" + ps.name + " uninstalled for user:" + nextUserId); } ps.setUserState(nextUserId, 0, COMPONENT_ENABLED_STATE_DEFAULT, - false /*installed*/, - true /*stopped*/, - true /*notLaunched*/, - false /*hidden*/, - false /*suspended*/, - false /*instantApp*/, - null /*lastDisableAppCaller*/, - null /*enabledComponents*/, - null /*disabledComponents*/, + false /*installed*/, true /*stopped*/, true /*notLaunched*/, + false /*hidden*/, false /*suspended*/, null, null, null, false /*blockUninstall*/, - ps.readUserState(nextUserId).domainVerificationStatus, - 0, PackageManager.INSTALL_REASON_UNKNOWN); + ps.readUserState(nextUserId).domainVerificationStatus, 0, + PackageManager.INSTALL_REASON_UNKNOWN); } mSettings.writeKernelMappingLPr(ps); } @@ -21726,12 +21685,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final ApplicationInfo app = pkg.applicationInfo; final int appId = UserHandle.getAppId(app.uid); - Preconditions.checkNotNull(app.seInfo); + Preconditions.checkNotNull(app.seinfo); long ceDataInode = -1; try { ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags, - appId, app.seInfo, app.targetSdkVersion); + appId, app.seinfo, app.targetSdkVersion); } catch (InstallerException e) { if (app.isSystemApp()) { logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName @@ -21739,7 +21698,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); destroyAppDataLeafLIF(pkg, userId, flags); try { ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags, - appId, app.seInfo, app.targetSdkVersion); + appId, app.seinfo, app.targetSdkVersion); logCriticalInfo(Log.DEBUG, "Recovery succeeded!"); } catch (InstallerException e2) { logCriticalInfo(Log.DEBUG, "Recovery failed!"); @@ -22041,7 +22000,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); installerPackageName = ps.installerPackageName; packageAbiOverride = ps.cpuAbiOverrideString; appId = UserHandle.getAppId(pkg.applicationInfo.uid); - seinfo = pkg.applicationInfo.seInfo; + seinfo = pkg.applicationInfo.seinfo; label = String.valueOf(pm.getApplicationLabel(pkg.applicationInfo)); targetSdkVersion = pkg.applicationInfo.targetSdkVersion; freezer = freezePackage(packageName, "movePackageInternal"); @@ -22850,8 +22809,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean isPackageEphemeral(int userId, String packageName) { synchronized (mPackages) { - final PackageSetting ps = mSettings.mPackages.get(packageName); - return ps != null ? ps.getInstantApp(userId) : false; + PackageParser.Package p = mPackages.get(packageName); + return p != null ? p.applicationInfo.isInstantApp() : false; } } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index a7349fc8454c7..1203e4d58c004 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -39,7 +39,6 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageInstaller.SessionParams; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.VersionedPackage; import android.content.res.AssetManager; @@ -117,8 +116,6 @@ class PackageManagerShellCommand extends ShellCommand { return runInstallRemove(); case "install-write": return runInstallWrite(); - case "install-existing": - return runInstallExisting(); case "compile": return runCompile(); case "reconcile-secondary-dex-files": @@ -304,51 +301,6 @@ class PackageManagerShellCommand extends ShellCommand { return doRemoveSplit(sessionId, splitName, true /*logSuccess*/); } - private int runInstallExisting() throws RemoteException { - final PrintWriter pw = getOutPrintWriter(); - int userId = UserHandle.USER_SYSTEM; - int installFlags = 0; - String opt; - while ((opt = getNextOption()) != null) { - switch (opt) { - case "--user": - userId = UserHandle.parseUserArg(getNextArgRequired()); - break; - case "--ephemeral": - case "--instant": - installFlags |= PackageManager.INSTALL_INSTANT_APP; - installFlags &= ~PackageManager.INSTALL_FULL_APP; - break; - case "--full": - installFlags &= ~PackageManager.INSTALL_INSTANT_APP; - installFlags |= PackageManager.INSTALL_FULL_APP; - break; - default: - pw.println("Error: Unknown option: " + opt); - return 1; - } - } - - final String packageName = getNextArg(); - if (packageName == null) { - pw.println("Error: package name not specified"); - return 1; - } - - try { - final int res = mInterface.installExistingPackageAsUser(packageName, userId, - installFlags, PackageManager.INSTALL_REASON_UNKNOWN); - if (res == PackageManager.INSTALL_FAILED_INVALID_URI) { - throw new NameNotFoundException("Package " + packageName + " doesn't exist"); - } - pw.println("Package " + packageName + " installed for user: " + userId); - return 0; - } catch (RemoteException | NameNotFoundException e) { - pw.println(e.toString()); - return 1; - } - } - private int runCompile() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); boolean checkProfiles = SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false); @@ -1193,12 +1145,8 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.abiOverride = checkAbiArgument(getNextArg()); break; case "--ephemeral": - case "--instantapp": sessionParams.setInstallAsInstantApp(true /*isInstantApp*/); break; - case "--full": - sessionParams.setInstallAsInstantApp(false /*isInstantApp*/); - break; case "--user": params.userId = UserHandle.parseUserArg(getNextArgRequired()); break; diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index 601377d6f8d2c..0e11b0cec4c27 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -397,19 +397,11 @@ abstract class PackageSettingBase extends SettingBase { modifyUserState(userId).blockUninstall = blockUninstall; } - boolean getInstantApp(int userId) { - return readUserState(userId).instantApp; - } - - void setInstantApp(boolean instantApp, int userId) { - modifyUserState(userId).instantApp = instantApp; - } - void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped, - boolean notLaunched, boolean hidden, boolean suspended, boolean instantApp, + boolean notLaunched, boolean hidden, boolean suspended, String lastDisableAppCaller, ArraySet enabledComponents, - ArraySet disabledComponents, boolean blockUninstall, - int domainVerifState, int linkGeneration, int installReason) { + ArraySet disabledComponents, boolean blockUninstall, int domainVerifState, + int linkGeneration, int installReason) { PackageUserState state = modifyUserState(userId); state.ceDataInode = ceDataInode; state.enabled = enabled; @@ -425,7 +417,6 @@ abstract class PackageSettingBase extends SettingBase { state.domainVerificationStatus = domainVerifState; state.appLinkGeneration = linkGeneration; state.installReason = installReason; - state.instantApp = instantApp; } ArraySet getEnabledComponents(int userId) { diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java index 188e66f8cf275..7e7de21eb9820 100644 --- a/services/core/java/com/android/server/pm/SELinuxMMAC.java +++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java @@ -17,8 +17,6 @@ package com.android.server.pm; import android.content.pm.PackageParser; -import android.content.pm.PackageUserState; -import android.content.pm.SELinuxUtil; import android.content.pm.Signature; import android.os.Environment; import android.util.Slog; @@ -71,6 +69,9 @@ public final class SELinuxMMAC { // Append v2 to existing seinfo label private static final String SANDBOX_V2_STR = ":v2"; + // Append ephemeral to existing seinfo label + private static final String EPHEMERAL_APP_STR = ":ephemeralapp"; + // Append targetSdkVersion=n to existing seinfo label where n is the app's targetSdkVersion private static final String TARGETSDKVERSION_STR = ":targetSdkVersion="; @@ -278,28 +279,31 @@ public final class SELinuxMMAC { * * @param pkg object representing the package to be labeled. */ - public static void assignSeInfoValue(PackageParser.Package pkg) { + public static void assignSeinfoValue(PackageParser.Package pkg) { synchronized (sPolicies) { for (Policy policy : sPolicies) { - String seInfo = policy.getMatchedSeInfo(pkg); - if (seInfo != null) { - pkg.applicationInfo.seInfo = seInfo; + String seinfo = policy.getMatchedSeinfo(pkg); + if (seinfo != null) { + pkg.applicationInfo.seinfo = seinfo; break; } } } + if (pkg.applicationInfo.isInstantApp()) + pkg.applicationInfo.seinfo += EPHEMERAL_APP_STR; + if (pkg.applicationInfo.targetSandboxVersion == 2) - pkg.applicationInfo.seInfo += SANDBOX_V2_STR; + pkg.applicationInfo.seinfo += SANDBOX_V2_STR; if (pkg.applicationInfo.isPrivilegedApp()) - pkg.applicationInfo.seInfo += PRIVILEGED_APP_STR; + pkg.applicationInfo.seinfo += PRIVILEGED_APP_STR; - pkg.applicationInfo.seInfo += TARGETSDKVERSION_STR + pkg.applicationInfo.targetSdkVersion; + pkg.applicationInfo.seinfo += TARGETSDKVERSION_STR + pkg.applicationInfo.targetSdkVersion; if (DEBUG_POLICY_INSTALL) { Slog.i(TAG, "package (" + pkg.packageName + ") labeled with " + - "seinfo=" + pkg.applicationInfo.seInfo); + "seinfo=" + pkg.applicationInfo.seinfo); } } } @@ -434,7 +438,7 @@ final class Policy { * @return A string representing the seinfo matched during policy lookup. * A value of null can also be returned if no match occured. */ - public String getMatchedSeInfo(PackageParser.Package pkg) { + public String getMatchedSeinfo(PackageParser.Package pkg) { // Check for exact signature matches across all certs. Signature[] certs = mCerts.toArray(new Signature[0]); if (!Signature.areExactMatch(certs, pkg.mSignatures)) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a8a5ff056521c..61568022eff20 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -219,7 +219,6 @@ final class Settings { private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus"; private static final String ATTR_APP_LINK_GENERATION = "app-link-generation"; private static final String ATTR_INSTALL_REASON = "install-reason"; - private static final String ATTR_INSTANT_APP = "instant-app"; private static final String ATTR_PACKAGE_NAME = "packageName"; private static final String ATTR_FINGERPRINT = "fingerprint"; @@ -688,7 +687,7 @@ final class Settings { PackageSetting disabledPkg, String realPkgName, SharedUserSetting sharedUser, File codePath, File resourcePath, String legacyNativeLibraryPath, String primaryCpuAbi, String secondaryCpuAbi, int versionCode, int pkgFlags, int pkgPrivateFlags, - UserHandle installUser, boolean allowInstall, boolean instantApp, String parentPkgName, + UserHandle installUser, boolean allowInstall, String parentPkgName, List childPkgNames, UserManagerService userManager, String[] usesStaticLibraries, int[] usesStaticLibrariesVersions) { final PackageSetting pkgSetting; @@ -746,17 +745,14 @@ final class Settings { || installUserId == user.id; pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT, installed, - true /*stopped*/, - true /*notLaunched*/, - false /*hidden*/, - false /*suspended*/, - instantApp, - null /*lastDisableAppCaller*/, - null /*enabledComponents*/, - null /*disabledComponents*/, - false /*blockUninstall*/, - INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, - 0, PackageManager.INSTALL_REASON_UNKNOWN); + true, // stopped, + true, // notLaunched + false, // hidden + false, // suspended + null, null, null, + false, // blockUninstall + INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0, + PackageManager.INSTALL_REASON_UNKNOWN); } } } @@ -1647,18 +1643,15 @@ final class Settings { // consider all applications to be installed. for (PackageSetting pkg : mPackages.values()) { pkg.setUserState(userId, 0, COMPONENT_ENABLED_STATE_DEFAULT, - true /*installed*/, - false /*stopped*/, - false /*notLaunched*/, - false /*hidden*/, - false /*suspended*/, - false /*instantApp*/, - null /*lastDisableAppCaller*/, - null /*enabledComponents*/, - null /*disabledComponents*/, - false /*blockUninstall*/, - INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, - 0, PackageManager.INSTALL_REASON_UNKNOWN); + true, // installed + false, // stopped + false, // notLaunched + false, // hidden + false, // suspended + null, null, null, + false, // blockUninstall + INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0, + PackageManager.INSTALL_REASON_UNKNOWN); } return; } @@ -1725,8 +1718,6 @@ final class Settings { false); final boolean blockUninstall = XmlUtils.readBooleanAttribute(parser, ATTR_BLOCK_UNINSTALL, false); - final boolean instantApp = XmlUtils.readBooleanAttribute(parser, - ATTR_INSTANT_APP, false); final int enabled = XmlUtils.readIntAttribute(parser, ATTR_ENABLED, COMPONENT_ENABLED_STATE_DEFAULT); final String enabledCaller = parser.getAttributeValue(null, @@ -1763,9 +1754,8 @@ final class Settings { } ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched, - hidden, suspended, instantApp, enabledCaller, enabledComponents, - disabledComponents, blockUninstall, verifState, linkGeneration, - installReason); + hidden, suspended, enabledCaller, enabledComponents, disabledComponents, + blockUninstall, verifState, linkGeneration, installReason); } else if (tagName.equals("preferred-activities")) { readPreferredActivitiesLPw(parser, userId); } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) { @@ -2035,9 +2025,6 @@ final class Settings { if (ustate.blockUninstall) { serializer.attribute(null, ATTR_BLOCK_UNINSTALL, "true"); } - if (ustate.instantApp) { - serializer.attribute(null, ATTR_INSTANT_APP, "true"); - } if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) { serializer.attribute(null, ATTR_ENABLED, Integer.toString(ustate.enabled)); @@ -2695,7 +2682,7 @@ final class Settings { sb.append(isDebug ? " 1 " : " 0 "); sb.append(dataPath); sb.append(" "); - sb.append(ai.seInfo); + sb.append(ai.seinfo); sb.append(" "); if (gids != null && gids.length > 0) { sb.append(gids[0]); @@ -4153,7 +4140,7 @@ final class Settings { volumeUuids[i] = ps.volumeUuid; names[i] = ps.name; appIds[i] = ps.appId; - seinfos[i] = ps.pkg.applicationInfo.seInfo; + seinfos[i] = ps.pkg.applicationInfo.seinfo; targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion; } } @@ -4442,7 +4429,7 @@ final class Settings { ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE", ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE, "DIRECT_BOOT_AWARE", ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE", - ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL", + ApplicationInfo.PRIVATE_FLAG_EPHEMERAL, "EPHEMERAL", ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER", ApplicationInfo.PRIVATE_FLAG_RESIZEABLE_ACTIVITIES_EXPLICITLY_SET, "RESIZEABLE_ACTIVITIES_EXPLICITLY_SET", ApplicationInfo.PRIVATE_FLAG_RESIZEABLE_ACTIVITIES_VIA_SDK_VERSION, "RESIZEABLE_ACTIVITIES_VIA_SDK_VERSION", @@ -4515,7 +4502,6 @@ final class Settings { pw.print(ps.getSuspended(user.id) ? "SU" : "su"); pw.print(ps.getStopped(user.id) ? "S" : "s"); pw.print(ps.getNotLaunched(user.id) ? "l" : "L"); - pw.print(ps.getInstantApp(user.id) ? "IA" : "ia"); pw.print(","); pw.print(ps.getEnabled(user.id)); String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id); @@ -4769,8 +4755,6 @@ final class Settings { pw.print(ps.getNotLaunched(user.id)); pw.print(" enabled="); pw.println(ps.getEnabled(user.id)); - pw.print(" instant="); - pw.println(ps.getInstantApp(user.id)); String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id); if (lastDisabledAppCaller != null) { pw.print(prefix); pw.print(" lastDisabledCaller: "); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index ba8f7e92f4d16..2b2bb48c91a3f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -7863,7 +7863,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Install the profile owner if not present. if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) { mIPackageManager.installExistingPackageAsUser(adminPkg, userHandle, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY); + PackageManager.INSTALL_REASON_POLICY); } } catch (RemoteException e) { Slog.e(LOG_TAG, "Failed to make remote calls for createAndManageUser, " @@ -8182,7 +8182,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Install the app. mIPackageManager.installExistingPackageAsUser(packageName, userId, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY); + PackageManager.INSTALL_REASON_POLICY); } catch (RemoteException re) { // shouldn't happen @@ -8224,7 +8224,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (isSystemApp(mIPackageManager, packageName, parentUserId)) { numberOfAppsInstalled++; mIPackageManager.installExistingPackageAsUser(packageName, userId, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY); + PackageManager.INSTALL_REASON_POLICY); } else { Slog.d(LOG_TAG, "Not enabling " + packageName + " since is not a" + " system app"); diff --git a/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java b/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java index 90c58d0279a7b..3fa72dc92a88c 100644 --- a/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java +++ b/services/retaildemo/java/com/android/server/retaildemo/PreloadAppsInstaller.java @@ -104,7 +104,7 @@ class PreloadAppsInstaller { } try { mPackageManager.installExistingPackageAsUser(packageName, userId, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN); + PackageManager.INSTALL_REASON_UNKNOWN); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } finally { @@ -175,4 +175,4 @@ class PreloadAppsInstaller { } } } -} +} \ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 100338e7bfbf5..e2e18447a709e 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -1053,7 +1053,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED; } if (mEphemeralPackages.contains(PackageWithUser.of(userId, packageName))) { - ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT; + ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_EPHEMERAL; } if (mSystemPackages.contains(packageName)) { ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java index 325d99a90e67c..baf60c539105b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -388,7 +388,6 @@ public class PackageManagerSettingsTests { ApplicationInfo.PRIVATE_FLAG_PRIVILEGED /*pkgPrivateFlags*/, null /*installUser*/, false /*allowInstall*/, - false /*instantApp*/, null /*parentPkgName*/, null /*childPkgNames*/, UserManagerService.getInstance(), @@ -429,7 +428,6 @@ public class PackageManagerSettingsTests { 0 /*pkgPrivateFlags*/, UserHandle.SYSTEM /*installUser*/, true /*allowInstall*/, - false /*instantApp*/, null /*parentPkgName*/, null /*childPkgNames*/, UserManagerService.getInstance(), @@ -473,7 +471,6 @@ public class PackageManagerSettingsTests { 0 /*pkgPrivateFlags*/, null /*installUser*/, false /*allowInstall*/, - false /*instantApp*/, null /*parentPkgName*/, null /*childPkgNames*/, UserManagerService.getInstance(), @@ -517,7 +514,6 @@ public class PackageManagerSettingsTests { 0 /*pkgPrivateFlags*/, null /*installUser*/, false /*allowInstall*/, - false /*instantApp*/, null /*parentPkgName*/, null /*childPkgNames*/, UserManagerService.getInstance(), diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 5591029d9a0a9..e5640c7e08c18 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -380,7 +380,7 @@ public class PackageParserTest { assertTrue(Arrays.equals(a.splitSourceDirs, that.splitSourceDirs)); assertTrue(Arrays.equals(a.splitPublicSourceDirs, that.splitPublicSourceDirs)); assertTrue(Arrays.equals(a.resourceDirs, that.resourceDirs)); - assertEquals(a.seInfo, that.seInfo); + assertEquals(a.seinfo, that.seinfo); assertTrue(Arrays.equals(a.sharedLibraryFiles, that.sharedLibraryFiles)); assertEquals(a.dataDir, that.dataDir); assertEquals(a.deviceProtectedDataDir, that.deviceProtectedDataDir); diff --git a/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java b/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java index a8c39c43cb491..346dc4235e6ca 100644 --- a/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java +++ b/services/tests/servicestests/src/com/android/server/retaildemo/PreloadAppsInstallerTest.java @@ -104,7 +104,7 @@ public class PreloadAppsInstallerTest { null, null); // Verify that we try to install the package in system user. verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN); + PackageManager.INSTALL_REASON_UNKNOWN); } assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed", "1", @@ -141,7 +141,7 @@ public class PreloadAppsInstallerTest { null, null); // Verify that we try to install the package in system user. verify(mIpm).installExistingPackageAsUser(path, UserHandle.USER_SYSTEM, - 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN); + PackageManager.INSTALL_REASON_UNKNOWN); } assertEquals("DEMO_USER_SETUP should be set to 1 after preloaded apps are installed", "1",