Loading AconfigFlags.bp +21 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ // limitations under the License. aconfig_srcjars = [ ":android.content.pm.flags-aconfig-java{.generated_srcjars}", ":android.hardware.biometrics.flags-aconfig-java{.generated_srcjars}", ":android.nfc.flags-aconfig-java{.generated_srcjars}", ":android.os.flags-aconfig-java{.generated_srcjars}", Loading Loading @@ -145,6 +146,26 @@ java_aconfig_library { defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Package Manager aconfig_declarations { name: "android.content.pm.flags-aconfig", package: "android.content.pm", srcs: ["core/java/android/content/pm/flags.aconfig"], } java_aconfig_library { name: "android.content.pm.flags-aconfig-java", aconfig_declarations: "android.content.pm.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } java_aconfig_library { name: "android.content.pm.flags-aconfig-java-host", aconfig_declarations: "android.content.pm.flags-aconfig", host_supported: true, defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Biometrics aconfig_declarations { name: "android.hardware.biometrics.flags-aconfig", Loading core/java/android/content/pm/PackageInstaller.java +7 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,13 @@ public class PackageInstaller { public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH"; /** * A list of warnings that occurred during installation. * * @hide */ public static final String EXTRA_WARNINGS = "android.content.pm.extra.WARNINGS"; /** * Streaming installation pending. * Caller should make sure DataLoader is able to prepare image and reinitiate the operation. Loading core/java/android/content/pm/flags.aconfig 0 → 100644 +8 −0 Original line number Diff line number Diff line package: "android.content.pm" flag { name: "use_art_service_v2" namespace: "package_manager_service" description: "Feature flag to enable the features that rely on new ART Service APIs that are in the VIC version of the ART module." bug: "304741685" } services/core/java/com/android/server/pm/InstallRequest.java +44 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.content.pm.PackageManager.INSTALL_SCENARIO_DEFAULT; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; import static android.os.Process.INVALID_UID; import static com.android.server.art.model.DexoptResult.DexContainerFileDexoptResult; import static com.android.server.art.model.DexoptResult.PackageDexoptResult; import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; import static com.android.server.pm.PackageManagerService.TAG; Loading @@ -30,6 +32,7 @@ import android.annotation.Nullable; import android.apex.ApexInfo; import android.app.AppOpsManager; import android.content.pm.DataLoaderType; import android.content.pm.Flags; import android.content.pm.IPackageInstallObserver2; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; Loading @@ -52,6 +55,7 @@ import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; final class InstallRequest { Loading Loading @@ -130,6 +134,9 @@ final class InstallRequest { private int mDexoptStatus; @NonNull private ArrayList<String> mWarnings = new ArrayList<>(); // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); Loading Loading @@ -615,6 +622,11 @@ final class InstallRequest { return mDexoptStatus; } @NonNull public ArrayList<String> getWarnings() { return mWarnings; } public void setScanFlags(int scanFlags) { mScanFlags = scanFlags; } Loading Loading @@ -757,6 +769,10 @@ final class InstallRequest { } } public void addWarning(@NonNull String warning) { mWarnings.add(warning); } public void onPrepareStarted() { if (mPackageMetrics != null) { mPackageMetrics.onStepStarted(PackageMetrics.STEP_PREPARE); Loading Loading @@ -806,23 +822,38 @@ final class InstallRequest { } public void onDexoptFinished(DexoptResult dexoptResult) { if (mPackageMetrics == null) { return; // Only report external profile warnings when installing from adb. The goal is to warn app // developers if they have provided bad external profiles, so it's not beneficial to report // those warnings in the normal app install workflow. if (isInstallFromAdb() && Flags.useArtServiceV2()) { var externalProfileErrors = new LinkedHashSet<String>(); for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexContainerFileDexoptResult fileResult : packageResult.getDexContainerFileDexoptResults()) { externalProfileErrors.addAll(fileResult.getExternalProfileErrors()); } mDexoptStatus = dexoptResult.getFinalStatus(); if (mDexoptStatus != DexoptResult.DEXOPT_PERFORMED) { return; } if (!externalProfileErrors.isEmpty()) { addWarning("Error occurred during dexopt when processing external profiles:\n " + String.join("\n ", externalProfileErrors)); } } // Report dexopt metrics. if (mPackageMetrics != null) { mDexoptStatus = dexoptResult.getFinalStatus(); if (mDexoptStatus == DexoptResult.DEXOPT_PERFORMED) { long durationMillis = 0; for (DexoptResult.PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexoptResult.DexContainerFileDexoptResult fileResult : for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexContainerFileDexoptResult fileResult : packageResult.getDexContainerFileDexoptResults()) { durationMillis += fileResult.getDex2oatWallTimeMillis(); } } mPackageMetrics.onStepFinished(PackageMetrics.STEP_DEXOPT, durationMillis); } } } public void onInstallCompleted() { if (getReturnCode() == INSTALL_SUCCEEDED) { Loading services/core/java/com/android/server/pm/PackageInstallerSession.java +30 −1 Original line number Diff line number Diff line Loading @@ -2714,15 +2714,40 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { * @return a future that will be completed when the whole process is completed. */ private CompletableFuture<Void> install() { // `futures` either contains only one session (`this`) or contains one parent session // (`this`) and n-1 child sessions. List<CompletableFuture<InstallResult>> futures = installNonStaged(); CompletableFuture<InstallResult>[] arr = new CompletableFuture[futures.size()]; return CompletableFuture.allOf(futures.toArray(arr)).whenComplete((r, t) -> { if (t == null) { setSessionApplied(); var multiPackageWarnings = new ArrayList<String>(); if (isMultiPackage()) { // This is a parent session. Collect warnings from children. for (CompletableFuture<InstallResult> f : futures) { InstallResult result = f.join(); if (result.session != this && result.extras != null) { ArrayList<String> childWarnings = result.extras.getStringArrayList( PackageInstaller.EXTRA_WARNINGS); if (!ArrayUtils.isEmpty(childWarnings)) { multiPackageWarnings.addAll(childWarnings); } } } } for (CompletableFuture<InstallResult> f : futures) { InstallResult result = f.join(); Bundle extras = result.extras; if (isMultiPackage() && result.session == this && !multiPackageWarnings.isEmpty()) { if (extras == null) { extras = new Bundle(); } extras.putStringArrayList( PackageInstaller.EXTRA_WARNINGS, multiPackageWarnings); } result.session.dispatchSessionFinished( INSTALL_SUCCEEDED, "Session installed", result.extras); INSTALL_SUCCEEDED, "Session installed", extras); } } else { PackageManagerException e = (PackageManagerException) t.getCause(); Loading Loading @@ -4904,6 +4929,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (!TextUtils.isEmpty(existing)) { fillIn.putExtra(PackageInstaller.EXTRA_OTHER_PACKAGE_NAME, existing); } ArrayList<String> warnings = extras.getStringArrayList(PackageInstaller.EXTRA_WARNINGS); if (!ArrayUtils.isEmpty(warnings)) { fillIn.putStringArrayListExtra(PackageInstaller.EXTRA_WARNINGS, warnings); } } try { final BroadcastOptions options = BroadcastOptions.makeBasic(); Loading Loading
AconfigFlags.bp +21 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ // limitations under the License. aconfig_srcjars = [ ":android.content.pm.flags-aconfig-java{.generated_srcjars}", ":android.hardware.biometrics.flags-aconfig-java{.generated_srcjars}", ":android.nfc.flags-aconfig-java{.generated_srcjars}", ":android.os.flags-aconfig-java{.generated_srcjars}", Loading Loading @@ -145,6 +146,26 @@ java_aconfig_library { defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Package Manager aconfig_declarations { name: "android.content.pm.flags-aconfig", package: "android.content.pm", srcs: ["core/java/android/content/pm/flags.aconfig"], } java_aconfig_library { name: "android.content.pm.flags-aconfig-java", aconfig_declarations: "android.content.pm.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } java_aconfig_library { name: "android.content.pm.flags-aconfig-java-host", aconfig_declarations: "android.content.pm.flags-aconfig", host_supported: true, defaults: ["framework-minus-apex-aconfig-java-defaults"], } // Biometrics aconfig_declarations { name: "android.hardware.biometrics.flags-aconfig", Loading
core/java/android/content/pm/PackageInstaller.java +7 −0 Original line number Diff line number Diff line Loading @@ -344,6 +344,13 @@ public class PackageInstaller { public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH"; /** * A list of warnings that occurred during installation. * * @hide */ public static final String EXTRA_WARNINGS = "android.content.pm.extra.WARNINGS"; /** * Streaming installation pending. * Caller should make sure DataLoader is able to prepare image and reinitiate the operation. Loading
core/java/android/content/pm/flags.aconfig 0 → 100644 +8 −0 Original line number Diff line number Diff line package: "android.content.pm" flag { name: "use_art_service_v2" namespace: "package_manager_service" description: "Feature flag to enable the features that rely on new ART Service APIs that are in the VIC version of the ART module." bug: "304741685" }
services/core/java/com/android/server/pm/InstallRequest.java +44 −13 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import static android.content.pm.PackageManager.INSTALL_SCENARIO_DEFAULT; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; import static android.os.Process.INVALID_UID; import static com.android.server.art.model.DexoptResult.DexContainerFileDexoptResult; import static com.android.server.art.model.DexoptResult.PackageDexoptResult; import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; import static com.android.server.pm.PackageManagerService.TAG; Loading @@ -30,6 +32,7 @@ import android.annotation.Nullable; import android.apex.ApexInfo; import android.app.AppOpsManager; import android.content.pm.DataLoaderType; import android.content.pm.Flags; import android.content.pm.IPackageInstallObserver2; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; Loading @@ -52,6 +55,7 @@ import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; final class InstallRequest { Loading Loading @@ -130,6 +134,9 @@ final class InstallRequest { private int mDexoptStatus; @NonNull private ArrayList<String> mWarnings = new ArrayList<>(); // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); Loading Loading @@ -615,6 +622,11 @@ final class InstallRequest { return mDexoptStatus; } @NonNull public ArrayList<String> getWarnings() { return mWarnings; } public void setScanFlags(int scanFlags) { mScanFlags = scanFlags; } Loading Loading @@ -757,6 +769,10 @@ final class InstallRequest { } } public void addWarning(@NonNull String warning) { mWarnings.add(warning); } public void onPrepareStarted() { if (mPackageMetrics != null) { mPackageMetrics.onStepStarted(PackageMetrics.STEP_PREPARE); Loading Loading @@ -806,23 +822,38 @@ final class InstallRequest { } public void onDexoptFinished(DexoptResult dexoptResult) { if (mPackageMetrics == null) { return; // Only report external profile warnings when installing from adb. The goal is to warn app // developers if they have provided bad external profiles, so it's not beneficial to report // those warnings in the normal app install workflow. if (isInstallFromAdb() && Flags.useArtServiceV2()) { var externalProfileErrors = new LinkedHashSet<String>(); for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexContainerFileDexoptResult fileResult : packageResult.getDexContainerFileDexoptResults()) { externalProfileErrors.addAll(fileResult.getExternalProfileErrors()); } mDexoptStatus = dexoptResult.getFinalStatus(); if (mDexoptStatus != DexoptResult.DEXOPT_PERFORMED) { return; } if (!externalProfileErrors.isEmpty()) { addWarning("Error occurred during dexopt when processing external profiles:\n " + String.join("\n ", externalProfileErrors)); } } // Report dexopt metrics. if (mPackageMetrics != null) { mDexoptStatus = dexoptResult.getFinalStatus(); if (mDexoptStatus == DexoptResult.DEXOPT_PERFORMED) { long durationMillis = 0; for (DexoptResult.PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexoptResult.DexContainerFileDexoptResult fileResult : for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { for (DexContainerFileDexoptResult fileResult : packageResult.getDexContainerFileDexoptResults()) { durationMillis += fileResult.getDex2oatWallTimeMillis(); } } mPackageMetrics.onStepFinished(PackageMetrics.STEP_DEXOPT, durationMillis); } } } public void onInstallCompleted() { if (getReturnCode() == INSTALL_SUCCEEDED) { Loading
services/core/java/com/android/server/pm/PackageInstallerSession.java +30 −1 Original line number Diff line number Diff line Loading @@ -2714,15 +2714,40 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { * @return a future that will be completed when the whole process is completed. */ private CompletableFuture<Void> install() { // `futures` either contains only one session (`this`) or contains one parent session // (`this`) and n-1 child sessions. List<CompletableFuture<InstallResult>> futures = installNonStaged(); CompletableFuture<InstallResult>[] arr = new CompletableFuture[futures.size()]; return CompletableFuture.allOf(futures.toArray(arr)).whenComplete((r, t) -> { if (t == null) { setSessionApplied(); var multiPackageWarnings = new ArrayList<String>(); if (isMultiPackage()) { // This is a parent session. Collect warnings from children. for (CompletableFuture<InstallResult> f : futures) { InstallResult result = f.join(); if (result.session != this && result.extras != null) { ArrayList<String> childWarnings = result.extras.getStringArrayList( PackageInstaller.EXTRA_WARNINGS); if (!ArrayUtils.isEmpty(childWarnings)) { multiPackageWarnings.addAll(childWarnings); } } } } for (CompletableFuture<InstallResult> f : futures) { InstallResult result = f.join(); Bundle extras = result.extras; if (isMultiPackage() && result.session == this && !multiPackageWarnings.isEmpty()) { if (extras == null) { extras = new Bundle(); } extras.putStringArrayList( PackageInstaller.EXTRA_WARNINGS, multiPackageWarnings); } result.session.dispatchSessionFinished( INSTALL_SUCCEEDED, "Session installed", result.extras); INSTALL_SUCCEEDED, "Session installed", extras); } } else { PackageManagerException e = (PackageManagerException) t.getCause(); Loading Loading @@ -4904,6 +4929,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (!TextUtils.isEmpty(existing)) { fillIn.putExtra(PackageInstaller.EXTRA_OTHER_PACKAGE_NAME, existing); } ArrayList<String> warnings = extras.getStringArrayList(PackageInstaller.EXTRA_WARNINGS); if (!ArrayUtils.isEmpty(warnings)) { fillIn.putStringArrayListExtra(PackageInstaller.EXTRA_WARNINGS, warnings); } } try { final BroadcastOptions options = BroadcastOptions.makeBasic(); Loading