summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Lin <danny@kdrag0n.dev>2021-04-05 22:00:16 -0700
committeralk3pInjection <webmaster@raspii.tech>2021-09-27 21:17:05 +0800
commit4c4f6c2fe739d6f0217e579e90aa0dc70466ea82 (patch)
tree3bbb4d360e1f13a3af281441bebd7d44dfb6fcb8
parent3ba7510b2c64c45925b13adb6bae65b80d33216e (diff)
[ProtonAOSP][rvc] PackageInfo: Optimize ApplicationInfo creation
When opening and closing activities in Settings, a significant amount of CPU time is spent in ART interface method call trampolines, as reported by simpleperf: 0.32% /apex/com.android.art/lib64/libart.so art_quick_imt_conflict_trampoline PackageInfoWithoutStateUtils is responsible for a substantial portion of the time: 0.34% 0.24% /apex/com.android.art/lib64/libart.so art_quick_imt_conflict_trampoline | -- art_quick_imt_conflict_trampoline | |--5.48%-- android.content.pm.parsing.PackageInfoWithoutStateUtils.appInfoFlags | com.android.server.pm.parsing.pkg.PackageImpl.toAppInfoWithoutState | android.content.pm.parsing.PackageInfoWithoutStateUtils.generateApplicationInfoUnchecked | com.android.server.pm.parsing.PackageInfoUtils.generateApplicationInfo | | | |--33.53%-- com.android.server.pm.parsing.PackageInfoUtils.generateActivityInfo | | | | | |--76.24%-- com.android.server.pm.ComponentResolver$ActivityIntentResolver.newResult To avoid the overhead of calling methods through interfaces, opportunistically cast ParsingPackageRead objects to the real implementation and access fields directly on it. This isn't pretty, but it reduces the CPU time wasted on interface method calls. Test: simpleperf record -a; verify that PackageInfoWithoutStateUtils.appInfoFlags no longer appears under art_quick_imt_conflict_trampoline Change-Id: I475ba804c61739c7537e664b09973665f001270b
-rw-r--r--core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java144
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageImpl.java82
2 files changed, 141 insertions, 85 deletions
diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
index e4507483c08f..7632878c3203 100644
--- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
@@ -676,58 +676,114 @@ public class PackageInfoWithoutStateUtils {
/** @see ApplicationInfo#flags */
public static int appInfoFlags(ParsingPackageRead pkg) {
// @formatter:off
- return flag(pkg.isExternalStorage(), ApplicationInfo.FLAG_EXTERNAL_STORAGE)
- | flag(pkg.isBaseHardwareAccelerated(), ApplicationInfo.FLAG_HARDWARE_ACCELERATED)
- | flag(pkg.isAllowBackup(), ApplicationInfo.FLAG_ALLOW_BACKUP)
- | flag(pkg.isKillAfterRestore(), ApplicationInfo.FLAG_KILL_AFTER_RESTORE)
- | flag(pkg.isRestoreAnyVersion(), ApplicationInfo.FLAG_RESTORE_ANY_VERSION)
- | flag(pkg.isFullBackupOnly(), ApplicationInfo.FLAG_FULL_BACKUP_ONLY)
- | flag(pkg.isPersistent(), ApplicationInfo.FLAG_PERSISTENT)
- | flag(pkg.isDebuggable(), ApplicationInfo.FLAG_DEBUGGABLE)
- | flag(pkg.isVmSafeMode(), ApplicationInfo.FLAG_VM_SAFE_MODE)
- | flag(pkg.isHasCode(), ApplicationInfo.FLAG_HAS_CODE)
- | flag(pkg.isAllowTaskReparenting(), ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING)
- | flag(pkg.isAllowClearUserData(), ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)
- | flag(pkg.isLargeHeap(), ApplicationInfo.FLAG_LARGE_HEAP)
- | flag(pkg.isUsesCleartextTraffic(), ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC)
- | flag(pkg.isSupportsRtl(), ApplicationInfo.FLAG_SUPPORTS_RTL)
- | flag(pkg.isTestOnly(), ApplicationInfo.FLAG_TEST_ONLY)
- | flag(pkg.isMultiArch(), ApplicationInfo.FLAG_MULTIARCH)
- | flag(pkg.isExtractNativeLibs(), ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS)
- | flag(pkg.isGame(), ApplicationInfo.FLAG_IS_GAME)
- | flag(pkg.isSupportsSmallScreens(), ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS)
- | flag(pkg.isSupportsNormalScreens(), ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS)
- | flag(pkg.isSupportsLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS)
- | flag(pkg.isSupportsExtraLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS)
- | flag(pkg.isResizeable(), ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS)
- | flag(pkg.isAnyDensity(), ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES);
+ if (pkg instanceof ParsingPackageImpl) {
+ ParsingPackageImpl pkgi = (ParsingPackageImpl) pkg;
+ return flag(pkgi.externalStorage, ApplicationInfo.FLAG_EXTERNAL_STORAGE)
+ | flag(pkgi.baseHardwareAccelerated, ApplicationInfo.FLAG_HARDWARE_ACCELERATED)
+ | flag(pkgi.allowBackup, ApplicationInfo.FLAG_ALLOW_BACKUP)
+ | flag(pkgi.killAfterRestore, ApplicationInfo.FLAG_KILL_AFTER_RESTORE)
+ | flag(pkgi.restoreAnyVersion, ApplicationInfo.FLAG_RESTORE_ANY_VERSION)
+ | flag(pkgi.fullBackupOnly, ApplicationInfo.FLAG_FULL_BACKUP_ONLY)
+ | flag(pkgi.persistent, ApplicationInfo.FLAG_PERSISTENT)
+ | flag(pkgi.debuggable, ApplicationInfo.FLAG_DEBUGGABLE)
+ | flag(pkgi.vmSafeMode, ApplicationInfo.FLAG_VM_SAFE_MODE)
+ | flag(pkgi.hasCode, ApplicationInfo.FLAG_HAS_CODE)
+ | flag(pkgi.allowTaskReparenting, ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING)
+ | flag(pkgi.allowClearUserData, ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)
+ | flag(pkgi.largeHeap, ApplicationInfo.FLAG_LARGE_HEAP)
+ | flag(pkgi.usesCleartextTraffic, ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC)
+ | flag(pkgi.supportsRtl, ApplicationInfo.FLAG_SUPPORTS_RTL)
+ | flag(pkgi.testOnly, ApplicationInfo.FLAG_TEST_ONLY)
+ | flag(pkgi.multiArch, ApplicationInfo.FLAG_MULTIARCH)
+ | flag(pkgi.extractNativeLibs, ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS)
+ | flag(pkgi.game, ApplicationInfo.FLAG_IS_GAME)
+ | flag(pkgi.isSupportsSmallScreens(), ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS)
+ | flag(pkgi.isSupportsNormalScreens(), ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS)
+ | flag(pkgi.isSupportsLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS)
+ | flag(pkgi.isSupportsExtraLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS)
+ | flag(pkgi.isResizeable(), ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS)
+ | flag(pkgi.isAnyDensity(), ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES);
+ } else {
+ return flag(pkg.isExternalStorage(), ApplicationInfo.FLAG_EXTERNAL_STORAGE)
+ | flag(pkg.isBaseHardwareAccelerated(), ApplicationInfo.FLAG_HARDWARE_ACCELERATED)
+ | flag(pkg.isAllowBackup(), ApplicationInfo.FLAG_ALLOW_BACKUP)
+ | flag(pkg.isKillAfterRestore(), ApplicationInfo.FLAG_KILL_AFTER_RESTORE)
+ | flag(pkg.isRestoreAnyVersion(), ApplicationInfo.FLAG_RESTORE_ANY_VERSION)
+ | flag(pkg.isFullBackupOnly(), ApplicationInfo.FLAG_FULL_BACKUP_ONLY)
+ | flag(pkg.isPersistent(), ApplicationInfo.FLAG_PERSISTENT)
+ | flag(pkg.isDebuggable(), ApplicationInfo.FLAG_DEBUGGABLE)
+ | flag(pkg.isVmSafeMode(), ApplicationInfo.FLAG_VM_SAFE_MODE)
+ | flag(pkg.isHasCode(), ApplicationInfo.FLAG_HAS_CODE)
+ | flag(pkg.isAllowTaskReparenting(), ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING)
+ | flag(pkg.isAllowClearUserData(), ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)
+ | flag(pkg.isLargeHeap(), ApplicationInfo.FLAG_LARGE_HEAP)
+ | flag(pkg.isUsesCleartextTraffic(), ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC)
+ | flag(pkg.isSupportsRtl(), ApplicationInfo.FLAG_SUPPORTS_RTL)
+ | flag(pkg.isTestOnly(), ApplicationInfo.FLAG_TEST_ONLY)
+ | flag(pkg.isMultiArch(), ApplicationInfo.FLAG_MULTIARCH)
+ | flag(pkg.isExtractNativeLibs(), ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS)
+ | flag(pkg.isGame(), ApplicationInfo.FLAG_IS_GAME)
+ | flag(pkg.isSupportsSmallScreens(), ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS)
+ | flag(pkg.isSupportsNormalScreens(), ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS)
+ | flag(pkg.isSupportsLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS)
+ | flag(pkg.isSupportsExtraLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS)
+ | flag(pkg.isResizeable(), ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS)
+ | flag(pkg.isAnyDensity(), ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES);
+ }
// @formatter:on
}
/** @see ApplicationInfo#privateFlags */
public static int appInfoPrivateFlags(ParsingPackageRead pkg) {
// @formatter:off
- int privateFlags = flag(pkg.isStaticSharedLibrary(), ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY)
- | flag(pkg.isOverlay(), ApplicationInfo.PRIVATE_FLAG_IS_RESOURCE_OVERLAY)
- | flag(pkg.isIsolatedSplitLoading(), ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING)
- | flag(pkg.isHasDomainUrls(), ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS)
- | flag(pkg.isProfileableByShell(), ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL)
- | flag(pkg.isBackupInForeground(), ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND)
- | flag(pkg.isUseEmbeddedDex(), ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX)
- | flag(pkg.isDefaultToDeviceProtectedStorage(), ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE)
- | flag(pkg.isDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE)
- | flag(pkg.isPartiallyDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE)
- | flag(pkg.isAllowClearUserDataOnFailedRestore(), ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE)
- | flag(pkg.isAllowAudioPlaybackCapture(), ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE)
- | flag(pkg.isRequestLegacyExternalStorage(), ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE)
- | flag(pkg.isUsesNonSdkApi(), ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API)
- | flag(pkg.isHasFragileUserData(), ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA)
- | flag(pkg.isCantSaveState(), ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE)
- | flag(pkg.isResizeableActivityViaSdkVersion(), ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION)
- | flag(pkg.isAllowNativeHeapPointerTagging(), ApplicationInfo.PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING);
+ int privateFlags;
+ Boolean resizeableActivity;
+ if (pkg instanceof ParsingPackageImpl) {
+ ParsingPackageImpl pkgi = (ParsingPackageImpl) pkg;
+ privateFlags = flag(pkgi.staticSharedLibrary, ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY)
+ | flag(pkgi.overlay, ApplicationInfo.PRIVATE_FLAG_IS_RESOURCE_OVERLAY)
+ | flag(pkgi.isolatedSplitLoading, ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING)
+ | flag(pkgi.hasDomainUrls, ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS)
+ | flag(pkgi.profileableByShell, ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL)
+ | flag(pkgi.backupInForeground, ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND)
+ | flag(pkgi.useEmbeddedDex, ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX)
+ | flag(pkgi.defaultToDeviceProtectedStorage, ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE)
+ | flag(pkgi.directBootAware, ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE)
+ | flag(pkgi.partiallyDirectBootAware, ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE)
+ | flag(pkgi.allowClearUserDataOnFailedRestore, ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE)
+ | flag(pkgi.allowAudioPlaybackCapture, ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE)
+ | flag(pkgi.requestLegacyExternalStorage, ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE)
+ | flag(pkgi.usesNonSdkApi, ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API)
+ | flag(pkgi.hasFragileUserData, ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA)
+ | flag(pkgi.cantSaveState, ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE)
+ | flag(pkgi.resizeableActivityViaSdkVersion, ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION)
+ | flag(pkgi.allowNativeHeapPointerTagging, ApplicationInfo.PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING);
+
+ resizeableActivity = pkgi.resizeableActivity;
+ } else {
+ privateFlags = flag(pkg.isStaticSharedLibrary(), ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY)
+ | flag(pkg.isOverlay(), ApplicationInfo.PRIVATE_FLAG_IS_RESOURCE_OVERLAY)
+ | flag(pkg.isIsolatedSplitLoading(), ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING)
+ | flag(pkg.isHasDomainUrls(), ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS)
+ | flag(pkg.isProfileableByShell(), ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL)
+ | flag(pkg.isBackupInForeground(), ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND)
+ | flag(pkg.isUseEmbeddedDex(), ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX)
+ | flag(pkg.isDefaultToDeviceProtectedStorage(), ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE)
+ | flag(pkg.isDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE)
+ | flag(pkg.isPartiallyDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE)
+ | flag(pkg.isAllowClearUserDataOnFailedRestore(), ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE)
+ | flag(pkg.isAllowAudioPlaybackCapture(), ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE)
+ | flag(pkg.isRequestLegacyExternalStorage(), ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE)
+ | flag(pkg.isUsesNonSdkApi(), ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API)
+ | flag(pkg.isHasFragileUserData(), ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA)
+ | flag(pkg.isCantSaveState(), ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE)
+ | flag(pkg.isResizeableActivityViaSdkVersion(), ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION)
+ | flag(pkg.isAllowNativeHeapPointerTagging(), ApplicationInfo.PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING);
+
+ resizeableActivity = pkg.getResizeableActivity();
+ }
// @formatter:on
- Boolean resizeableActivity = pkg.getResizeableActivity();
if (resizeableActivity != null) {
if (resizeableActivity) {
privateFlags |= ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index 2da93ca34019..4009289e8838 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -369,53 +369,53 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
@DataClass.ParcelWith(ForInternedString.class)
private String zygotePreloadName;
- private boolean externalStorage;
- private boolean baseHardwareAccelerated;
- private boolean allowBackup;
- private boolean killAfterRestore;
- private boolean restoreAnyVersion;
- private boolean fullBackupOnly;
- private boolean persistent;
- private boolean debuggable;
- private boolean vmSafeMode;
- private boolean hasCode;
- private boolean allowTaskReparenting;
- private boolean allowClearUserData;
- private boolean largeHeap;
- private boolean usesCleartextTraffic;
- private boolean supportsRtl;
- private boolean testOnly;
- private boolean multiArch;
- private boolean extractNativeLibs;
- private boolean game;
+ boolean externalStorage;
+ boolean baseHardwareAccelerated;
+ boolean allowBackup;
+ boolean killAfterRestore;
+ boolean restoreAnyVersion;
+ boolean fullBackupOnly;
+ boolean persistent;
+ boolean debuggable;
+ boolean vmSafeMode;
+ boolean hasCode;
+ boolean allowTaskReparenting;
+ boolean allowClearUserData;
+ boolean largeHeap;
+ boolean usesCleartextTraffic;
+ boolean supportsRtl;
+ boolean testOnly;
+ boolean multiArch;
+ boolean extractNativeLibs;
+ boolean game;
/**
* @see ParsingPackageRead#getResizeableActivity()
*/
@Nullable
@DataClass.ParcelWith(ForBoolean.class)
- private Boolean resizeableActivity;
-
- private boolean staticSharedLibrary;
- private boolean overlay;
- private boolean isolatedSplitLoading;
- private boolean hasDomainUrls;
- private boolean profileableByShell;
- private boolean backupInForeground;
- private boolean useEmbeddedDex;
- private boolean defaultToDeviceProtectedStorage;
- private boolean directBootAware;
- private boolean partiallyDirectBootAware;
- private boolean resizeableActivityViaSdkVersion;
- private boolean allowClearUserDataOnFailedRestore;
- private boolean allowAudioPlaybackCapture;
- private boolean requestLegacyExternalStorage;
- private boolean usesNonSdkApi;
- private boolean hasFragileUserData;
- private boolean cantSaveState;
- private boolean allowNativeHeapPointerTagging;
- private int autoRevokePermissions;
- private boolean preserveLegacyExternalStorage;
+ Boolean resizeableActivity;
+
+ boolean staticSharedLibrary;
+ boolean overlay;
+ boolean isolatedSplitLoading;
+ boolean hasDomainUrls;
+ boolean profileableByShell;
+ boolean backupInForeground;
+ boolean useEmbeddedDex;
+ boolean defaultToDeviceProtectedStorage;
+ boolean directBootAware;
+ boolean partiallyDirectBootAware;
+ boolean resizeableActivityViaSdkVersion;
+ boolean allowClearUserDataOnFailedRestore;
+ boolean allowAudioPlaybackCapture;
+ boolean requestLegacyExternalStorage;
+ boolean usesNonSdkApi;
+ boolean hasFragileUserData;
+ boolean cantSaveState;
+ boolean allowNativeHeapPointerTagging;
+ int autoRevokePermissions;
+ boolean preserveLegacyExternalStorage;
protected int gwpAsanMode;