From b87a491de63069fb903c95727f57511c7e4eeaa0 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Wed, 26 Oct 2016 18:36:57 -0700 Subject: [PATCH] [DO NOT MERGE] Only setSize if -s arg is specified Calculate size of installed APKs only when INSTALL_EXTERNAL flag is set. calculateInstalledSize is expensive and may take up to 20% of total installation time. Bug: 32180551 Bug: 29932779 Change-Id: I173d2b38820cc86cbfacecd1bacef57369d10af7 --- cmds/pm/src/com/android/commands/pm/Pm.java | 24 ++++++++++++++-------- .../server/pm/PackageManagerShellCommand.java | 23 +++++++++++++-------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 5f83d191a731..1b4eda804312 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -367,18 +367,24 @@ public final class Pm { private int runInstall() throws RemoteException { final InstallParams params = makeInstallParams(); final String inPath = nextArg(); + boolean installExternal = + (params.sessionParams.installFlags & PackageManager.INSTALL_EXTERNAL) != 0; if (params.sessionParams.sizeBytes < 0 && inPath != null) { File file = new File(inPath); if (file.isFile()) { - try { - ApkLite baseApk = PackageParser.parseApkLite(file, 0); - PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null); - params.sessionParams.setSize( - PackageHelper.calculateInstalledSize(pkgLite, false, - params.sessionParams.abiOverride)); - } catch (PackageParserException | IOException e) { - System.err.println("Error: Failed to parse APK file : " + e); - return 1; + if (installExternal) { + try { + ApkLite baseApk = PackageParser.parseApkLite(file, 0); + PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null); + params.sessionParams.setSize( + PackageHelper.calculateInstalledSize(pkgLite, false, + params.sessionParams.abiOverride)); + } catch (PackageParserException | IOException e) { + System.err.println("Error: Failed to parse APK file : " + e); + return 1; + } + } else { + params.sessionParams.setSize(file.length()); } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index e18d4e011d97..3bfa6b880315 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -143,17 +143,24 @@ class PackageManagerShellCommand extends ShellCommand { final PrintWriter pw = getOutPrintWriter(); final InstallParams params = makeInstallParams(); final String inPath = getNextArg(); + boolean installExternal = + (params.sessionParams.installFlags & PackageManager.INSTALL_EXTERNAL) != 0; if (params.sessionParams.sizeBytes < 0 && inPath != null) { File file = new File(inPath); if (file.isFile()) { - try { - ApkLite baseApk = PackageParser.parseApkLite(file, 0); - PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null); - params.sessionParams.setSize( - PackageHelper.calculateInstalledSize(pkgLite,false, params.sessionParams.abiOverride)); - } catch (PackageParserException | IOException e) { - pw.println("Error: Failed to parse APK file : " + e); - return 1; + if (installExternal) { + try { + ApkLite baseApk = PackageParser.parseApkLite(file, 0); + PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null); + params.sessionParams.setSize( + PackageHelper.calculateInstalledSize(pkgLite, false, + params.sessionParams.abiOverride)); + } catch (PackageParserException | IOException e) { + pw.println("Error: Failed to parse APK file : " + e); + return 1; + } + } else { + params.sessionParams.setSize(file.length()); } } } -- 2.11.0