Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +7 −3 Original line number Diff line number Diff line Loading @@ -2050,6 +2050,7 @@ final class InstallPackageHelper { } } final String packageName = pkg.getPackageName(); for (Map.Entry<String, String> entry : fsverityCandidates.entrySet()) { final String filePath = entry.getKey(); final String signaturePath = entry.getValue(); Loading Loading @@ -2077,10 +2078,13 @@ final class InstallPackageHelper { try { // A file may already have fs-verity, e.g. when reused during a split // install. If the measurement succeeds, no need to attempt to set up. mPm.mInstaller.assertFsverityRootHashMatches(filePath, rootHash); mPm.mInstaller.assertFsverityRootHashMatches(packageName, filePath, rootHash); } catch (Installer.InstallerException e) { mPm.mInstaller.installApkVerity(filePath, fd, result.getContentSize()); mPm.mInstaller.assertFsverityRootHashMatches(filePath, rootHash); mPm.mInstaller.installApkVerity(packageName, filePath, fd, result.getContentSize()); mPm.mInstaller.assertFsverityRootHashMatches(packageName, filePath, rootHash); } } finally { IoUtils.closeQuietly(fd); Loading services/core/java/com/android/server/pm/Installer.java +36 −18 Original line number Diff line number Diff line Loading @@ -497,7 +497,7 @@ public class Installer extends SystemService { * * @throws InstallerException if {@code dexopt} fails. */ public boolean dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet, public boolean dexopt(String apkPath, int uid, String pkgName, String instructionSet, int dexoptNeeded, @Nullable String outputPath, int dexFlags, String compilerFilter, @Nullable String volumeUuid, @Nullable String classLoaderContext, @Nullable String seInfo, boolean downgrade, int targetSdkVersion, Loading Loading @@ -585,11 +585,14 @@ public class Installer extends SystemService { } } public void rmPackageDir(String packageDir) throws InstallerException { /** * Remove a directory belonging to a package. */ public void rmPackageDir(String packageName, String packageDir) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(packageDir); try { mInstalld.rmPackageDir(packageDir); mInstalld.rmPackageDir(packageName, packageDir); } catch (Exception e) { throw InstallerException.from(e); } Loading Loading @@ -662,35 +665,44 @@ public class Installer extends SystemService { } } public void createOatDir(String oatDir, String dexInstructionSet) /** * Creates an oat dir for given package and instruction set. */ public void createOatDir(String packageName, String oatDir, String dexInstructionSet) throws InstallerException { if (!checkBeforeRemote()) return; try { mInstalld.createOatDir(oatDir, dexInstructionSet); mInstalld.createOatDir(packageName, oatDir, dexInstructionSet); } catch (Exception e) { throw InstallerException.from(e); } } public void linkFile(String relativePath, String fromBase, String toBase) /** * Creates a hardlink for a path. */ public void linkFile(String packageName, String relativePath, String fromBase, String toBase) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(fromBase); BlockGuard.getVmPolicy().onPathAccess(toBase); try { mInstalld.linkFile(relativePath, fromBase, toBase); mInstalld.linkFile(packageName, relativePath, fromBase, toBase); } catch (Exception e) { throw InstallerException.from(e); } } public void moveAb(String apkPath, String instructionSet, String outputPath) /** * Moves oat/vdex/art from "B" set defined by ro.boot.slot_suffix to the default set. */ public void moveAb(String packageName, String apkPath, String instructionSet, String outputPath) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(apkPath); BlockGuard.getVmPolicy().onPathAccess(outputPath); try { mInstalld.moveAb(apkPath, instructionSet, outputPath); mInstalld.moveAb(packageName, apkPath, instructionSet, outputPath); } catch (Exception e) { throw InstallerException.from(e); } Loading @@ -700,35 +712,41 @@ public class Installer extends SystemService { * Deletes the optimized artifacts generated by ART and returns the number * of freed bytes. */ public long deleteOdex(String apkPath, String instructionSet, String outputPath) throws InstallerException { public long deleteOdex(String packageName, String apkPath, String instructionSet, String outputPath) throws InstallerException { if (!checkBeforeRemote()) return -1; BlockGuard.getVmPolicy().onPathAccess(apkPath); BlockGuard.getVmPolicy().onPathAccess(outputPath); try { return mInstalld.deleteOdex(apkPath, instructionSet, outputPath); return mInstalld.deleteOdex(packageName, apkPath, instructionSet, outputPath); } catch (Exception e) { throw InstallerException.from(e); } } public void installApkVerity(String filePath, FileDescriptor verityInput, int contentSize) throws InstallerException { /** * Enables legacy apk-verity for an apk. */ public void installApkVerity(String packageName, String filePath, FileDescriptor verityInput, int contentSize) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(filePath); try { mInstalld.installApkVerity(filePath, verityInput, contentSize); mInstalld.installApkVerity(packageName, filePath, verityInput, contentSize); } catch (Exception e) { throw InstallerException.from(e); } } public void assertFsverityRootHashMatches(String filePath, @NonNull byte[] expectedHash) throws InstallerException { /** * Checks if provided hash matches the file's fs-verity merkle tree root hash. */ public void assertFsverityRootHashMatches(String packageName, String filePath, @NonNull byte[] expectedHash) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(filePath); try { mInstalld.assertFsverityRootHashMatches(filePath, expectedHash); mInstalld.assertFsverityRootHashMatches(packageName, filePath, expectedHash); } catch (Exception e) { throw InstallerException.from(e); } Loading services/core/java/com/android/server/pm/OtaDexoptService.java +2 −1 Original line number Diff line number Diff line Loading @@ -411,6 +411,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { final List<String> paths = AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg); final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); final String packageName = pkg.getPackageName(); for (String dexCodeInstructionSet : dexCodeInstructionSets) { for (String path : paths) { String oatDir = PackageDexOptimizer.getOatDir( Loading @@ -420,7 +421,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { packagePaths++; try { installer.moveAb(path, dexCodeInstructionSet, oatDir); installer.moveAb(packageName, path, dexCodeInstructionSet, oatDir); pathsSuccessful++; } catch (InstallerException e) { } Loading services/core/java/com/android/server/pm/PackageInstallerSession.java +12 −9 Original line number Diff line number Diff line Loading @@ -2402,6 +2402,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { final List<File> fromFiles = mResolvedInheritedFiles; final File toDir = stageDir; final String tempPackageName = toDir.getName(); if (LOGD) Slog.d(TAG, "Inherited files: " + mResolvedInheritedFiles); if (!mResolvedInheritedFiles.isEmpty() && mInheritedFilesBase == null) { Loading @@ -2411,7 +2412,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (isLinkPossible(fromFiles, toDir)) { if (!mResolvedInstructionSets.isEmpty()) { final File oatDir = new File(toDir, "oat"); createOatDirs(mResolvedInstructionSets, oatDir); createOatDirs(tempPackageName, mResolvedInstructionSets, oatDir); } // pre-create lib dirs for linking if necessary if (!mResolvedNativeLibPaths.isEmpty()) { Loading @@ -2434,7 +2435,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { new File(libDir, archDirPath)); } } linkFiles(fromFiles, toDir, mInheritedFilesBase); linkFiles(tempPackageName, fromFiles, toDir, mInheritedFilesBase); } else { // TODO: this should delegate to DCS so the system process // avoids holding open FDs into containers. Loading Loading @@ -3529,18 +3530,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { throw new IOException("File: " + pathStr + " outside base: " + baseStr); } private void createOatDirs(List<String> instructionSets, File fromDir) private void createOatDirs(String packageName, List<String> instructionSets, File fromDir) throws PackageManagerException { for (String instructionSet : instructionSets) { try { mInstaller.createOatDir(fromDir.getAbsolutePath(), instructionSet); mInstaller.createOatDir(packageName, fromDir.getAbsolutePath(), instructionSet); } catch (InstallerException e) { throw PackageManagerException.from(e); } } } private void linkFile(String relativePath, String fromBase, String toBase) throws IOException { private void linkFile(String packageName, String relativePath, String fromBase, String toBase) throws IOException { try { // Try final IncrementalFileStorages incrementalFileStorages = getIncrementalFileStorages(); Loading @@ -3548,21 +3550,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fromBase, toBase)) { return; } mInstaller.linkFile(relativePath, fromBase, toBase); mInstaller.linkFile(packageName, relativePath, fromBase, toBase); } catch (InstallerException | IOException e) { throw new IOException("failed linkOrCreateDir(" + relativePath + ", " + fromBase + ", " + toBase + ")", e); } } private void linkFiles(List<File> fromFiles, File toDir, File fromDir) private void linkFiles(String packageName, List<File> fromFiles, File toDir, File fromDir) throws IOException { for (File fromFile : fromFiles) { final String relativePath = getRelativePath(fromFile, fromDir); final String fromBase = fromDir.getAbsolutePath(); final String toBase = toDir.getAbsolutePath(); linkFile(relativePath, fromBase, toBase); linkFile(packageName, relativePath, fromBase, toBase); } Slog.d(TAG, "Linked " + fromFiles.size() + " files into " + toDir); Loading Loading @@ -4299,7 +4301,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { incrementalFileStorages.cleanUpAndMarkComplete(); } if (stageDir != null) { mInstaller.rmPackageDir(stageDir.getAbsolutePath()); final String tempPackageName = stageDir.getName(); mInstaller.rmPackageDir(tempPackageName, stageDir.getAbsolutePath()); } } catch (InstallerException ignored) { } Loading services/core/java/com/android/server/pm/RemovePackageHelper.java +3 −2 Original line number Diff line number Diff line Loading @@ -94,9 +94,10 @@ final class RemovePackageHelper { } } mInstaller.rmPackageDir(codePath.getAbsolutePath()); final String packageName = codePath.getName(); mInstaller.rmPackageDir(packageName, codePath.getAbsolutePath()); if (needRemoveParent) { mInstaller.rmPackageDir(codePathParent.getAbsolutePath()); mInstaller.rmPackageDir(packageName, codePathParent.getAbsolutePath()); removeCachedResult(codePathParent); } } catch (Installer.InstallerException e) { Loading Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +7 −3 Original line number Diff line number Diff line Loading @@ -2050,6 +2050,7 @@ final class InstallPackageHelper { } } final String packageName = pkg.getPackageName(); for (Map.Entry<String, String> entry : fsverityCandidates.entrySet()) { final String filePath = entry.getKey(); final String signaturePath = entry.getValue(); Loading Loading @@ -2077,10 +2078,13 @@ final class InstallPackageHelper { try { // A file may already have fs-verity, e.g. when reused during a split // install. If the measurement succeeds, no need to attempt to set up. mPm.mInstaller.assertFsverityRootHashMatches(filePath, rootHash); mPm.mInstaller.assertFsverityRootHashMatches(packageName, filePath, rootHash); } catch (Installer.InstallerException e) { mPm.mInstaller.installApkVerity(filePath, fd, result.getContentSize()); mPm.mInstaller.assertFsverityRootHashMatches(filePath, rootHash); mPm.mInstaller.installApkVerity(packageName, filePath, fd, result.getContentSize()); mPm.mInstaller.assertFsverityRootHashMatches(packageName, filePath, rootHash); } } finally { IoUtils.closeQuietly(fd); Loading
services/core/java/com/android/server/pm/Installer.java +36 −18 Original line number Diff line number Diff line Loading @@ -497,7 +497,7 @@ public class Installer extends SystemService { * * @throws InstallerException if {@code dexopt} fails. */ public boolean dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet, public boolean dexopt(String apkPath, int uid, String pkgName, String instructionSet, int dexoptNeeded, @Nullable String outputPath, int dexFlags, String compilerFilter, @Nullable String volumeUuid, @Nullable String classLoaderContext, @Nullable String seInfo, boolean downgrade, int targetSdkVersion, Loading Loading @@ -585,11 +585,14 @@ public class Installer extends SystemService { } } public void rmPackageDir(String packageDir) throws InstallerException { /** * Remove a directory belonging to a package. */ public void rmPackageDir(String packageName, String packageDir) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(packageDir); try { mInstalld.rmPackageDir(packageDir); mInstalld.rmPackageDir(packageName, packageDir); } catch (Exception e) { throw InstallerException.from(e); } Loading Loading @@ -662,35 +665,44 @@ public class Installer extends SystemService { } } public void createOatDir(String oatDir, String dexInstructionSet) /** * Creates an oat dir for given package and instruction set. */ public void createOatDir(String packageName, String oatDir, String dexInstructionSet) throws InstallerException { if (!checkBeforeRemote()) return; try { mInstalld.createOatDir(oatDir, dexInstructionSet); mInstalld.createOatDir(packageName, oatDir, dexInstructionSet); } catch (Exception e) { throw InstallerException.from(e); } } public void linkFile(String relativePath, String fromBase, String toBase) /** * Creates a hardlink for a path. */ public void linkFile(String packageName, String relativePath, String fromBase, String toBase) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(fromBase); BlockGuard.getVmPolicy().onPathAccess(toBase); try { mInstalld.linkFile(relativePath, fromBase, toBase); mInstalld.linkFile(packageName, relativePath, fromBase, toBase); } catch (Exception e) { throw InstallerException.from(e); } } public void moveAb(String apkPath, String instructionSet, String outputPath) /** * Moves oat/vdex/art from "B" set defined by ro.boot.slot_suffix to the default set. */ public void moveAb(String packageName, String apkPath, String instructionSet, String outputPath) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(apkPath); BlockGuard.getVmPolicy().onPathAccess(outputPath); try { mInstalld.moveAb(apkPath, instructionSet, outputPath); mInstalld.moveAb(packageName, apkPath, instructionSet, outputPath); } catch (Exception e) { throw InstallerException.from(e); } Loading @@ -700,35 +712,41 @@ public class Installer extends SystemService { * Deletes the optimized artifacts generated by ART and returns the number * of freed bytes. */ public long deleteOdex(String apkPath, String instructionSet, String outputPath) throws InstallerException { public long deleteOdex(String packageName, String apkPath, String instructionSet, String outputPath) throws InstallerException { if (!checkBeforeRemote()) return -1; BlockGuard.getVmPolicy().onPathAccess(apkPath); BlockGuard.getVmPolicy().onPathAccess(outputPath); try { return mInstalld.deleteOdex(apkPath, instructionSet, outputPath); return mInstalld.deleteOdex(packageName, apkPath, instructionSet, outputPath); } catch (Exception e) { throw InstallerException.from(e); } } public void installApkVerity(String filePath, FileDescriptor verityInput, int contentSize) throws InstallerException { /** * Enables legacy apk-verity for an apk. */ public void installApkVerity(String packageName, String filePath, FileDescriptor verityInput, int contentSize) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(filePath); try { mInstalld.installApkVerity(filePath, verityInput, contentSize); mInstalld.installApkVerity(packageName, filePath, verityInput, contentSize); } catch (Exception e) { throw InstallerException.from(e); } } public void assertFsverityRootHashMatches(String filePath, @NonNull byte[] expectedHash) throws InstallerException { /** * Checks if provided hash matches the file's fs-verity merkle tree root hash. */ public void assertFsverityRootHashMatches(String packageName, String filePath, @NonNull byte[] expectedHash) throws InstallerException { if (!checkBeforeRemote()) return; BlockGuard.getVmPolicy().onPathAccess(filePath); try { mInstalld.assertFsverityRootHashMatches(filePath, expectedHash); mInstalld.assertFsverityRootHashMatches(packageName, filePath, expectedHash); } catch (Exception e) { throw InstallerException.from(e); } Loading
services/core/java/com/android/server/pm/OtaDexoptService.java +2 −1 Original line number Diff line number Diff line Loading @@ -411,6 +411,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { final List<String> paths = AndroidPackageUtils.getAllCodePathsExcludingResourceOnly(pkg); final String[] dexCodeInstructionSets = getDexCodeInstructionSets(instructionSets); final String packageName = pkg.getPackageName(); for (String dexCodeInstructionSet : dexCodeInstructionSets) { for (String path : paths) { String oatDir = PackageDexOptimizer.getOatDir( Loading @@ -420,7 +421,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { packagePaths++; try { installer.moveAb(path, dexCodeInstructionSet, oatDir); installer.moveAb(packageName, path, dexCodeInstructionSet, oatDir); pathsSuccessful++; } catch (InstallerException e) { } Loading
services/core/java/com/android/server/pm/PackageInstallerSession.java +12 −9 Original line number Diff line number Diff line Loading @@ -2402,6 +2402,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { try { final List<File> fromFiles = mResolvedInheritedFiles; final File toDir = stageDir; final String tempPackageName = toDir.getName(); if (LOGD) Slog.d(TAG, "Inherited files: " + mResolvedInheritedFiles); if (!mResolvedInheritedFiles.isEmpty() && mInheritedFilesBase == null) { Loading @@ -2411,7 +2412,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (isLinkPossible(fromFiles, toDir)) { if (!mResolvedInstructionSets.isEmpty()) { final File oatDir = new File(toDir, "oat"); createOatDirs(mResolvedInstructionSets, oatDir); createOatDirs(tempPackageName, mResolvedInstructionSets, oatDir); } // pre-create lib dirs for linking if necessary if (!mResolvedNativeLibPaths.isEmpty()) { Loading @@ -2434,7 +2435,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { new File(libDir, archDirPath)); } } linkFiles(fromFiles, toDir, mInheritedFilesBase); linkFiles(tempPackageName, fromFiles, toDir, mInheritedFilesBase); } else { // TODO: this should delegate to DCS so the system process // avoids holding open FDs into containers. Loading Loading @@ -3529,18 +3530,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { throw new IOException("File: " + pathStr + " outside base: " + baseStr); } private void createOatDirs(List<String> instructionSets, File fromDir) private void createOatDirs(String packageName, List<String> instructionSets, File fromDir) throws PackageManagerException { for (String instructionSet : instructionSets) { try { mInstaller.createOatDir(fromDir.getAbsolutePath(), instructionSet); mInstaller.createOatDir(packageName, fromDir.getAbsolutePath(), instructionSet); } catch (InstallerException e) { throw PackageManagerException.from(e); } } } private void linkFile(String relativePath, String fromBase, String toBase) throws IOException { private void linkFile(String packageName, String relativePath, String fromBase, String toBase) throws IOException { try { // Try final IncrementalFileStorages incrementalFileStorages = getIncrementalFileStorages(); Loading @@ -3548,21 +3550,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { fromBase, toBase)) { return; } mInstaller.linkFile(relativePath, fromBase, toBase); mInstaller.linkFile(packageName, relativePath, fromBase, toBase); } catch (InstallerException | IOException e) { throw new IOException("failed linkOrCreateDir(" + relativePath + ", " + fromBase + ", " + toBase + ")", e); } } private void linkFiles(List<File> fromFiles, File toDir, File fromDir) private void linkFiles(String packageName, List<File> fromFiles, File toDir, File fromDir) throws IOException { for (File fromFile : fromFiles) { final String relativePath = getRelativePath(fromFile, fromDir); final String fromBase = fromDir.getAbsolutePath(); final String toBase = toDir.getAbsolutePath(); linkFile(relativePath, fromBase, toBase); linkFile(packageName, relativePath, fromBase, toBase); } Slog.d(TAG, "Linked " + fromFiles.size() + " files into " + toDir); Loading Loading @@ -4299,7 +4301,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { incrementalFileStorages.cleanUpAndMarkComplete(); } if (stageDir != null) { mInstaller.rmPackageDir(stageDir.getAbsolutePath()); final String tempPackageName = stageDir.getName(); mInstaller.rmPackageDir(tempPackageName, stageDir.getAbsolutePath()); } } catch (InstallerException ignored) { } Loading
services/core/java/com/android/server/pm/RemovePackageHelper.java +3 −2 Original line number Diff line number Diff line Loading @@ -94,9 +94,10 @@ final class RemovePackageHelper { } } mInstaller.rmPackageDir(codePath.getAbsolutePath()); final String packageName = codePath.getName(); mInstaller.rmPackageDir(packageName, codePath.getAbsolutePath()); if (needRemoveParent) { mInstaller.rmPackageDir(codePathParent.getAbsolutePath()); mInstaller.rmPackageDir(packageName, codePathParent.getAbsolutePath()); removeCachedResult(codePathParent); } } catch (Installer.InstallerException e) { Loading