Merge "Better error reporting for storage failures."
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 9db9837..8024d41 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -23,7 +23,6 @@
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION;
import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION_GROUP;
-import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
@@ -1420,9 +1419,7 @@
}
if (!isApex) {
- if (!doRenameLI(args, res.mReturnCode, parsedPackage)) {
- throw new PrepareFailure(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Failed rename");
- }
+ doRenameLI(args, res.mReturnCode, res.mReturnMsg, parsedPackage);
try {
setUpFsVerityIfPossible(parsedPackage);
@@ -1689,19 +1686,20 @@
* scanned package should be updated to reflect the rename.
*/
@GuardedBy("mPm.mInstallLock")
- private boolean doRenameLI(InstallArgs args, int status, ParsedPackage parsedPackage) {
+ private void doRenameLI(InstallArgs args, int status, String statusMsg,
+ ParsedPackage parsedPackage) throws PrepareFailure {
if (args.mMoveInfo != null) {
if (status != PackageManager.INSTALL_SUCCEEDED) {
mRemovePackageHelper.cleanUpForMoveInstall(args.mMoveInfo.mToUuid,
args.mMoveInfo.mPackageName, args.mMoveInfo.mFromCodePath);
- return false;
+ throw new PrepareFailure(status, statusMsg);
}
- return true;
+ return;
}
// For file installations
if (status != PackageManager.INSTALL_SUCCEEDED) {
mRemovePackageHelper.removeCodePath(args.mCodeFile);
- return false;
+ throw new PrepareFailure(status, statusMsg);
}
final File targetDir = resolveTargetDir(args);
@@ -1723,12 +1721,14 @@
}
} catch (IOException | ErrnoException e) {
Slog.w(TAG, "Failed to rename", e);
- return false;
+ throw new PrepareFailure(PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE,
+ "Failed to rename");
}
if (!onIncremental && !SELinux.restoreconRecursive(afterCodeFile)) {
Slog.w(TAG, "Failed to restorecon");
- return false;
+ throw new PrepareFailure(PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
+ "Failed to restorecon");
}
// Reflect the rename internally
@@ -1739,14 +1739,13 @@
parsedPackage.setPath(afterCodeFile.getCanonicalPath());
} catch (IOException e) {
Slog.e(TAG, "Failed to get path: " + afterCodeFile, e);
- return false;
+ throw new PrepareFailure(PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
+ "Failed to get path: " + afterCodeFile);
}
parsedPackage.setBaseApkPath(FileUtils.rewriteAfterRename(beforeCodeFile,
afterCodeFile, parsedPackage.getBaseApkPath()));
parsedPackage.setSplitCodePaths(FileUtils.rewriteAfterRename(beforeCodeFile,
afterCodeFile, parsedPackage.getSplitCodePaths()));
-
- return true;
}
// TODO(b/168126411): Once staged install flow starts using the same folder as non-staged