diff options
author | Zhomart Mukhamejanov <zhomart@google.com> | 2018-12-14 19:36:20 +0100 |
---|---|---|
committer | Zhomart Mukhamejanov <zhomart@google.com> | 2018-12-17 23:24:25 +0100 |
commit | c18d4886582c5a857f9da63a51eac870497e034e (patch) | |
tree | 6a37ddfedf0b881132d4d7a9b4451dac3dc96093 /updater_sample/src/com/example/android | |
parent | Merge "Add PrepareUpdateService." (diff) | |
download | android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar.gz android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar.bz2 android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar.lz android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar.xz android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.tar.zst android_bootable_recovery-c18d4886582c5a857f9da63a51eac870497e034e.zip |
Diffstat (limited to 'updater_sample/src/com/example/android')
-rw-r--r-- | updater_sample/src/com/example/android/systemupdatersample/services/PrepareUpdateService.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/updater_sample/src/com/example/android/systemupdatersample/services/PrepareUpdateService.java b/updater_sample/src/com/example/android/systemupdatersample/services/PrepareUpdateService.java index 06581bee3..29eb13da7 100644 --- a/updater_sample/src/com/example/android/systemupdatersample/services/PrepareUpdateService.java +++ b/updater_sample/src/com/example/android/systemupdatersample/services/PrepareUpdateService.java @@ -42,7 +42,9 @@ import com.google.common.collect.ImmutableSet; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; import java.util.Optional; /** @@ -144,6 +146,13 @@ public class PrepareUpdateService extends IntentService { private PayloadSpec execute(UpdateConfig config) throws IOException, PreparationFailedException { + if (config.getAbConfig().getVerifyPayloadMetadata()) { + Log.i(TAG, "Verifying payload metadata with UpdateEngine."); + if (!verifyPayloadMetadata(config)) { + throw new PreparationFailedException("Payload metadata is not compatible"); + } + } + if (config.getInstallType() == UpdateConfig.AB_INSTALL_TYPE_NON_STREAMING) { return mPayloadSpecs.forNonStreaming(config.getUpdatePackageFile()); } @@ -179,6 +188,48 @@ public class PrepareUpdateService extends IntentService { } /** + * Downloads only payload_metadata.bin and verifies with + * {@link UpdateEngine#verifyPayloadMetadata}. + * Returns {@code true} if the payload is verified or the result is unknown because of + * exception from UpdateEngine. + * By downloading only small portion of the package, it allows to verify if UpdateEngine + * will install the update. + */ + private boolean verifyPayloadMetadata(UpdateConfig config) { + Optional<UpdateConfig.PackageFile> metadataPackageFile = + Arrays.stream(config.getAbConfig().getPropertyFiles()) + .filter(p -> p.getFilename().equals( + PackageFiles.PAYLOAD_METADATA_FILE_NAME)) + .findFirst(); + if (!metadataPackageFile.isPresent()) { + Log.w(TAG, String.format("ab_config.property_files doesn't contain %s", + PackageFiles.PAYLOAD_METADATA_FILE_NAME)); + return true; + } + Path metadataPath = Paths.get(OTA_PACKAGE_DIR, PackageFiles.PAYLOAD_METADATA_FILE_NAME); + try { + Files.deleteIfExists(metadataPath); + FileDownloader d = new FileDownloader( + config.getUrl(), + metadataPackageFile.get().getOffset(), + metadataPackageFile.get().getSize(), + metadataPath.toFile()); + d.download(); + } catch (IOException e) { + Log.w(TAG, String.format("Downloading %s from %s failed", + PackageFiles.PAYLOAD_METADATA_FILE_NAME, + config.getUrl()), e); + return true; + } + try { + return mUpdateEngine.verifyPayloadMetadata(metadataPath.toAbsolutePath().toString()); + } catch (Exception e) { + Log.w(TAG, "UpdateEngine#verifyPayloadMetadata failed", e); + return true; + } + } + + /** * Downloads files defined in {@link UpdateConfig#getAbConfig()} * and exists in {@code PRE_STREAMING_FILES_SET}, and put them * in directory {@code dir}. |