Incremental install via adb.
- passing V4 signature to IncFS,
- cleanup and use InstallationFile everywhere,
- pass params to DataLoader creation,
- minor refactor for PackageManagerShellCommandDataLoader to prepare for
Incremental data loading.
Test: atest PackageManagerShellCommandTest
Bug: b/136132412 b/133435829
Change-Id: Iacc3e4c51c0fa3410b076147ce153a1303246189
diff --git a/services/core/java/com/android/server/incremental/IncrementalManagerShellCommand.java b/services/core/java/com/android/server/incremental/IncrementalManagerShellCommand.java
index b0e2e64..6a5e963 100644
--- a/services/core/java/com/android/server/incremental/IncrementalManagerShellCommand.java
+++ b/services/core/java/com/android/server/incremental/IncrementalManagerShellCommand.java
@@ -16,9 +16,7 @@
package com.android.server.incremental;
-import static android.content.pm.InstallationFile.FILE_TYPE_OBB;
import static android.content.pm.PackageInstaller.LOCATION_DATA_APP;
-import static android.content.pm.PackageInstaller.LOCATION_MEDIA_OBB;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -183,10 +181,8 @@
session = packageInstaller.openSession(sessionId);
for (int i = 0; i < numFiles; i++) {
InstallationFile file = installationFiles.get(i);
- final int location = file.getFileType() == FILE_TYPE_OBB ? LOCATION_MEDIA_OBB
- : LOCATION_DATA_APP;
- session.addFile(location, file.getName(), file.getSize(), file.getMetadata(),
- null);
+ session.addFile(file.getLocation(), file.getName(), file.getLengthBytes(),
+ file.getMetadata(), file.getSignature());
}
session.commit(localReceiver.getIntentSender());
final Intent result = localReceiver.getResult();
@@ -304,7 +300,8 @@
}
final byte[] metadata = String.valueOf(index).getBytes(
StandardCharsets.UTF_8);
- fileList.add(new InstallationFile(name, size, metadata));
+ fileList.add(
+ new InstallationFile(LOCATION_DATA_APP, name, size, metadata, null));
break;
}
default:
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 944280d..97defcd 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -214,7 +214,7 @@
private static final String PROPERTY_NAME_INHERIT_NATIVE = "pi.inherit_native_on_dont_kill";
private static final int[] EMPTY_CHILD_SESSION_ARRAY = EmptyArray.INT;
- private static final FileInfo[] EMPTY_FILE_INFO_ARRAY = {};
+ private static final InstallationFile[] EMPTY_INSTALLATION_FILE_ARRAY = {};
private static final String SYSTEM_DATA_LOADER_PACKAGE = "android";
@@ -309,33 +309,8 @@
@GuardedBy("mLock")
private int mParentSessionId;
- static class FileInfo {
- public final int location;
- public final String name;
- public final Long lengthBytes;
- public final byte[] metadata;
- public final byte[] signature;
-
- public static FileInfo added(int location, String name, Long lengthBytes, byte[] metadata,
- byte[] signature) {
- return new FileInfo(location, name, lengthBytes, metadata, signature);
- }
-
- public static FileInfo removed(int location, String name) {
- return new FileInfo(location, name, -1L, null, null);
- }
-
- FileInfo(int location, String name, Long lengthBytes, byte[] metadata, byte[] signature) {
- this.location = location;
- this.name = name;
- this.lengthBytes = lengthBytes;
- this.metadata = metadata;
- this.signature = signature;
- }
- }
-
@GuardedBy("mLock")
- private ArrayList<FileInfo> mFiles = new ArrayList<>();
+ private ArrayList<InstallationFile> mFiles = new ArrayList<>();
@GuardedBy("mLock")
private boolean mStagedSessionApplied;
@@ -508,7 +483,7 @@
PackageSessionProvider sessionProvider, Looper looper, StagingManager stagingManager,
int sessionId, int userId, int installerUid, @NonNull InstallSource installSource,
SessionParams params, long createdMillis,
- File stageDir, String stageCid, FileInfo[] files, boolean prepared,
+ File stageDir, String stageCid, InstallationFile[] files, boolean prepared,
boolean committed, boolean sealed,
@Nullable int[] childSessionIds, int parentSessionId, boolean isReady,
boolean isFailed, boolean isApplied, int stagedSessionErrorCode,
@@ -539,7 +514,7 @@
this.mParentSessionId = parentSessionId;
if (files != null) {
- for (FileInfo file : files) {
+ for (InstallationFile file : files) {
mFiles.add(file);
}
}
@@ -738,7 +713,7 @@
String[] result = new String[mFiles.size()];
for (int i = 0, size = mFiles.size(); i < size; ++i) {
- result[i] = mFiles.get(i).name;
+ result[i] = mFiles.get(i).getName();
}
return result;
}
@@ -2425,7 +2400,7 @@
assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotSealedLocked("addFile");
- mFiles.add(FileInfo.added(location, name, lengthBytes, metadata, signature));
+ mFiles.add(new InstallationFile(location, name, lengthBytes, metadata, signature));
}
}
@@ -2443,7 +2418,7 @@
assertCallerIsOwnerOrRootLocked();
assertPreparedAndNotSealedLocked("removeFile");
- mFiles.add(FileInfo.removed(location, getRemoveMarkerName(name)));
+ mFiles.add(new InstallationFile(location, getRemoveMarkerName(name), -1, null, null));
}
}
@@ -2461,17 +2436,16 @@
}
final List<InstallationFile> addedFiles = new ArrayList<>(mFiles.size());
- for (FileInfo file : mFiles) {
- if (sAddedFilter.accept(new File(this.stageDir, file.name))) {
- addedFiles.add(new InstallationFile(
- file.name, file.lengthBytes, file.metadata));
+ for (InstallationFile file : mFiles) {
+ if (sAddedFilter.accept(new File(this.stageDir, file.getName()))) {
+ addedFiles.add(file);
}
}
final List<String> removedFiles = new ArrayList<>(mFiles.size());
- for (FileInfo file : mFiles) {
- if (sRemovedFilter.accept(new File(this.stageDir, file.name))) {
- String name = file.name.substring(
- 0, file.name.length() - REMOVE_MARKER_EXTENSION.length());
+ for (InstallationFile file : mFiles) {
+ if (sRemovedFilter.accept(new File(this.stageDir, file.getName()))) {
+ String name = file.getName().substring(
+ 0, file.getName().length() - REMOVE_MARKER_EXTENSION.length());
removedFiles.add(name);
}
}
@@ -2970,13 +2944,13 @@
writeIntAttribute(out, ATTR_SESSION_ID, childSessionId);
out.endTag(null, TAG_CHILD_SESSION);
}
- for (FileInfo fileInfo : mFiles) {
+ for (InstallationFile file : mFiles) {
out.startTag(null, TAG_SESSION_FILE);
- writeIntAttribute(out, ATTR_LOCATION, fileInfo.location);
- writeStringAttribute(out, ATTR_NAME, fileInfo.name);
- writeLongAttribute(out, ATTR_LENGTH_BYTES, fileInfo.lengthBytes);
- writeByteArrayAttribute(out, ATTR_METADATA, fileInfo.metadata);
- writeByteArrayAttribute(out, ATTR_SIGNATURE, fileInfo.signature);
+ writeIntAttribute(out, ATTR_LOCATION, file.getLocation());
+ writeStringAttribute(out, ATTR_NAME, file.getName());
+ writeLongAttribute(out, ATTR_LENGTH_BYTES, file.getLengthBytes());
+ writeByteArrayAttribute(out, ATTR_METADATA, file.getMetadata());
+ writeByteArrayAttribute(out, ATTR_SIGNATURE, file.getSignature());
out.endTag(null, TAG_SESSION_FILE);
}
}
@@ -3088,7 +3062,7 @@
List<String> grantedRuntimePermissions = new ArrayList<>();
List<String> whitelistedRestrictedPermissions = new ArrayList<>();
List<Integer> childSessionIds = new ArrayList<>();
- List<FileInfo> files = new ArrayList<>();
+ List<InstallationFile> files = new ArrayList<>();
int outerDepth = in.getDepth();
int type;
while ((type = in.next()) != XmlPullParser.END_DOCUMENT
@@ -3107,7 +3081,7 @@
childSessionIds.add(readIntAttribute(in, ATTR_SESSION_ID, SessionInfo.INVALID_ID));
}
if (TAG_SESSION_FILE.equals(in.getName())) {
- files.add(new FileInfo(
+ files.add(new InstallationFile(
readIntAttribute(in, ATTR_LOCATION, 0),
readStringAttribute(in, ATTR_NAME),
readLongAttribute(in, ATTR_LENGTH_BYTES, -1),
@@ -3135,16 +3109,16 @@
childSessionIdsArray = EMPTY_CHILD_SESSION_ARRAY;
}
- FileInfo[] fileInfosArray = null;
+ InstallationFile[] fileArray = null;
if (!files.isEmpty()) {
- fileInfosArray = files.toArray(EMPTY_FILE_INFO_ARRAY);
+ fileArray = files.toArray(EMPTY_INSTALLATION_FILE_ARRAY);
}
InstallSource installSource = InstallSource.create(installInitiatingPackageName,
installOriginatingPackageName, installerPackageName);
return new PackageInstallerSession(callback, context, pm, sessionProvider,
installerThread, stagingManager, sessionId, userId, installerUid,
- installSource, params, createdMillis, stageDir, stageCid, fileInfosArray,
+ installSource, params, createdMillis, stageDir, stageCid, fileArray,
prepared, committed, sealed, childSessionIdsArray, parentSessionId,
isReady, isFailed, isApplied, stagedSessionErrorCode, stagedSessionErrorMessage);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index cb94043..c69a62d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1163,7 +1163,7 @@
final InstallParams params = makeInstallParams();
if (params.sessionParams.dataLoaderParams == null) {
params.sessionParams.setDataLoaderParams(
- PackageManagerShellCommandDataLoader.getDataLoaderParams(this));
+ PackageManagerShellCommandDataLoader.getStreamingDataLoaderParams(this));
}
return doRunInstall(params);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java b/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
index 5dca9e1..4170be4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommandDataLoader.java
@@ -54,7 +54,7 @@
private static final String STDIN_PATH = "-";
- static DataLoaderParams getDataLoaderParams(ShellCommand shellCommand) {
+ private static String getDataLoaderParamsArgs(ShellCommand shellCommand) {
int commandId;
synchronized (sShellCommands) {
// Clean up old references.
@@ -78,8 +78,12 @@
sShellCommands.put(commandId, new WeakReference<>(shellCommand));
}
- final String args = SHELL_COMMAND_ID_PREFIX + commandId;
- return DataLoaderParams.forStreaming(new ComponentName(PACKAGE, CLASS), args);
+ return SHELL_COMMAND_ID_PREFIX + commandId;
+ }
+
+ static DataLoaderParams getStreamingDataLoaderParams(ShellCommand shellCommand) {
+ return DataLoaderParams.forStreaming(new ComponentName(PACKAGE, CLASS),
+ getDataLoaderParamsArgs(shellCommand));
}
private static int extractShellCommandId(String args) {
@@ -133,17 +137,17 @@
return false;
}
try {
- for (InstallationFile fileInfo : addedFiles) {
- String filePath = new String(fileInfo.getMetadata(), StandardCharsets.UTF_8);
+ for (InstallationFile file : addedFiles) {
+ String filePath = new String(file.getMetadata(), StandardCharsets.UTF_8);
if (STDIN_PATH.equals(filePath) || TextUtils.isEmpty(filePath)) {
final ParcelFileDescriptor inFd = ParcelFileDescriptor.dup(
shellCommand.getInFileDescriptor());
- mConnector.writeData(fileInfo.getName(), 0, fileInfo.getSize(), inFd);
+ mConnector.writeData(file.getName(), 0, file.getLengthBytes(), inFd);
} else {
ParcelFileDescriptor incomingFd = null;
try {
incomingFd = shellCommand.openFileForSystem(filePath, "r");
- mConnector.writeData(fileInfo.getName(), 0, incomingFd.getStatSize(),
+ mConnector.writeData(file.getName(), 0, incomingFd.getStatSize(),
incomingFd);
} finally {
IoUtils.closeQuietly(incomingFd);
@@ -159,7 +163,8 @@
}
@Override
- public DataLoaderService.DataLoader onCreateDataLoader() {
+ public DataLoaderService.DataLoader onCreateDataLoader(
+ @NonNull DataLoaderParams dataLoaderParams) {
return new DataLoader();
}
}
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index 2444dde..2e7ced3 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -122,7 +122,6 @@
}
RawMetadata getMetadata(StorageId storage, FileId node) const;
- std::string getSignatureData(StorageId storage, FileId node) const;
std::vector<std::string> listFiles(StorageId storage) const;
bool startLoading(StorageId storage) const;