blob: 28a90f3d6ab6584c950f50ffd342678b3e9d3a57 [file] [log] [blame]
/*
* Copyright (C) 2011 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 com.android.server.pm;
import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.SigningInfo;
import android.content.pm.UserInfo;
import android.content.pm.UserPackage;
import android.content.pm.overlay.OverlayPaths;
import android.os.UserHandle;
import android.os.incremental.IncrementalManager;
import android.service.pm.PackageProto;
import android.service.pm.PackageProto.UserInfoProto.ArchiveState.ArchiveActivityInfo;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.pm.parsing.pkg.AndroidPackageInternal;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DataClass;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
import com.android.server.pm.permission.LegacyPermissionDataProvider;
import com.android.server.pm.permission.LegacyPermissionState;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.ArchiveState;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.PackageStateUnserialized;
import com.android.server.pm.pkg.PackageUserState;
import com.android.server.pm.pkg.PackageUserStateImpl;
import com.android.server.pm.pkg.PackageUserStateInternal;
import com.android.server.pm.pkg.SharedLibrary;
import com.android.server.pm.pkg.SharedLibraryWrapper;
import com.android.server.pm.pkg.SuspendParams;
import com.android.server.utils.SnapshotCache;
import com.android.server.utils.WatchedArraySet;
import libcore.util.EmptyArray;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
/**
* Settings data for a particular package we know about.
*
* @hide
*/
@DataClass(genGetters = true, genConstructor = false, genSetters = false, genBuilder = false)
@DataClass.Suppress({"getSnapshot", "getBooleans"})
public class PackageSetting extends SettingBase implements PackageStateInternal {
// Use a bitset to store boolean data to save memory
private static class Booleans {
@IntDef({
INSTALL_PERMISSION_FIXED,
UPDATE_AVAILABLE,
FORCE_QUERYABLE_OVERRIDE,
SCANNED_AS_STOPPED_SYSTEM_APP
})
public @interface Flags {
}
private static final int INSTALL_PERMISSION_FIXED = 1;
private static final int UPDATE_AVAILABLE = 1 << 1;
private static final int FORCE_QUERYABLE_OVERRIDE = 1 << 2;
private static final int SCANNED_AS_STOPPED_SYSTEM_APP = 1 << 3;
}
private int mBooleans;
private void setBoolean(@Booleans.Flags int flag, boolean value) {
if (value) {
mBooleans |= flag;
} else {
mBooleans &= ~flag;
}
}
private boolean getBoolean(@Booleans.Flags int flag) {
return (mBooleans & flag) != 0;
}
/**
* The shared user ID lets us link this object to {@link SharedUserSetting}.
*/
private int mSharedUserAppId;
@Nullable
private Map<String, Set<String>> mimeGroups;
// TODO(b/314036181): encapsulate all these fields for usesSdk, instead of having three
// separate arrays.
@Nullable
private String[] usesSdkLibraries;
@Nullable
private long[] usesSdkLibrariesVersionsMajor;
@Nullable
private boolean[] usesSdkLibrariesOptional;
@Nullable
private String[] usesStaticLibraries;
@Nullable
private long[] usesStaticLibrariesVersions;
/**
* The path under which native libraries have been unpacked. This path is
* always derived at runtime, and is only stored here for cleanup when a
* package is uninstalled.
*/
@Nullable
@Deprecated
private String legacyNativeLibraryPath;
@NonNull
private String mName;
@Nullable
private String mRealName;
private int mAppId;
/**
* It is expected that all code that uses a {@link PackageSetting} understands this inner field
* may be null. Note that this relationship only works one way. It should not be possible to
* have an entry inside {@link PackageManagerService#mPackages} without a corresponding
* {@link PackageSetting} inside {@link Settings#mPackages}.
*
* @see PackageState#getAndroidPackage()
*/
@Nullable
private AndroidPackageInternal pkg;
/** @see AndroidPackage#getPath() */
@NonNull
private File mPath;
@NonNull
private String mPathString;
private float mLoadingProgress;
private long mLoadingCompletedTime;
@Nullable
private String mPrimaryCpuAbi;
@Nullable
private String mSecondaryCpuAbi;
@Nullable
private String mCpuAbiOverride;
private long mLastModifiedTime;
private long lastUpdateTime;
private long versionCode;
@NonNull
private PackageSignatures signatures;
@NonNull
private PackageKeySetData keySetData = new PackageKeySetData();
// TODO: Access is not locked.
@NonNull
private final SparseArray<PackageUserStateImpl> mUserStates = new SparseArray<>();
@NonNull
private InstallSource installSource;
/** @see PackageState#getVolumeUuid() */
@Nullable
private String volumeUuid;
/** @see PackageState#getCategoryOverride() */
private int categoryOverride = ApplicationInfo.CATEGORY_UNDEFINED;
@NonNull
private final PackageStateUnserialized pkgState = new PackageStateUnserialized(this);
@NonNull
private UUID mDomainSetId;
@Nullable
private String mAppMetadataFilePath;
private int mTargetSdkVersion;
@Nullable
private byte[] mRestrictUpdateHash;
/**
* Snapshot support.
*/
@NonNull
private final SnapshotCache<PackageSetting> mSnapshot;
private SnapshotCache<PackageSetting> makeCache() {
return new SnapshotCache<PackageSetting>(this, this) {
@Override
public PackageSetting createSnapshot() {
return new PackageSetting(mSource, true);
}};
}
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public PackageSetting(@NonNull String name, @Nullable String realName, @NonNull File path,
int pkgFlags, int pkgPrivateFlags, @NonNull UUID domainSetId) {
super(pkgFlags, pkgPrivateFlags);
this.mName = name;
this.mRealName = realName;
this.mPath = path;
this.mPathString = path.toString();
this.signatures = new PackageSignatures();
this.installSource = InstallSource.EMPTY;
this.mDomainSetId = domainSetId;
mSnapshot = makeCache();
}
/**
* New instance of PackageSetting replicating the original settings.
* Note that it keeps the same PackageParser.Package instance.
*/
PackageSetting(PackageSetting orig) {
this(orig, false);
}
/**
* New instance of PackageSetting with one-level-deep cloning.
* <p>
* IMPORTANT: With a shallow copy, we do NOT create new contained objects.
* This means, for example, changes to the user state of the original PackageSetting
* will also change the user state in its copy.
*/
PackageSetting(PackageSetting base, String realPkgName) {
this(base, false);
this.mRealName = realPkgName;
}
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public PackageSetting(@NonNull PackageSetting original, boolean sealedSnapshot) {
super(original);
copyPackageSetting(original, sealedSnapshot);
if (sealedSnapshot) {
mSnapshot = new SnapshotCache.Sealed();
} else {
mSnapshot = makeCache();
}
}
/**
* Return the package snapshot.
*/
public PackageSetting snapshot() {
return mSnapshot.snapshot();
}
public void dumpDebug(ProtoOutputStream proto, long fieldId, List<UserInfo> users,
LegacyPermissionDataProvider dataProvider) {
final long packageToken = proto.start(fieldId);
proto.write(PackageProto.NAME, (mRealName != null ? mRealName : mName));
proto.write(PackageProto.UID, mAppId);
proto.write(PackageProto.VERSION_CODE, versionCode);
proto.write(PackageProto.UPDATE_TIME_MS, lastUpdateTime);
proto.write(PackageProto.INSTALLER_NAME, installSource.mInstallerPackageName);
if (pkg != null) {
proto.write(PackageProto.VERSION_STRING, pkg.getVersionName());
long splitToken = proto.start(PackageProto.SPLITS);
proto.write(PackageProto.SplitProto.NAME, "base");
proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.getBaseRevisionCode());
proto.end(splitToken);
for (int i = 0; i < pkg.getSplitNames().length; i++) {
splitToken = proto.start(PackageProto.SPLITS);
proto.write(PackageProto.SplitProto.NAME, pkg.getSplitNames()[i]);
proto.write(PackageProto.SplitProto.REVISION_CODE,
pkg.getSplitRevisionCodes()[i]);
proto.end(splitToken);
}
long sourceToken = proto.start(PackageProto.INSTALL_SOURCE);
proto.write(PackageProto.InstallSourceProto.INITIATING_PACKAGE_NAME,
installSource.mInitiatingPackageName);
proto.write(PackageProto.InstallSourceProto.ORIGINATING_PACKAGE_NAME,
installSource.mOriginatingPackageName);
proto.write(PackageProto.InstallSourceProto.UPDATE_OWNER_PACKAGE_NAME,
installSource.mUpdateOwnerPackageName);
proto.end(sourceToken);
}
proto.write(PackageProto.StatesProto.IS_LOADING, isLoading());
writeUsersInfoToProto(proto, PackageProto.USERS);
writePackageUserPermissionsProto(proto, PackageProto.USER_PERMISSIONS, users, dataProvider);
proto.end(packageToken);
}
public PackageSetting setAppId(int appId) {
this.mAppId = appId;
onChanged();
return this;
}
public PackageSetting setCpuAbiOverride(String cpuAbiOverrideString) {
this.mCpuAbiOverride = cpuAbiOverrideString;
onChanged();
return this;
}
/**
* In case of replacing an old package, restore the first install timestamps if it was installed
* for the same users
*/
public PackageSetting setFirstInstallTimeFromReplaced(PackageStateInternal replacedPkgSetting,
int[] userIds) {
for (int userId = 0; userId < userIds.length; userId++) {
final long previousFirstInstallTime =
replacedPkgSetting.getUserStateOrDefault(userId).getFirstInstallTimeMillis();
if (previousFirstInstallTime != 0) {
modifyUserState(userId).setFirstInstallTimeMillis(previousFirstInstallTime);
}
}
onChanged();
return this;
}
/**
* Set the time for the first time when an app is installed for a user. If userId specifies all
* users, set the same timestamp for all the users.
*/
public PackageSetting setFirstInstallTime(long firstInstallTime, int userId) {
if (userId == UserHandle.USER_ALL) {
int userStateCount = mUserStates.size();
for (int i = 0; i < userStateCount; i++) {
mUserStates.valueAt(i).setFirstInstallTimeMillis(firstInstallTime);
}
} else {
modifyUserState(userId).setFirstInstallTimeMillis(firstInstallTime);
}
onChanged();
return this;
}
public PackageSetting setForceQueryableOverride(boolean forceQueryableOverride) {
setBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE, forceQueryableOverride);
onChanged();
return this;
}
public PackageSetting setInstallerPackage(@Nullable String installerPackageName,
int installerPackageUid) {
installSource = installSource.setInstallerPackage(installerPackageName,
installerPackageUid);
onChanged();
return this;
}
public PackageSetting setUpdateOwnerPackage(@Nullable String updateOwnerPackageName) {
installSource = installSource.setUpdateOwnerPackageName(updateOwnerPackageName);
onChanged();
return this;
}
public PackageSetting setInstallSource(InstallSource installSource) {
this.installSource = Objects.requireNonNull(installSource);
onChanged();
return this;
}
PackageSetting removeInstallerPackage(@Nullable String packageName) {
installSource = installSource.removeInstallerPackage(packageName);
onChanged();
return this;
}
public PackageSetting setIsOrphaned(boolean isOrphaned) {
installSource = installSource.setIsOrphaned(isOrphaned);
onChanged();
return this;
}
public PackageSetting setKeySetData(PackageKeySetData keySetData) {
this.keySetData = keySetData;
onChanged();
return this;
}
public PackageSetting setLastModifiedTime(long timeStamp) {
this.mLastModifiedTime = timeStamp;
onChanged();
return this;
}
public PackageSetting setLastUpdateTime(long lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
onChanged();
return this;
}
public PackageSetting setLongVersionCode(long versionCode) {
this.versionCode = versionCode;
onChanged();
return this;
}
public boolean setMimeGroup(String mimeGroup, ArraySet<String> newMimeTypes) {
Set<String> oldMimeTypes = mimeGroups == null ? null : mimeGroups.get(mimeGroup);
if (oldMimeTypes == null) {
throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
+ " for package " + mName);
}
boolean hasChanges = !newMimeTypes.equals(oldMimeTypes);
mimeGroups.put(mimeGroup, newMimeTypes);
if (hasChanges) {
onChanged();
}
return hasChanges;
}
// TODO: Remove, only commit package when it's actually finalized
public PackageSetting setPkg(AndroidPackage pkg) {
this.pkg = (AndroidPackageInternal) pkg;
onChanged();
return this;
}
/**
* Notify {@link #onChanged()} if the parameter {@code usesLibraryFiles} is different from
* {@link #getUsesLibraryFiles()}.
*
* @param usesLibraryFiles the new uses library files
* @return {@code this}
*/
public PackageSetting setPkgStateLibraryFiles(@NonNull Collection<String> usesLibraryFiles) {
final Collection<String> oldUsesLibraryFiles = getUsesLibraryFiles();
if (oldUsesLibraryFiles.size() != usesLibraryFiles.size()
|| !oldUsesLibraryFiles.containsAll(usesLibraryFiles)) {
pkgState.setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles));
onChanged();
}
return this;
}
public PackageSetting setPrimaryCpuAbi(String primaryCpuAbiString) {
this.mPrimaryCpuAbi = primaryCpuAbiString;
onChanged();
return this;
}
public PackageSetting setSecondaryCpuAbi(String secondaryCpuAbiString) {
this.mSecondaryCpuAbi = secondaryCpuAbiString;
onChanged();
return this;
}
public PackageSetting setSignatures(PackageSignatures signatures) {
this.signatures = signatures;
onChanged();
return this;
}
public PackageSetting setVolumeUuid(String volumeUuid) {
this.volumeUuid = volumeUuid;
onChanged();
return this;
}
@Override
public boolean isExternalStorage() {
return (getFlags() & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
}
public PackageSetting setUpdateAvailable(boolean updateAvailable) {
setBoolean(Booleans.UPDATE_AVAILABLE, updateAvailable);
onChanged();
return this;
}
public PackageSetting setSharedUserAppId(int sharedUserAppId) {
mSharedUserAppId = sharedUserAppId;
onChanged();
return this;
}
public PackageSetting setTargetSdkVersion(int targetSdkVersion) {
mTargetSdkVersion = targetSdkVersion;
onChanged();
return this;
}
public PackageSetting setRestrictUpdateHash(byte[] restrictUpdateHash) {
mRestrictUpdateHash = restrictUpdateHash;
onChanged();
return this;
}
@Override
public int getSharedUserAppId() {
return mSharedUserAppId;
}
@Override
public boolean hasSharedUser() {
return mSharedUserAppId > 0;
}
@Override
public String toString() {
return "PackageSetting{"
+ Integer.toHexString(System.identityHashCode(this))
+ " " + mName + "/" + mAppId + "}";
}
private void copyMimeGroups(@Nullable Map<String, Set<String>> newMimeGroups) {
if (newMimeGroups == null) {
mimeGroups = null;
return;
}
mimeGroups = new ArrayMap<>(newMimeGroups.size());
for (String mimeGroup : newMimeGroups.keySet()) {
Set<String> mimeTypes = newMimeGroups.get(mimeGroup);
if (mimeTypes != null) {
mimeGroups.put(mimeGroup, new ArraySet<>(mimeTypes));
} else {
mimeGroups.put(mimeGroup, new ArraySet<>());
}
}
}
/** Updates all fields in the current setting from another. */
public void updateFrom(PackageSetting other) {
copyPackageSetting(other, false /* sealedSnapshot */);
Set<String> mimeGroupNames = other.mimeGroups != null ? other.mimeGroups.keySet() : null;
updateMimeGroups(mimeGroupNames);
onChanged();
}
/**
* Updates declared MIME groups, removing no longer declared groups
* and keeping previous state of MIME groups
*/
PackageSetting updateMimeGroups(@Nullable Set<String> newMimeGroupNames) {
if (newMimeGroupNames == null) {
mimeGroups = null;
return this;
}
if (mimeGroups == null) {
// set mimeGroups to empty map to avoid repeated null-checks in the next loop
mimeGroups = Collections.emptyMap();
}
ArrayMap<String, Set<String>> updatedMimeGroups =
new ArrayMap<>(newMimeGroupNames.size());
for (String mimeGroup : newMimeGroupNames) {
if (mimeGroups.containsKey(mimeGroup)) {
updatedMimeGroups.put(mimeGroup, mimeGroups.get(mimeGroup));
} else {
updatedMimeGroups.put(mimeGroup, new ArraySet<>());
}
}
onChanged();
mimeGroups = updatedMimeGroups;
return this;
}
@Deprecated
@Override
public LegacyPermissionState getLegacyPermissionState() {
return super.getLegacyPermissionState();
}
public PackageSetting setInstallPermissionsFixed(boolean installPermissionsFixed) {
setBoolean(Booleans.INSTALL_PERMISSION_FIXED, installPermissionsFixed);
return this;
}
public boolean isPrivileged() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}
public boolean isOem() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
}
public boolean isVendor() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
}
public boolean isProduct() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
}
@Override
public boolean isRequiredForSystemUser() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0;
}
public boolean isSystemExt() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT) != 0;
}
public boolean isOdm() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_ODM) != 0;
}
public boolean isSystem() {
return (getFlags() & ApplicationInfo.FLAG_SYSTEM) != 0;
}
public boolean isRequestLegacyExternalStorage() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE)
!= 0;
}
public boolean isUserDataFragile() {
return (getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA)
!= 0;
}
public SigningDetails getSigningDetails() {
return signatures.mSigningDetails;
}
public PackageSetting setSigningDetails(SigningDetails signingDetails) {
// TODO: Immutability
signatures.mSigningDetails = signingDetails;
onChanged();
return this;
}
public void copyPackageSetting(PackageSetting other, boolean sealedSnapshot) {
super.copySettingBase(other);
mBooleans = other.mBooleans;
mSharedUserAppId = other.mSharedUserAppId;
mLoadingProgress = other.mLoadingProgress;
mLoadingCompletedTime = other.mLoadingCompletedTime;
legacyNativeLibraryPath = other.legacyNativeLibraryPath;
mName = other.mName;
mRealName = other.mRealName;
mAppId = other.mAppId;
pkg = other.pkg;
mPath = other.mPath;
mPathString = other.mPathString;
mPrimaryCpuAbi = other.mPrimaryCpuAbi;
mSecondaryCpuAbi = other.mSecondaryCpuAbi;
mCpuAbiOverride = other.mCpuAbiOverride;
mLastModifiedTime = other.mLastModifiedTime;
lastUpdateTime = other.lastUpdateTime;
versionCode = other.versionCode;
signatures = other.signatures;
keySetData = new PackageKeySetData(other.keySetData);
installSource = other.installSource;
volumeUuid = other.volumeUuid;
categoryOverride = other.categoryOverride;
mDomainSetId = other.mDomainSetId;
mAppMetadataFilePath = other.mAppMetadataFilePath;
mTargetSdkVersion = other.mTargetSdkVersion;
mRestrictUpdateHash = other.mRestrictUpdateHash == null
? null : other.mRestrictUpdateHash.clone();
usesSdkLibraries = other.usesSdkLibraries != null
? Arrays.copyOf(other.usesSdkLibraries,
other.usesSdkLibraries.length) : null;
usesSdkLibrariesVersionsMajor = other.usesSdkLibrariesVersionsMajor != null
? Arrays.copyOf(other.usesSdkLibrariesVersionsMajor,
other.usesSdkLibrariesVersionsMajor.length) : null;
usesSdkLibrariesOptional = other.usesSdkLibrariesOptional != null
? Arrays.copyOf(other.usesSdkLibrariesOptional,
other.usesSdkLibrariesOptional.length) : null;
usesStaticLibraries = other.usesStaticLibraries != null
? Arrays.copyOf(other.usesStaticLibraries,
other.usesStaticLibraries.length) : null;
usesStaticLibrariesVersions = other.usesStaticLibrariesVersions != null
? Arrays.copyOf(other.usesStaticLibrariesVersions,
other.usesStaticLibrariesVersions.length) : null;
mUserStates.clear();
for (int i = 0; i < other.mUserStates.size(); i++) {
if (sealedSnapshot) {
mUserStates.put(other.mUserStates.keyAt(i),
other.mUserStates.valueAt(i).snapshot());
} else {
var userState = other.mUserStates.valueAt(i);
userState.setWatchable(this);
mUserStates.put(other.mUserStates.keyAt(i), userState);
}
}
copyMimeGroups(other.mimeGroups);
pkgState.updateFrom(other.pkgState);
onChanged();
}
@VisibleForTesting
PackageUserStateImpl modifyUserState(int userId) {
PackageUserStateImpl state = mUserStates.get(userId);
if (state == null) {
state = new PackageUserStateImpl(this);
mUserStates.put(userId, state);
onChanged();
}
return state;
}
public PackageUserStateImpl getOrCreateUserState(@UserIdInt int userId) {
PackageUserStateImpl state = mUserStates.get(userId);
if (state == null) {
state = new PackageUserStateImpl(this);
mUserStates.put(userId, state);
}
return state;
}
@NonNull
public PackageUserStateInternal readUserState(int userId) {
PackageUserStateInternal state = mUserStates.get(userId);
if (state == null) {
return PackageUserStateInternal.DEFAULT;
}
return state;
}
void setEnabled(int state, int userId, String callingPackage) {
modifyUserState(userId)
.setEnabledState(state)
.setLastDisableAppCaller(callingPackage);
onChanged();
}
int getEnabled(int userId) {
return readUserState(userId).getEnabledState();
}
void setInstalled(boolean inst, int userId) {
modifyUserState(userId).setInstalled(inst);
onChanged();
}
void setArchiveState(ArchiveState archiveState, int userId) {
modifyUserState(userId).setArchiveState(archiveState);
onChanged();
}
boolean getInstalled(int userId) {
return readUserState(userId).isInstalled();
}
boolean isArchived(int userId) {
return PackageArchiver.isArchived(readUserState(userId));
}
int getInstallReason(int userId) {
return readUserState(userId).getInstallReason();
}
void setInstallReason(int installReason, int userId) {
modifyUserState(userId).setInstallReason(installReason);
onChanged();
}
int getUninstallReason(int userId) {
return readUserState(userId).getUninstallReason();
}
void setUninstallReason(@PackageManager.UninstallReason int uninstallReason, int userId) {
modifyUserState(userId).setUninstallReason(uninstallReason);
onChanged();
}
@NonNull
OverlayPaths getOverlayPaths(int userId) {
return readUserState(userId).getOverlayPaths();
}
boolean setOverlayPathsForLibrary(String libName, OverlayPaths overlayPaths, int userId) {
boolean changed = modifyUserState(userId)
.setSharedLibraryOverlayPaths(libName, overlayPaths);
onChanged();
return changed;
}
boolean isInstalledOrHasDataOnAnyOtherUser(int[] allUsers, int currentUser) {
for (int user: allUsers) {
if (user == currentUser) {
continue;
}
final PackageUserStateInternal userState = readUserState(user);
if (userState.isInstalled()) {
return true;
}
if (userState.dataExists()) {
return true;
}
}
return false;
}
int[] queryInstalledUsers(int[] users, boolean installed) {
int num = 0;
for (int user : users) {
if (getInstalled(user) == installed) {
num++;
}
}
int[] res = new int[num];
num = 0;
for (int user : users) {
if (getInstalled(user) == installed) {
res[num] = user;
num++;
}
}
return res;
}
int[] queryUsersInstalledOrHasData(int[] users) {
int num = 0;
for (int user : users) {
if (getInstalled(user) || readUserState(user).dataExists()) {
num++;
}
}
int[] res = new int[num];
num = 0;
for (int user : users) {
if (getInstalled(user) || readUserState(user).dataExists()) {
res[num] = user;
num++;
}
}
return res;
}
long getCeDataInode(int userId) {
return readUserState(userId).getCeDataInode();
}
long getDeDataInode(int userId) {
return readUserState(userId).getDeDataInode();
}
void setCeDataInode(long ceDataInode, int userId) {
modifyUserState(userId).setCeDataInode(ceDataInode);
onChanged();
}
void setDeDataInode(long deDataInode, int userId) {
modifyUserState(userId).setDeDataInode(deDataInode);
onChanged();
}
boolean getStopped(int userId) {
return readUserState(userId).isStopped();
}
void setStopped(boolean stop, int userId) {
modifyUserState(userId).setStopped(stop);
onChanged();
}
public PackageSetting setScannedAsStoppedSystemApp(boolean stop) {
setBoolean(Booleans.SCANNED_AS_STOPPED_SYSTEM_APP, stop);
onChanged();
return this;
}
boolean getNotLaunched(int userId) {
return readUserState(userId).isNotLaunched();
}
void setNotLaunched(boolean stop, int userId) {
modifyUserState(userId).setNotLaunched(stop);
onChanged();
}
boolean getHidden(int userId) {
return readUserState(userId).isHidden();
}
void setHidden(boolean hidden, int userId) {
modifyUserState(userId).setHidden(hidden);
onChanged();
}
int getDistractionFlags(int userId) {
return readUserState(userId).getDistractionFlags();
}
void setDistractionFlags(int distractionFlags, int userId) {
modifyUserState(userId).setDistractionFlags(distractionFlags);
onChanged();
}
public boolean getInstantApp(int userId) {
return readUserState(userId).isInstantApp();
}
void setInstantApp(boolean instantApp, int userId) {
modifyUserState(userId).setInstantApp(instantApp);
onChanged();
}
boolean getVirtualPreload(int userId) {
return readUserState(userId).isVirtualPreload();
}
void setVirtualPreload(boolean virtualPreload, int userId) {
modifyUserState(userId).setVirtualPreload(virtualPreload);
onChanged();
}
void setUserState(int userId, long ceDataInode, long deDataInode, int enabled,
boolean installed, boolean stopped, boolean notLaunched, boolean hidden,
int distractionFlags, ArrayMap<UserPackage, SuspendParams> suspendParams,
boolean instantApp, boolean virtualPreload, String lastDisableAppCaller,
ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
int installReason, int uninstallReason,
String harmfulAppWarning, String splashScreenTheme,
long firstInstallTime, int aspectRatio, ArchiveState archiveState) {
modifyUserState(userId)
.setSuspendParams(suspendParams)
.setCeDataInode(ceDataInode)
.setDeDataInode(deDataInode)
.setEnabledState(enabled)
.setInstalled(installed)
.setStopped(stopped)
.setNotLaunched(notLaunched)
.setHidden(hidden)
.setDistractionFlags(distractionFlags)
.setLastDisableAppCaller(lastDisableAppCaller)
.setEnabledComponents(enabledComponents)
.setDisabledComponents(disabledComponents)
.setInstallReason(installReason)
.setUninstallReason(uninstallReason)
.setInstantApp(instantApp)
.setVirtualPreload(virtualPreload)
.setHarmfulAppWarning(harmfulAppWarning)
.setSplashScreenTheme(splashScreenTheme)
.setFirstInstallTimeMillis(firstInstallTime)
.setMinAspectRatio(aspectRatio)
.setArchiveState(archiveState);
onChanged();
}
void setUserState(int userId, PackageUserStateInternal otherState) {
setUserState(userId, otherState.getCeDataInode(), otherState.getDeDataInode(),
otherState.getEnabledState(), otherState.isInstalled(), otherState.isStopped(),
otherState.isNotLaunched(), otherState.isHidden(), otherState.getDistractionFlags(),
otherState.getSuspendParams() == null
? null : otherState.getSuspendParams().untrackedStorage(),
otherState.isInstantApp(), otherState.isVirtualPreload(),
otherState.getLastDisableAppCaller(),
otherState.getEnabledComponentsNoCopy() == null
? null : otherState.getEnabledComponentsNoCopy().untrackedStorage(),
otherState.getDisabledComponentsNoCopy() == null
? null : otherState.getDisabledComponentsNoCopy().untrackedStorage(),
otherState.getInstallReason(), otherState.getUninstallReason(),
otherState.getHarmfulAppWarning(), otherState.getSplashScreenTheme(),
otherState.getFirstInstallTimeMillis(), otherState.getMinAspectRatio(),
otherState.getArchiveState());
}
WatchedArraySet<String> getEnabledComponents(int userId) {
return readUserState(userId).getEnabledComponentsNoCopy();
}
WatchedArraySet<String> getDisabledComponents(int userId) {
return readUserState(userId).getDisabledComponentsNoCopy();
}
/** Test only */
void setEnabledComponents(WatchedArraySet<String> components, int userId) {
modifyUserState(userId).setEnabledComponents(components);
onChanged();
}
/** Test only */
void setDisabledComponents(WatchedArraySet<String> components, int userId) {
modifyUserState(userId).setDisabledComponents(components);
onChanged();
}
void setEnabledComponentsCopy(WatchedArraySet<String> components, int userId) {
modifyUserState(userId).setEnabledComponents(components != null
? components.untrackedStorage() : null);
onChanged();
}
void setDisabledComponentsCopy(WatchedArraySet<String> components, int userId) {
modifyUserState(userId).setDisabledComponents(components != null
? components.untrackedStorage() : null);
onChanged();
}
PackageUserStateImpl modifyUserStateComponents(int userId, boolean disabled,
boolean enabled) {
PackageUserStateImpl state = modifyUserState(userId);
boolean changed = false;
if (disabled && state.getDisabledComponentsNoCopy() == null) {
state.setDisabledComponents(new ArraySet<String>(1));
changed = true;
}
if (enabled && state.getEnabledComponentsNoCopy() == null) {
state.setEnabledComponents(new ArraySet<String>(1));
changed = true;
}
if (changed) {
onChanged();
}
return state;
}
void addDisabledComponent(String componentClassName, int userId) {
modifyUserStateComponents(userId, true, false)
.getDisabledComponentsNoCopy().add(componentClassName);
onChanged();
}
void addEnabledComponent(String componentClassName, int userId) {
modifyUserStateComponents(userId, false, true)
.getEnabledComponentsNoCopy().add(componentClassName);
onChanged();
}
boolean enableComponentLPw(String componentClassName, int userId) {
PackageUserStateImpl state = modifyUserStateComponents(userId, false, true);
boolean changed = state.getDisabledComponentsNoCopy() != null
? state.getDisabledComponentsNoCopy().remove(componentClassName) : false;
changed |= state.getEnabledComponentsNoCopy().add(componentClassName);
if (changed) {
onChanged();
}
return changed;
}
boolean disableComponentLPw(String componentClassName, int userId) {
PackageUserStateImpl state = modifyUserStateComponents(userId, true, false);
boolean changed = state.getEnabledComponentsNoCopy() != null
? state.getEnabledComponentsNoCopy().remove(componentClassName) : false;
changed |= state.getDisabledComponentsNoCopy().add(componentClassName);
if (changed) {
onChanged();
}
return changed;
}
boolean restoreComponentLPw(String componentClassName, int userId) {
PackageUserStateImpl state = modifyUserStateComponents(userId, true, true);
boolean changed = state.getDisabledComponentsNoCopy() != null
? state.getDisabledComponentsNoCopy().remove(componentClassName) : false;
changed |= state.getEnabledComponentsNoCopy() != null
? state.getEnabledComponentsNoCopy().remove(componentClassName) : false;
if (changed) {
onChanged();
}
return changed;
}
int getCurrentEnabledStateLPr(String componentName, int userId) {
PackageUserStateInternal state = readUserState(userId);
if (state.getEnabledComponentsNoCopy() != null
&& state.getEnabledComponentsNoCopy().contains(componentName)) {
return COMPONENT_ENABLED_STATE_ENABLED;
} else if (state.getDisabledComponentsNoCopy() != null
&& state.getDisabledComponentsNoCopy().contains(componentName)) {
return COMPONENT_ENABLED_STATE_DISABLED;
} else {
return COMPONENT_ENABLED_STATE_DEFAULT;
}
}
void removeUser(int userId) {
mUserStates.delete(userId);
onChanged();
}
public int[] getNotInstalledUserIds() {
int count = 0;
int userStateCount = mUserStates.size();
for (int i = 0; i < userStateCount; i++) {
if (!mUserStates.valueAt(i).isInstalled()) {
count++;
}
}
if (count == 0) {
return EmptyArray.INT;
}
int[] excludedUserIds = new int[count];
int idx = 0;
for (int i = 0; i < userStateCount; i++) {
if (!mUserStates.valueAt(i).isInstalled()) {
excludedUserIds[idx++] = mUserStates.keyAt(i);
}
}
return excludedUserIds;
}
/**
* TODO (b/170263003) refactor to dump to permissiongr proto Dumps the permissions that are
* granted to users for this package.
*/
void writePackageUserPermissionsProto(ProtoOutputStream proto, long fieldId,
List<UserInfo> users, LegacyPermissionDataProvider dataProvider) {
Collection<LegacyPermissionState.PermissionState> runtimePermissionStates;
for (UserInfo user : users) {
final long permissionsToken = proto.start(PackageProto.USER_PERMISSIONS);
proto.write(PackageProto.UserPermissionsProto.ID, user.id);
runtimePermissionStates = dataProvider.getLegacyPermissionState(mAppId)
.getPermissionStates(user.id);
for (LegacyPermissionState.PermissionState permission : runtimePermissionStates) {
if (permission.isGranted()) {
proto.write(PackageProto.UserPermissionsProto.GRANTED_PERMISSIONS,
permission.getName());
}
}
proto.end(permissionsToken);
}
}
protected void writeUsersInfoToProto(ProtoOutputStream proto, long fieldId) {
int count = mUserStates.size();
for (int i = 0; i < count; i++) {
final long userToken = proto.start(fieldId);
final int userId = mUserStates.keyAt(i);
final PackageUserStateInternal state = mUserStates.valueAt(i);
proto.write(PackageProto.UserInfoProto.ID, userId);
final int installType;
if (state.isInstantApp()) {
installType = PackageProto.UserInfoProto.INSTANT_APP_INSTALL;
} else if (state.isInstalled()) {
installType = PackageProto.UserInfoProto.FULL_APP_INSTALL;
} else {
installType = PackageProto.UserInfoProto.NOT_INSTALLED_FOR_USER;
}
proto.write(PackageProto.UserInfoProto.INSTALL_TYPE, installType);
proto.write(PackageProto.UserInfoProto.IS_HIDDEN, state.isHidden());
proto.write(PackageProto.UserInfoProto.DISTRACTION_FLAGS, state.getDistractionFlags());
proto.write(PackageProto.UserInfoProto.IS_SUSPENDED, state.isSuspended());
if (state.isSuspended()) {
for (int j = 0; j < state.getSuspendParams().size(); j++) {
proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE,
state.getSuspendParams().keyAt(j).packageName);
}
}
proto.write(PackageProto.UserInfoProto.IS_STOPPED, state.isStopped());
proto.write(PackageProto.UserInfoProto.IS_LAUNCHED, !state.isNotLaunched());
proto.write(PackageProto.UserInfoProto.ENABLED_STATE, state.getEnabledState());
proto.write(
PackageProto.UserInfoProto.LAST_DISABLED_APP_CALLER,
state.getLastDisableAppCaller());
proto.write(PackageProto.UserInfoProto.FIRST_INSTALL_TIME_MS,
state.getFirstInstallTimeMillis());
writeArchiveState(proto, state.getArchiveState());
proto.end(userToken);
}
}
private static void writeArchiveState(ProtoOutputStream proto, ArchiveState archiveState) {
if (archiveState == null) {
return;
}
long archiveStateToken = proto.start(PackageProto.UserInfoProto.ARCHIVE_STATE);
for (ArchiveState.ArchiveActivityInfo activityInfo : archiveState.getActivityInfos()) {
long activityInfoToken = proto.start(
PackageProto.UserInfoProto.ArchiveState.ACTIVITY_INFOS);
proto.write(ArchiveActivityInfo.TITLE, activityInfo.getTitle());
proto.write(
ArchiveActivityInfo.ORIGINAL_COMPONENT_NAME,
activityInfo.getOriginalComponentName().flattenToString());
if (activityInfo.getIconBitmap() != null) {
proto.write(ArchiveActivityInfo.ICON_BITMAP_PATH,
activityInfo.getIconBitmap().toAbsolutePath().toString());
}
if (activityInfo.getMonochromeIconBitmap() != null) {
proto.write(ArchiveActivityInfo.MONOCHROME_ICON_BITMAP_PATH,
activityInfo.getMonochromeIconBitmap().toAbsolutePath().toString());
}
proto.end(activityInfoToken);
}
proto.write(PackageProto.UserInfoProto.ArchiveState.INSTALLER_TITLE,
archiveState.getInstallerTitle());
proto.end(archiveStateToken);
}
/**
* @see #mPath
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public PackageSetting setPath(@NonNull File path) {
this.mPath = path;
this.mPathString = path.toString();
onChanged();
return this;
}
/**
* @param userId the specific user to change the label/icon for
* @see PackageUserStateImpl#overrideLabelAndIcon(ComponentName, String, Integer)
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public boolean overrideNonLocalizedLabelAndIcon(@NonNull ComponentName component,
@Nullable String label, @Nullable Integer icon, @UserIdInt int userId) {
boolean changed = modifyUserState(userId).overrideLabelAndIcon(component, label, icon);
onChanged();
return changed;
}
/**
* @param userId the specific user to reset
* @see PackageUserStateImpl#resetOverrideComponentLabelIcon()
*/
public void resetOverrideComponentLabelIcon(@UserIdInt int userId) {
modifyUserState(userId).resetOverrideComponentLabelIcon();
onChanged();
}
/**
* @param userId the specified user to get the theme setting from
* @return the theme name previously persisted for the user or null if no splashscreen theme is
* persisted.
* @see android.window.SplashScreen#setSplashScreenTheme(int)
*/
@Nullable
public String getSplashScreenTheme(@UserIdInt int userId) {
return readUserState(userId).getSplashScreenTheme();
}
public boolean isIncremental() {
return IncrementalManager.isIncrementalPath(mPathString);
}
/**
* @return True if package is still being loaded, false if the package is fully loaded.
*/
public boolean isLoading() {
return Math.abs(1.0f - mLoadingProgress) >= 0.00000001f;
}
public PackageSetting setLoadingProgress(float progress) {
// To prevent race conditions, we don't allow progress to ever go down
if (mLoadingProgress < progress) {
mLoadingProgress = progress;
onChanged();
}
return this;
}
public PackageSetting setLoadingCompletedTime(long loadingCompletedTime) {
mLoadingCompletedTime = loadingCompletedTime;
onChanged();
return this;
}
/**
* @param path to app metadata file
*/
public PackageSetting setAppMetadataFilePath(String path) {
mAppMetadataFilePath = path;
onChanged();
return this;
}
@NonNull
@Override
public long getVersionCode() {
return versionCode;
}
/**
* @see PackageState#getMimeGroups()
*/
@Nullable
@Override
public Map<String, Set<String>> getMimeGroups() {
return CollectionUtils.isEmpty(mimeGroups) ? Collections.emptyMap()
: Collections.unmodifiableMap(mimeGroups);
}
@NonNull
@Override
public String getPackageName() {
return mName;
}
@Nullable
@Override
public AndroidPackage getAndroidPackage() {
return getPkg();
}
@NonNull
public SigningInfo getSigningInfo() {
return new SigningInfo(signatures.mSigningDetails);
}
@NonNull
@Override
public String[] getUsesSdkLibraries() {
return usesSdkLibraries == null ? EmptyArray.STRING : usesSdkLibraries;
}
@NonNull
@Override
public long[] getUsesSdkLibrariesVersionsMajor() {
return usesSdkLibrariesVersionsMajor == null ? EmptyArray.LONG
: usesSdkLibrariesVersionsMajor;
}
@NonNull
@Override
public boolean[] getUsesSdkLibrariesOptional() {
return usesSdkLibrariesOptional == null ? EmptyArray.BOOLEAN : usesSdkLibrariesOptional;
}
@NonNull
@Override
public String[] getUsesStaticLibraries() {
return usesStaticLibraries == null ? EmptyArray.STRING : usesStaticLibraries;
}
@NonNull
@Override
public long[] getUsesStaticLibrariesVersions() {
return usesStaticLibrariesVersions == null ? EmptyArray.LONG : usesStaticLibrariesVersions;
}
@NonNull
@Override
public List<SharedLibrary> getSharedLibraryDependencies() {
return Collections.unmodifiableList(pkgState.getUsesLibraryInfos());
}
@NonNull
public PackageSetting addUsesLibraryInfo(@NonNull SharedLibraryInfo value) {
pkgState.addUsesLibraryInfo(new SharedLibraryWrapper(value));
return this;
}
@NonNull
@Override
public List<String> getUsesLibraryFiles() {
return Collections.unmodifiableList(pkgState.getUsesLibraryFiles());
}
@NonNull
public PackageSetting addUsesLibraryFile(String value) {
pkgState.addUsesLibraryFile(value);
return this;
}
@Override
public boolean isHiddenUntilInstalled() {
return pkgState.isHiddenUntilInstalled();
}
@NonNull
@Override
public long[] getLastPackageUsageTime() {
return pkgState.getLastPackageUsageTimeInMills();
}
@Override
public boolean isUpdatedSystemApp() {
return pkgState.isUpdatedSystemApp();
}
@Override
public boolean isApkInUpdatedApex() {
return pkgState.isApkInUpdatedApex();
}
@Nullable
@Override
public String getApexModuleName() {
return pkgState.getApexModuleName();
}
public PackageSetting setDomainSetId(@NonNull UUID domainSetId) {
mDomainSetId = domainSetId;
onChanged();
return this;
}
public PackageSetting setCategoryOverride(int categoryHint) {
this.categoryOverride = categoryHint;
onChanged();
return this;
}
public PackageSetting setLegacyNativeLibraryPath(
String legacyNativeLibraryPathString) {
this.legacyNativeLibraryPath = legacyNativeLibraryPathString;
onChanged();
return this;
}
public PackageSetting setMimeGroups(@Nullable Map<String, Set<String>> mimeGroups) {
if (mimeGroups != null) {
copyMimeGroups(mimeGroups);
onChanged();
}
return this;
}
public PackageSetting setUsesSdkLibraries(String[] usesSdkLibraries) {
this.usesSdkLibraries = usesSdkLibraries;
onChanged();
return this;
}
public PackageSetting setUsesSdkLibrariesVersionsMajor(long[] usesSdkLibrariesVersions) {
this.usesSdkLibrariesVersionsMajor = usesSdkLibrariesVersions;
onChanged();
return this;
}
public PackageSetting setUsesSdkLibrariesOptional(boolean[] usesSdkLibrariesOptional) {
this.usesSdkLibrariesOptional = usesSdkLibrariesOptional;
onChanged();
return this;
}
public PackageSetting setUsesStaticLibraries(String[] usesStaticLibraries) {
this.usesStaticLibraries = usesStaticLibraries;
onChanged();
return this;
}
public PackageSetting setUsesStaticLibrariesVersions(long[] usesStaticLibrariesVersions) {
this.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
onChanged();
return this;
}
public PackageSetting setApexModuleName(@Nullable String apexModuleName) {
pkgState.setApexModuleName(apexModuleName);
return this;
}
@NonNull
@Override
public PackageStateUnserialized getTransientState() {
return pkgState;
}
@NonNull
public SparseArray<? extends PackageUserStateInternal> getUserStates() {
return mUserStates;
}
public PackageSetting addMimeTypes(String mimeGroup, Set<String> mimeTypes) {
if (mimeGroups == null) {
mimeGroups = new ArrayMap<>();
}
Set<String> existingMimeTypes = mimeGroups.get(mimeGroup);
if (existingMimeTypes == null) {
existingMimeTypes = new ArraySet<>();
mimeGroups.put(mimeGroup, existingMimeTypes);
}
existingMimeTypes.addAll(mimeTypes);
return this;
}
@NonNull
@Override
public PackageUserState getStateForUser(@NonNull UserHandle user) {
PackageUserState userState = getUserStates().get(user.getIdentifier());
return userState == null ? PackageUserState.DEFAULT : userState;
}
@Nullable
public String getPrimaryCpuAbi() {
if (TextUtils.isEmpty(mPrimaryCpuAbi) && pkg != null) {
return AndroidPackageUtils.getRawPrimaryCpuAbi(pkg);
}
return mPrimaryCpuAbi;
}
@Nullable
public String getSecondaryCpuAbi() {
if (TextUtils.isEmpty(mSecondaryCpuAbi) && pkg != null) {
return AndroidPackageUtils.getRawSecondaryCpuAbi(pkg);
}
return mSecondaryCpuAbi;
}
@Nullable
@Override
public String getSeInfo() {
String overrideSeInfo = getTransientState().getOverrideSeInfo();
if (!TextUtils.isEmpty(overrideSeInfo)) {
return overrideSeInfo;
}
return getTransientState().getSeInfo();
}
@Nullable
public String getPrimaryCpuAbiLegacy() {
return mPrimaryCpuAbi;
}
@Nullable
public String getSecondaryCpuAbiLegacy() {
return mSecondaryCpuAbi;
}
@ApplicationInfo.HiddenApiEnforcementPolicy
@Override
public int getHiddenApiEnforcementPolicy() {
return AndroidPackageUtils.getHiddenApiEnforcementPolicy(getAndroidPackage(), this);
}
@Override
public boolean isApex() {
// TODO(b/256637152):
// TODO(b/243839669): Use a flag tracked directly in PackageSetting
return getAndroidPackage() != null && getAndroidPackage().isApex();
}
@Override
public boolean isForceQueryableOverride() {
return getBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE);
}
/**
* @see PackageState#isUpdateAvailable()
*/
@Override
public boolean isUpdateAvailable() {
return getBoolean(Booleans.UPDATE_AVAILABLE);
}
@Override
public boolean isInstallPermissionsFixed() {
return getBoolean(Booleans.INSTALL_PERMISSION_FIXED);
}
/**
* @see PackageState#isDefaultToDeviceProtectedStorage()
*/
@Override
public boolean isDefaultToDeviceProtectedStorage() {
return (getPrivateFlags() & PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0;
}
@Override
public boolean isPersistent() {
return (getFlags() & ApplicationInfo.FLAG_PERSISTENT) != 0;
}
@Override
public boolean isScannedAsStoppedSystemApp() {
return getBoolean(Booleans.SCANNED_AS_STOPPED_SYSTEM_APP);
}
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
/**
* The path under which native libraries have been unpacked. This path is
* always derived at runtime, and is only stored here for cleanup when a
* package is uninstalled.
*/
@DataClass.Generated.Member
public @Nullable @Deprecated String getLegacyNativeLibraryPath() {
return legacyNativeLibraryPath;
}
@DataClass.Generated.Member
public @NonNull String getName() {
return mName;
}
@DataClass.Generated.Member
public @Nullable String getRealName() {
return mRealName;
}
@DataClass.Generated.Member
public int getAppId() {
return mAppId;
}
/**
* It is expected that all code that uses a {@link PackageSetting} understands this inner field
* may be null. Note that this relationship only works one way. It should not be possible to
* have an entry inside {@link PackageManagerService#mPackages} without a corresponding
* {@link PackageSetting} inside {@link Settings#mPackages}.
*
* @see PackageState#getAndroidPackage()
*/
@DataClass.Generated.Member
public @Nullable AndroidPackageInternal getPkg() {
return pkg;
}
/**
* @see AndroidPackage#getPath()
*/
@DataClass.Generated.Member
public @NonNull File getPath() {
return mPath;
}
@DataClass.Generated.Member
public @NonNull String getPathString() {
return mPathString;
}
@DataClass.Generated.Member
public float getLoadingProgress() {
return mLoadingProgress;
}
@DataClass.Generated.Member
public long getLoadingCompletedTime() {
return mLoadingCompletedTime;
}
@DataClass.Generated.Member
public @Nullable String getCpuAbiOverride() {
return mCpuAbiOverride;
}
@DataClass.Generated.Member
public long getLastModifiedTime() {
return mLastModifiedTime;
}
@DataClass.Generated.Member
public long getLastUpdateTime() {
return lastUpdateTime;
}
@DataClass.Generated.Member
public @NonNull PackageSignatures getSignatures() {
return signatures;
}
@DataClass.Generated.Member
public @NonNull PackageKeySetData getKeySetData() {
return keySetData;
}
@DataClass.Generated.Member
public @NonNull InstallSource getInstallSource() {
return installSource;
}
/**
* @see PackageState#getVolumeUuid()
*/
@DataClass.Generated.Member
public @Nullable String getVolumeUuid() {
return volumeUuid;
}
/**
* @see PackageState#getCategoryOverride()
*/
@DataClass.Generated.Member
public int getCategoryOverride() {
return categoryOverride;
}
@DataClass.Generated.Member
public @NonNull PackageStateUnserialized getPkgState() {
return pkgState;
}
@DataClass.Generated.Member
public @NonNull UUID getDomainSetId() {
return mDomainSetId;
}
@DataClass.Generated.Member
public @Nullable String getAppMetadataFilePath() {
return mAppMetadataFilePath;
}
@DataClass.Generated.Member
public int getTargetSdkVersion() {
return mTargetSdkVersion;
}
@DataClass.Generated.Member
public @Nullable byte[] getRestrictUpdateHash() {
return mRestrictUpdateHash;
}
@DataClass.Generated(
time = 1700251133016L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java",
inputSignatures = "private int mBooleans\nprivate int mSharedUserAppId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.internal.pm.parsing.pkg.AndroidPackageInternal pkg\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate long mLoadingCompletedTime\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate @android.annotation.Nullable java.lang.String mAppMetadataFilePath\nprivate int mTargetSdkVersion\nprivate @android.annotation.Nullable byte[] mRestrictUpdateHash\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackage(java.lang.String,int)\npublic com.android.server.pm.PackageSetting setUpdateOwnerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic com.android.server.pm.PackageSetting setSharedUserAppId(int)\npublic com.android.server.pm.PackageSetting setTargetSdkVersion(int)\npublic com.android.server.pm.PackageSetting setRestrictUpdateHash(byte[])\npublic @java.lang.Override int getSharedUserAppId()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override java.lang.String toString()\nprivate void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic boolean isRequestLegacyExternalStorage()\npublic boolean isUserDataFragile()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting,boolean)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isInstalledOrHasDataOnAnyOtherUser(int[],int)\n int[] queryInstalledUsers(int[],boolean)\n int[] queryUsersInstalledOrHasData(int[])\n long getCeDataInode(int)\n long getDeDataInode(int)\n void setCeDataInode(long,int)\n void setDeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\npublic com.android.server.pm.PackageSetting setScannedAsStoppedSystemApp(boolean)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long,int,com.android.server.pm.pkg.ArchiveState)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponents(int)\n com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\nprivate static void writeArchiveState(android.util.proto.ProtoOutputStream,com.android.server.pm.pkg.ArchiveState)\npublic @com.android.internal.annotations.VisibleForTesting com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isIncremental()\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic com.android.server.pm.PackageSetting setLoadingCompletedTime(long)\npublic com.android.server.pm.PackageSetting setAppMetadataFilePath(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackage getAndroidPackage()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<com.android.server.pm.pkg.SharedLibrary> getSharedLibraryDependencies()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryInfo(android.content.pm.SharedLibraryInfo)\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryFile(java.lang.String)\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getApexModuleName()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic com.android.server.pm.PackageSetting setApexModuleName(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbi()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbi()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getSeInfo()\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbiLegacy()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbiLegacy()\npublic @android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy @java.lang.Override int getHiddenApiEnforcementPolicy()\npublic @java.lang.Override boolean isApex()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isDefaultToDeviceProtectedStorage()\npublic @java.lang.Override boolean isPersistent()\npublic @java.lang.Override boolean isScannedAsStoppedSystemApp()\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\nprivate static final int INSTALL_PERMISSION_FIXED\nprivate static final int UPDATE_AVAILABLE\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nprivate static final int SCANNED_AS_STOPPED_SYSTEM_APP\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}