Loading core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -3944,7 +3944,9 @@ package android.content.pm { method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void addFile(int, @NonNull String, long, @NonNull byte[], @Nullable byte[]); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void commitTransferred(@NonNull android.content.IntentSender); method @Nullable @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public android.content.pm.DataLoaderParams getDataLoaderParams(); method @FlaggedApi("android.content.pm.set_pre_verified_domains") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public java.util.Set<java.lang.String> getPreVerifiedDomains(); method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void removeFile(int, @NonNull String); method @FlaggedApi("android.content.pm.set_pre_verified_domains") @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public void setPreVerifiedDomains(@NonNull java.util.Set<java.lang.String>); } public static class PackageInstaller.SessionInfo implements android.os.Parcelable { core/java/android/content/pm/IPackageInstallerSession.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.pm.DataLoaderParamsParcel; import android.content.pm.IOnChecksumsReadyListener; import android.content.pm.IPackageInstallObserver2; import android.content.pm.PackageInstaller; import android.content.pm.verify.domain.DomainSet; import android.content.IntentSender; import android.os.ParcelFileDescriptor; Loading Loading @@ -73,4 +74,7 @@ interface IPackageInstallerSession { ParcelFileDescriptor getAppMetadataFd(); ParcelFileDescriptor openWriteAppMetadata(); void removeAppMetadata(); void setPreVerifiedDomains(in DomainSet preVerifiedDomains); DomainSet getPreVerifiedDomains(); } core/java/android/content/pm/PackageInstaller.java +61 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.content.pm.parsing.ApkLiteParseUtils; import android.content.pm.parsing.PackageLite; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.content.pm.verify.domain.DomainSet; import android.graphics.Bitmap; import android.icu.util.ULocale; import android.net.Uri; Loading Loading @@ -2296,6 +2297,66 @@ public class PackageInstaller { throw e.rethrowFromSystemServer(); } } /** * Sets the pre-verified domains for the app to be installed. By setting pre-verified * domains, the installer allows the app to be opened by the app links of these domains * immediately after it is installed. * * <p>The specified pre-verified domains should be a subset of the hostnames declared with * {@code android:host} and {@code android:autoVerify=true} in the intent filters of the * AndroidManifest.xml of the app. If some of the specified domains are not declared in * the manifest, they will be ignored.</p> * <p>If this API is called multiple times on the same {@link #Session}, the last call * overrides the previous ones.</p> * <p>The instant app installer is the only entity that may call this API. * </p> * * @param preVerifiedDomains domains that are already pre-verified by the installer. * * @throws IllegalArgumentException if the number or the total size of the pre-verified * domains exceeds the maximum allowed, or if the domain * names contain invalid characters. * @throws SecurityException if called from an installer that is not the instant app * installer of the device, or if called after the session has * been committed or abandoned. * * @hide */ @SystemApi @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS) @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS) public void setPreVerifiedDomains(@NonNull Set<String> preVerifiedDomains) { Preconditions.checkArgument(preVerifiedDomains != null && !preVerifiedDomains.isEmpty(), "Provided pre-verified domains cannot be null or empty."); try { mSession.setPreVerifiedDomains(new DomainSet(preVerifiedDomains)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve the pre-verified domains set in a session. * See {@link #setPreVerifiedDomains(Set)} for the definition of pre-verified domains. * * @throws SecurityException if called from an installer that is not the owner of the * session, or if called after the session has been committed or * abandoned. * @hide */ @SystemApi @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS) @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS) @NonNull public Set<String> getPreVerifiedDomains() { try { DomainSet domainSet = mSession.getPreVerifiedDomains(); return domainSet != null ? domainSet.getDomains() : Collections.emptySet(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } /** Loading services/core/java/com/android/server/pm/InstallRequest.java +10 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.content.pm.PackageManager; import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.parsing.PackageLite; import android.content.pm.verify.domain.DomainSet; import android.net.Uri; import android.os.Build; import android.os.Process; Loading Loading @@ -155,6 +156,9 @@ final class InstallRequest { @NonNull private final ArrayList<String> mWarnings = new ArrayList<>(); @Nullable private DomainSet mPreVerifiedDomains; // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); Loading @@ -172,6 +176,7 @@ final class InstallRequest { mIsInstallInherit = params.mIsInherit; mSessionId = params.mSessionId; mRequireUserAction = params.mRequireUserAction; mPreVerifiedDomains = params.mPreVerifiedDomains; } // Install existing package as user Loading Loading @@ -875,6 +880,11 @@ final class InstallRequest { } } @Nullable public DomainSet getPreVerifiedDomains() { return mPreVerifiedDomains; } public void addWarning(@NonNull String warning) { mWarnings.add(warning); } Loading services/core/java/com/android/server/pm/InstallingSession.java +6 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.SigningDetails; import android.content.pm.parsing.PackageLite; import android.content.pm.verify.domain.DomainSet; import android.os.Environment; import android.os.Trace; import android.os.UserHandle; Loading Loading @@ -98,6 +99,8 @@ class InstallingSession { final int mSessionId; final int mRequireUserAction; final boolean mApplicationEnabledSettingPersistent; @Nullable final DomainSet mPreVerifiedDomains; // For move install InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, Loading Loading @@ -130,12 +133,13 @@ class InstallingSession { mSessionId = -1; mRequireUserAction = USER_ACTION_UNSPECIFIED; mApplicationEnabledSettingPersistent = false; mPreVerifiedDomains = null; } InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams, InstallSource installSource, UserHandle user, SigningDetails signingDetails, int installerUid, PackageLite packageLite, PackageManagerService pm) { PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm) { mPm = pm; mUser = user; mOriginInfo = OriginInfo.fromStagedFile(stagedDir); Loading Loading @@ -163,6 +167,7 @@ class InstallingSession { mSessionId = sessionId; mRequireUserAction = sessionParams.requireUserAction; mApplicationEnabledSettingPersistent = sessionParams.applicationEnabledSettingPersistent; mPreVerifiedDomains = preVerifiedDomains; } @Override Loading Loading
core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -3944,7 +3944,9 @@ package android.content.pm { method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void addFile(int, @NonNull String, long, @NonNull byte[], @Nullable byte[]); method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void commitTransferred(@NonNull android.content.IntentSender); method @Nullable @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public android.content.pm.DataLoaderParams getDataLoaderParams(); method @FlaggedApi("android.content.pm.set_pre_verified_domains") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public java.util.Set<java.lang.String> getPreVerifiedDomains(); method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void removeFile(int, @NonNull String); method @FlaggedApi("android.content.pm.set_pre_verified_domains") @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public void setPreVerifiedDomains(@NonNull java.util.Set<java.lang.String>); } public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
core/java/android/content/pm/IPackageInstallerSession.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.pm.DataLoaderParamsParcel; import android.content.pm.IOnChecksumsReadyListener; import android.content.pm.IPackageInstallObserver2; import android.content.pm.PackageInstaller; import android.content.pm.verify.domain.DomainSet; import android.content.IntentSender; import android.os.ParcelFileDescriptor; Loading Loading @@ -73,4 +74,7 @@ interface IPackageInstallerSession { ParcelFileDescriptor getAppMetadataFd(); ParcelFileDescriptor openWriteAppMetadata(); void removeAppMetadata(); void setPreVerifiedDomains(in DomainSet preVerifiedDomains); DomainSet getPreVerifiedDomains(); }
core/java/android/content/pm/PackageInstaller.java +61 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.content.pm.parsing.ApkLiteParseUtils; import android.content.pm.parsing.PackageLite; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.content.pm.verify.domain.DomainSet; import android.graphics.Bitmap; import android.icu.util.ULocale; import android.net.Uri; Loading Loading @@ -2296,6 +2297,66 @@ public class PackageInstaller { throw e.rethrowFromSystemServer(); } } /** * Sets the pre-verified domains for the app to be installed. By setting pre-verified * domains, the installer allows the app to be opened by the app links of these domains * immediately after it is installed. * * <p>The specified pre-verified domains should be a subset of the hostnames declared with * {@code android:host} and {@code android:autoVerify=true} in the intent filters of the * AndroidManifest.xml of the app. If some of the specified domains are not declared in * the manifest, they will be ignored.</p> * <p>If this API is called multiple times on the same {@link #Session}, the last call * overrides the previous ones.</p> * <p>The instant app installer is the only entity that may call this API. * </p> * * @param preVerifiedDomains domains that are already pre-verified by the installer. * * @throws IllegalArgumentException if the number or the total size of the pre-verified * domains exceeds the maximum allowed, or if the domain * names contain invalid characters. * @throws SecurityException if called from an installer that is not the instant app * installer of the device, or if called after the session has * been committed or abandoned. * * @hide */ @SystemApi @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS) @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS) public void setPreVerifiedDomains(@NonNull Set<String> preVerifiedDomains) { Preconditions.checkArgument(preVerifiedDomains != null && !preVerifiedDomains.isEmpty(), "Provided pre-verified domains cannot be null or empty."); try { mSession.setPreVerifiedDomains(new DomainSet(preVerifiedDomains)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Retrieve the pre-verified domains set in a session. * See {@link #setPreVerifiedDomains(Set)} for the definition of pre-verified domains. * * @throws SecurityException if called from an installer that is not the owner of the * session, or if called after the session has been committed or * abandoned. * @hide */ @SystemApi @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS) @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS) @NonNull public Set<String> getPreVerifiedDomains() { try { DomainSet domainSet = mSession.getPreVerifiedDomains(); return domainSet != null ? domainSet.getDomains() : Collections.emptySet(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } /** Loading
services/core/java/com/android/server/pm/InstallRequest.java +10 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.content.pm.PackageManager; import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.parsing.PackageLite; import android.content.pm.verify.domain.DomainSet; import android.net.Uri; import android.os.Build; import android.os.Process; Loading Loading @@ -155,6 +156,9 @@ final class InstallRequest { @NonNull private final ArrayList<String> mWarnings = new ArrayList<>(); @Nullable private DomainSet mPreVerifiedDomains; // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); Loading @@ -172,6 +176,7 @@ final class InstallRequest { mIsInstallInherit = params.mIsInherit; mSessionId = params.mSessionId; mRequireUserAction = params.mRequireUserAction; mPreVerifiedDomains = params.mPreVerifiedDomains; } // Install existing package as user Loading Loading @@ -875,6 +880,11 @@ final class InstallRequest { } } @Nullable public DomainSet getPreVerifiedDomains() { return mPreVerifiedDomains; } public void addWarning(@NonNull String warning) { mWarnings.add(warning); } Loading
services/core/java/com/android/server/pm/InstallingSession.java +6 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.SigningDetails; import android.content.pm.parsing.PackageLite; import android.content.pm.verify.domain.DomainSet; import android.os.Environment; import android.os.Trace; import android.os.UserHandle; Loading Loading @@ -98,6 +99,8 @@ class InstallingSession { final int mSessionId; final int mRequireUserAction; final boolean mApplicationEnabledSettingPersistent; @Nullable final DomainSet mPreVerifiedDomains; // For move install InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, Loading Loading @@ -130,12 +133,13 @@ class InstallingSession { mSessionId = -1; mRequireUserAction = USER_ACTION_UNSPECIFIED; mApplicationEnabledSettingPersistent = false; mPreVerifiedDomains = null; } InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams, InstallSource installSource, UserHandle user, SigningDetails signingDetails, int installerUid, PackageLite packageLite, PackageManagerService pm) { PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm) { mPm = pm; mUser = user; mOriginInfo = OriginInfo.fromStagedFile(stagedDir); Loading Loading @@ -163,6 +167,7 @@ class InstallingSession { mSessionId = sessionId; mRequireUserAction = sessionParams.requireUserAction; mApplicationEnabledSettingPersistent = sessionParams.applicationEnabledSettingPersistent; mPreVerifiedDomains = preVerifiedDomains; } @Override Loading