Merge "Revert "Per user setting for instant app""

This commit is contained in:
Guang Zhu
2017-02-15 21:47:28 +00:00
committed by Android (Google) Code Review
34 changed files with 374 additions and 548 deletions

View File

@@ -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");

View File

@@ -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

View File

@@ -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.
* <p>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;
}
/**

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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 = {

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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<String> INSTANT_APP_SETTINGS = new ArraySet<>();
public static final Set<String> 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<String> INSTANT_APP_SETTINGS = new ArraySet<>();
public static final Set<String> 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<String> INSTANT_APP_SETTINGS = new ArraySet<>();
public static final Set<String> 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);
}
/**