|
28 | 28 | #include <vector> |
29 | 29 |
|
30 | 30 | #include <android-base/strings.h> |
| 31 | +#include "absl/strings/str_split.h" |
31 | 32 |
|
32 | 33 | #include "cuttlefish/common/libs/utils/archive.h" |
33 | 34 | #include "cuttlefish/common/libs/utils/contains.h" |
|
48 | 49 | #include "cuttlefish/host/libs/web/android_build.h" |
49 | 50 | #include "cuttlefish/host/libs/web/android_build_api.h" |
50 | 51 | #include "cuttlefish/host/libs/web/android_build_string.h" |
| 52 | +#include "cuttlefish/host/libs/web/build_api_zip.h" |
51 | 53 | #include "cuttlefish/host/libs/web/build_zip_name.h" |
52 | 54 | #include "cuttlefish/host/libs/web/chrome_os_build_string.h" |
53 | 55 | #include "cuttlefish/host/libs/web/http_client/curl_global_init.h" |
54 | 56 | #include "cuttlefish/host/libs/web/luci_build_api.h" |
| 57 | +#include "cuttlefish/host/libs/zip/zip_cc.h" |
| 58 | +#include "cuttlefish/host/libs/zip/zip_file.h" |
| 59 | +#include "cuttlefish/host/libs/zip/zip_string.h" |
55 | 60 |
|
56 | 61 | namespace cuttlefish { |
57 | 62 | namespace { |
@@ -237,19 +242,58 @@ Result<void> FetchDefaultTarget(BuildApi& build_api, const Builds& builds, |
237 | 242 | trace.CompletePhase("Desparse image files"); |
238 | 243 | } |
239 | 244 |
|
| 245 | + std::string target_files_name = |
| 246 | + GetBuildZipName(*builds.default_build, "target_files"); |
| 247 | + std::optional<std::string> target_files; |
240 | 248 | if (builds.system || flags.download_target_files_zip) { |
241 | 249 | LOG(INFO) << "Downloading target files zip for " << *builds.default_build; |
242 | | - std::string target_files_name = |
243 | | - GetBuildZipName(*builds.default_build, "target_files"); |
244 | | - std::string target_files = CF_EXPECT(build_api.DownloadFile( |
| 250 | + target_files = CF_EXPECT(build_api.DownloadFile( |
245 | 251 | *builds.default_build, target_directories.default_target_files, |
246 | 252 | target_files_name)); |
247 | 253 | trace.CompletePhase("Download Target Files"); |
248 | 254 | LOG(INFO) << "Adding target files for default build"; |
249 | | - CF_EXPECT(config.AddFilesToConfig(FileSource::DEFAULT_BUILD, |
250 | | - default_build_id, default_build_target, |
251 | | - {target_files}, target_directories.root)); |
| 255 | + CF_EXPECT(config.AddFilesToConfig( |
| 256 | + FileSource::DEFAULT_BUILD, default_build_id, default_build_target, |
| 257 | + {*target_files}, target_directories.root)); |
| 258 | + } |
| 259 | + |
| 260 | + if (flags.extract_super_image_fragments) { |
| 261 | + ReadableZip target_files_zip = |
| 262 | + target_files.has_value() |
| 263 | + ? CF_EXPECT(ZipOpenRead(*target_files)) |
| 264 | + : CF_EXPECT( |
| 265 | + OpenZip(build_api, *builds.default_build, target_files_name)); |
| 266 | + ReadableZipSource ab_partitions_source = |
| 267 | + CF_EXPECT(target_files_zip.GetFile("META/ab_partitions.txt")); |
| 268 | + std::string ab_partitions_contents = |
| 269 | + CF_EXPECT(ReadToString(ab_partitions_source)); |
| 270 | + |
| 271 | + std::string ab_partitions_file = |
| 272 | + target_directories.default_target_files + "/ab_partitions.txt"; |
| 273 | + CF_EXPECT(android::base::WriteStringToFile(ab_partitions_contents, |
| 274 | + ab_partitions_file)); |
| 275 | + CF_EXPECT(config.AddFilesToConfig( |
| 276 | + FileSource::DEFAULT_BUILD, default_build_id, default_build_target, |
| 277 | + {ab_partitions_file}, target_directories.default_target_files)); |
| 278 | + |
| 279 | + std::vector<std::string> ab_files = |
| 280 | + absl::StrSplit(ab_partitions_contents, '\n'); |
| 281 | + ab_files.emplace_back("super_empty"); |
| 282 | + for (const std::string& ab_file : ab_files) { |
| 283 | + if (ab_file.empty()) { |
| 284 | + continue; |
| 285 | + } |
| 286 | + std::string output = fmt::format( |
| 287 | + "{}/{}.img", target_directories.default_target_files, ab_file); |
| 288 | + CF_EXPECTF(ExtractFile(target_files_zip, |
| 289 | + fmt::format("IMAGES/{}.img", ab_file), output), |
| 290 | + "Failed to extract {}", output); |
| 291 | + CF_EXPECT(config.AddFilesToConfig( |
| 292 | + FileSource::DEFAULT_BUILD, default_build_id, default_build_target, |
| 293 | + {output}, target_directories.default_target_files)); |
| 294 | + } |
252 | 295 | } |
| 296 | + |
253 | 297 | return {}; |
254 | 298 | } |
255 | 299 |
|
|
0 commit comments