Replace mk_payload with a Java utility
mk_payload was used to create a microdroid's payload metadata blob. It
was too verbose and inefficient to do it via external host tool
(mk_payload).
Bug: 269409253
Test: atest MicrodroidHostTestCases
Change-Id: Ic898e1958be528df2996fe2edb77b4c0b23f04fb
diff --git a/microdroid/payload/Android.bp b/microdroid/payload/Android.bp
index f77c037..da4e09d 100644
--- a/microdroid/payload/Android.bp
+++ b/microdroid/payload/Android.bp
@@ -36,6 +36,17 @@
],
}
+java_library_host {
+ name: "microdroid_payload_metadata",
+ srcs: [
+ "src/**/*.java",
+ "metadata.proto",
+ ],
+ proto: {
+ type: "lite",
+ },
+}
+
cc_binary_host {
name: "mk_payload",
srcs: [
diff --git a/microdroid/payload/metadata.proto b/microdroid/payload/metadata.proto
index c74c23b..6b999af 100644
--- a/microdroid/payload/metadata.proto
+++ b/microdroid/payload/metadata.proto
@@ -18,6 +18,9 @@
package android.microdroid;
+option java_package = "com.android.virt";
+option java_outer_classname = "PayloadMetadataProtos";
+
// Metadata is the body of the "metadata" partition
message Metadata {
uint32 version = 1;
diff --git a/microdroid/payload/src/com/android/virt/PayloadMetadata.java b/microdroid/payload/src/com/android/virt/PayloadMetadata.java
new file mode 100644
index 0000000..c2f0a7f
--- /dev/null
+++ b/microdroid/payload/src/com/android/virt/PayloadMetadata.java
@@ -0,0 +1,49 @@
+package com.android.virt;
+
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/** Provides utility to create/read/write PayloadMetadata */
+public class PayloadMetadata {
+ public static void write(PayloadMetadataProtos.Metadata metadata, File file)
+ throws IOException {
+ byte[] message = metadata.toByteArray();
+
+ try (DataOutputStream os = new DataOutputStream(new FileOutputStream(file))) {
+ // write length prefix (4-byte, big-endian)
+ os.writeInt(message.length);
+ // write the message
+ os.write(message);
+ }
+ }
+
+ public static PayloadMetadataProtos.Metadata metadata(
+ String configPath,
+ PayloadMetadataProtos.ApkPayload apk,
+ Iterable<? extends PayloadMetadataProtos.ApexPayload> apexes) {
+ return PayloadMetadataProtos.Metadata.newBuilder()
+ .setVersion(1)
+ .setConfigPath(configPath)
+ .setApk(apk)
+ .addAllApexes(apexes)
+ .build();
+ }
+
+ public static PayloadMetadataProtos.ApkPayload apk(String name) {
+ return PayloadMetadataProtos.ApkPayload.newBuilder()
+ .setName(name)
+ .setPayloadPartitionName("microdroid-apk")
+ .setIdsigPartitionName("microdroid-apk-idsig")
+ .build();
+ }
+
+ public static PayloadMetadataProtos.ApexPayload apex(String name) {
+ return PayloadMetadataProtos.ApexPayload.newBuilder()
+ .setName(name)
+ .setIsFactory(true)
+ .setPartitionName(name)
+ .build();
+ }
+}
diff --git a/tests/hostside/Android.bp b/tests/hostside/Android.bp
index 046a9d6..f1e5054 100644
--- a/tests/hostside/Android.bp
+++ b/tests/hostside/Android.bp
@@ -37,6 +37,7 @@
"MicrodroidHostTestHelper",
"compatibility-host-util",
"cts-statsd-atom-host-test-utils",
+ "microdroid_payload_metadata",
],
per_testcase_directory: true,
data: [
@@ -57,7 +58,6 @@
"initrd_bootconfig",
"lpmake",
"lpunpack",
- "mk_payload",
"sign_virt_apex",
"simg2img",
],
diff --git a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
index 726fb4a..0be6a62 100644
--- a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
+++ b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
@@ -50,6 +50,7 @@
import com.android.tradefed.util.FileUtil;
import com.android.tradefed.util.RunUtil;
import com.android.tradefed.util.xml.AbstractXmlParser;
+import com.android.virt.PayloadMetadata;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -133,42 +134,14 @@
private void createPayloadMetadata(List<ActiveApexInfo> apexes, File payloadMetadata)
throws Exception {
- // mk_payload's config
- File configFile = new File(payloadMetadata.getParentFile(), "payload_config.json");
- JSONObject config = new JSONObject();
- config.put(
- "apk",
- new JSONObject(Map.of("name", "microdroid-apk", "path", "", "idsig_path", "")));
- config.put("payload_config_path", "/mnt/apk/assets/vm_config.json");
- config.put(
- "apexes",
- new JSONArray(
+ PayloadMetadata.write(
+ PayloadMetadata.metadata(
+ "/mnt/apk/assets/vm_config.json",
+ PayloadMetadata.apk("microdroid-apk"),
apexes.stream()
- .map(apex -> new JSONObject(Map.of("name", apex.name, "path", "")))
- .collect(toList())));
- FileUtil.writeToFile(config.toString(), configFile);
-
- RunUtil runUtil = new RunUtil();
- String command =
- String.join(
- " ",
- findTestFile("mk_payload").getAbsolutePath(),
- "--metadata-only",
- configFile.getAbsolutePath(),
- payloadMetadata.getAbsolutePath());
- // mk_payload should run fast enough
- CommandResult result = runUtil.runTimedCmd(5000, "/bin/bash", "-c", command);
- String out = result.getStdout();
- String err = result.getStderr();
- assertWithMessage(
- "creating payload metadata failed:\n\tout: "
- + out
- + "\n\terr: "
- + err
- + "\n")
- .about(command_results())
- .that(result)
- .isSuccess();
+ .map(apex -> PayloadMetadata.apex(apex.name))
+ .collect(toList())),
+ payloadMetadata);
}
private void resignVirtApex(