Merge "updater_sample: Add streaming to PayloadSpec"
This commit is contained in:
@@ -1,18 +1,18 @@
|
|||||||
{
|
{
|
||||||
"__name": "name will be visible on UI",
|
"__name": "name will be visible on UI",
|
||||||
"__url": "https:// or file:// uri to update file (zip, xz, ...)",
|
"__url": "https:// or file:// uri to update package (zip, xz, ...)",
|
||||||
"__type": "NON_STREAMING (from local file) OR STREAMING (on the fly)",
|
"__type": "NON_STREAMING (from a local file) OR STREAMING (on the fly)",
|
||||||
"name": "SAMPLE-cake-release BUILD-12345",
|
"name": "SAMPLE-cake-release BUILD-12345",
|
||||||
"url": "file:///data/builds/android-update.zip",
|
"url": "http://foo.bar/builds/ota-001.zip",
|
||||||
"type": "NON_STREAMING",
|
"ab_install_type": "NON_STREAMING",
|
||||||
"streaming_metadata": {
|
"ab_streaming_metadata": {
|
||||||
"__": "streaming_metadata is required only for streaming update",
|
"__": "streaming_metadata is required only for streaming update",
|
||||||
"__property_files": "name, offset and size of files",
|
"__property_files": "name, offset and size of files",
|
||||||
"property_files": [
|
"property_files": [
|
||||||
{
|
{
|
||||||
"__filename": "payload.bin and payload_properties.txt are required",
|
"__filename": "name of the file in package",
|
||||||
"__offset": "defines beginning of update data in archive",
|
"__offset": "defines beginning of the file in package",
|
||||||
"__size": "size of the update data in archive",
|
"__size": "size of the file in package",
|
||||||
"filename": "payload.bin",
|
"filename": "payload.bin",
|
||||||
"offset": 531,
|
"offset": 531,
|
||||||
"size": 5012323
|
"size": 5012323
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ public class MainActivity extends Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class to delegate UpdateEngine callbacks to MainActivity
|
* Helper class to delegate {@code update_engine} callbacks to MainActivity
|
||||||
*/
|
*/
|
||||||
class UpdateEngineCallbackImpl extends UpdateEngineCallback {
|
class UpdateEngineCallbackImpl extends UpdateEngineCallback {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+22
-5
@@ -16,13 +16,30 @@
|
|||||||
|
|
||||||
package com.example.android.systemupdatersample.util;
|
package com.example.android.systemupdatersample.util;
|
||||||
|
|
||||||
/** Utility class for property files in a package. */
|
/** Utility class for an OTA package. */
|
||||||
public final class PackagePropertyFiles {
|
public final class PackageFiles {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Directory used to perform updates.
|
||||||
|
*/
|
||||||
|
public static final String OTA_PACKAGE_DIR = "/data/ota_package";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update payload, it will be passed to {@code UpdateEngine#applyPayload}.
|
||||||
|
*/
|
||||||
public static final String PAYLOAD_BINARY_FILE_NAME = "payload.bin";
|
public static final String PAYLOAD_BINARY_FILE_NAME = "payload.bin";
|
||||||
|
|
||||||
public static final String PAYLOAD_HEADER_FILE_NAME = "payload_header.bin";
|
/**
|
||||||
|
* Currently, when calling {@code UpdateEngine#applyPayload} to perform actions
|
||||||
|
* that don't require network access (e.g. change slot), update_engine still
|
||||||
|
* talks to the server to download/verify file.
|
||||||
|
* {@code update_engine} might throw error when rebooting if {@code UpdateEngine#applyPayload}
|
||||||
|
* is not supplied right headers and tokens.
|
||||||
|
* This behavior might change in future android versions.
|
||||||
|
*
|
||||||
|
* To avoid extra network request in {@code update_engine}, this file has to be
|
||||||
|
* downloaded and put in {@code OTA_PACKAGE_DIR}.
|
||||||
|
*/
|
||||||
public static final String PAYLOAD_METADATA_FILE_NAME = "payload_metadata.bin";
|
public static final String PAYLOAD_METADATA_FILE_NAME = "payload_metadata.bin";
|
||||||
|
|
||||||
public static final String PAYLOAD_PROPERTIES_FILE_NAME = "payload_properties.txt";
|
public static final String PAYLOAD_PROPERTIES_FILE_NAME = "payload_properties.txt";
|
||||||
@@ -38,5 +55,5 @@ public final class PackagePropertyFiles {
|
|||||||
*/
|
*/
|
||||||
public static final String COMPATIBILITY_ZIP_FILE_NAME = "compatibility.zip";
|
public static final String COMPATIBILITY_ZIP_FILE_NAME = "compatibility.zip";
|
||||||
|
|
||||||
private PackagePropertyFiles() {}
|
private PackageFiles() {}
|
||||||
}
|
}
|
||||||
@@ -16,9 +16,6 @@
|
|||||||
|
|
||||||
package com.example.android.systemupdatersample.util;
|
package com.example.android.systemupdatersample.util;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
import com.example.android.systemupdatersample.PayloadSpec;
|
import com.example.android.systemupdatersample.PayloadSpec;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@@ -26,6 +23,7 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.file.Files;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
@@ -34,7 +32,6 @@ import java.util.zip.ZipEntry;
|
|||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
/** The helper class that creates {@link PayloadSpec}. */
|
/** The helper class that creates {@link PayloadSpec}. */
|
||||||
@TargetApi(Build.VERSION_CODES.N)
|
|
||||||
public final class PayloadSpecs {
|
public final class PayloadSpecs {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,14 +65,14 @@ public final class PayloadSpecs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long length = entry.getCompressedSize();
|
long length = entry.getCompressedSize();
|
||||||
if (PackagePropertyFiles.PAYLOAD_BINARY_FILE_NAME.equals(name)) {
|
if (PackageFiles.PAYLOAD_BINARY_FILE_NAME.equals(name)) {
|
||||||
if (entry.getMethod() != ZipEntry.STORED) {
|
if (entry.getMethod() != ZipEntry.STORED) {
|
||||||
throw new IOException("Invalid compression method.");
|
throw new IOException("Invalid compression method.");
|
||||||
}
|
}
|
||||||
payloadFound = true;
|
payloadFound = true;
|
||||||
payloadOffset = offset;
|
payloadOffset = offset;
|
||||||
payloadSize = length;
|
payloadSize = length;
|
||||||
} else if (PackagePropertyFiles.PAYLOAD_PROPERTIES_FILE_NAME.equals(name)) {
|
} else if (PackageFiles.PAYLOAD_PROPERTIES_FILE_NAME.equals(name)) {
|
||||||
InputStream inputStream = zip.getInputStream(entry);
|
InputStream inputStream = zip.getInputStream(entry);
|
||||||
if (inputStream != null) {
|
if (inputStream != null) {
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
|
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
|
||||||
@@ -100,6 +97,21 @@ public final class PayloadSpecs {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link PayloadSpec} for streaming update.
|
||||||
|
*/
|
||||||
|
public static PayloadSpec forStreaming(String updateUrl,
|
||||||
|
long offset,
|
||||||
|
long size,
|
||||||
|
File propertiesFile) throws IOException {
|
||||||
|
return PayloadSpec.newBuilder()
|
||||||
|
.url(updateUrl)
|
||||||
|
.offset(offset)
|
||||||
|
.size(size)
|
||||||
|
.properties(Files.readAllLines(propertiesFile.toPath()))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts an {@link PayloadSpec} to a string.
|
* Converts an {@link PayloadSpec} to a string.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
@@ -50,6 +50,7 @@ public final class UpdateEngineErrorCodes {
|
|||||||
CODE_TO_NAME_MAP.put(10, "PAYLOAD_HASH_MISMATCH_ERROR");
|
CODE_TO_NAME_MAP.put(10, "PAYLOAD_HASH_MISMATCH_ERROR");
|
||||||
CODE_TO_NAME_MAP.put(11, "PAYLOAD_SIZE_MISMATCH_ERROR");
|
CODE_TO_NAME_MAP.put(11, "PAYLOAD_SIZE_MISMATCH_ERROR");
|
||||||
CODE_TO_NAME_MAP.put(12, "DOWNLOAD_PAYLOAD_VERIFICATION_ERROR");
|
CODE_TO_NAME_MAP.put(12, "DOWNLOAD_PAYLOAD_VERIFICATION_ERROR");
|
||||||
|
CODE_TO_NAME_MAP.put(15, "NEW_ROOTFS_VERIFICATION_ERROR");
|
||||||
CODE_TO_NAME_MAP.put(20, "DOWNLOAD_STATE_INITIALIZATION_ERROR");
|
CODE_TO_NAME_MAP.put(20, "DOWNLOAD_STATE_INITIALIZATION_ERROR");
|
||||||
CODE_TO_NAME_MAP.put(48, "USER_CANCELLED");
|
CODE_TO_NAME_MAP.put(48, "USER_CANCELLED");
|
||||||
CODE_TO_NAME_MAP.put(52, "UPDATED_BUT_NOT_ACTIVE");
|
CODE_TO_NAME_MAP.put(52, "UPDATED_BUT_NOT_ACTIVE");
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ import android.util.SparseArray;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class to work with update_engine's error codes.
|
* Helper class to work with update_engine's error codes.
|
||||||
* Many error codes are defined in {@link UpdateEngine.UpdateStatusConstants},
|
* Many error codes are defined in {@code UpdateEngine.UpdateStatusConstants},
|
||||||
* but you can find more in system/update_engine/common/error_code.h.
|
* but you can find more in system/update_engine/common/error_code.h.
|
||||||
*/
|
*/
|
||||||
public final class UpdateEngineStatuses {
|
public final class UpdateEngineStatuses {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
"property_files": [
|
"property_files": [
|
||||||
{
|
{
|
||||||
"filename": "payload.bin",
|
"filename": "payload.bin",
|
||||||
"offset": 531,
|
"offset": 195,
|
||||||
"size": 5012323
|
"size": 8
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ public class FileDownloaderTest {
|
|||||||
FileDownloader downloader = new FileDownloader(url, 160, 8, outFile);
|
FileDownloader downloader = new FileDownloader(url, 160, 8, outFile);
|
||||||
downloader.download();
|
downloader.download();
|
||||||
String downloadedContent = String.join("\n", Files.readAllLines(outFile.toPath()));
|
String downloadedContent = String.join("\n", Files.readAllLines(outFile.toPath()));
|
||||||
// Look at tools/create_test_ota.py
|
// archive contains text files with uppercase filenames
|
||||||
assertEquals("CARE_MAP", downloadedContent);
|
assertEquals("CARE_MAP", downloadedContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
package com.example.android.systemupdatersample.util;
|
package com.example.android.systemupdatersample.util;
|
||||||
|
|
||||||
import static com.example.android.systemupdatersample.util.PackagePropertyFiles.PAYLOAD_BINARY_FILE_NAME;
|
import static com.example.android.systemupdatersample.util.PackageFiles.PAYLOAD_BINARY_FILE_NAME;
|
||||||
import static com.example.android.systemupdatersample.util.PackagePropertyFiles.PAYLOAD_PROPERTIES_FILE_NAME;
|
import static com.example.android.systemupdatersample.util.PackageFiles.PAYLOAD_PROPERTIES_FILE_NAME;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|||||||
Reference in New Issue
Block a user