blob: acc6becf7301b31197d81324f0bcb35ac9ffa273 [file] [log] [blame]
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +00001//
2// Copyright (C) 2021 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
Nikita Ioffeaedfef32021-04-28 13:54:14 +010017#include <memory>
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000018#include <utility>
19
20#include <base/files/file_util.h>
21
Nikita Ioffeaedfef32021-04-28 13:54:14 +010022#include <ApexProperties.sysprop.h>
23
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000024#include "update_engine/aosp/apex_handler_android.h"
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000025
26namespace chromeos_update_engine {
27
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000028namespace {
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000029
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000030android::apex::CompressedApexInfoList CreateCompressedApexInfoList(
31 const std::vector<ApexInfo>& apex_infos) {
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000032 android::apex::CompressedApexInfoList compressed_apex_info_list;
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000033 for (const auto& apex_info : apex_infos) {
34 if (!apex_info.is_compressed()) {
35 continue;
36 }
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000037 android::apex::CompressedApexInfo compressed_apex_info;
38 compressed_apex_info.moduleName = apex_info.package_name();
39 compressed_apex_info.versionCode = apex_info.version();
40 compressed_apex_info.decompressedSize = apex_info.decompressed_size();
41 compressed_apex_info_list.apexInfos.emplace_back(
42 std::move(compressed_apex_info));
43 }
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000044 return compressed_apex_info_list;
45}
46
47} // namespace
48
Kelvin Zhang8251dc02022-06-14 09:46:46 -070049std::unique_ptr<ApexHandlerInterface>
50ApexHandlerInterface::CreateApexHandler() {
Nikita Ioffeaedfef32021-04-28 13:54:14 +010051 if (android::sysprop::ApexProperties::updatable().value_or(false)) {
52 return std::make_unique<ApexHandlerAndroid>();
53 } else {
54 return std::make_unique<FlattenedApexHandlerAndroid>();
55 }
56}
57
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000058android::base::Result<uint64_t> ApexHandlerAndroid::CalculateSize(
59 const std::vector<ApexInfo>& apex_infos) const {
60 // We might not need to decompress every APEX. Communicate with apexd to get
61 // accurate requirement.
62 auto apex_service = GetApexService();
63 if (apex_service == nullptr) {
64 return android::base::Error() << "Failed to get hold of apexservice";
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000065 }
66
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000067 auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
Kelvin Zhang8251dc02022-06-14 09:46:46 -070068 int64_t size_from_apexd = 0;
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000069 auto result = apex_service->calculateSizeForCompressedApex(
70 compressed_apex_info_list, &size_from_apexd);
71 if (!result.isOk()) {
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000072 return android::base::Error()
73 << "Failed to get size required from apexservice";
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000074 }
75 return size_from_apexd;
76}
77
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000078bool ApexHandlerAndroid::AllocateSpace(
79 const std::vector<ApexInfo>& apex_infos) const {
80 auto apex_service = GetApexService();
81 if (apex_service == nullptr) {
82 return false;
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000083 }
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000084 auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
85 auto result =
86 apex_service->reserveSpaceForCompressedApex(compressed_apex_info_list);
87 return result.isOk();
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000088}
89
90android::sp<android::apex::IApexService> ApexHandlerAndroid::GetApexService()
91 const {
92 auto binder = android::defaultServiceManager()->waitForService(
93 android::String16("apexservice"));
94 if (binder == nullptr) {
95 return nullptr;
96 }
97 return android::interface_cast<android::apex::IApexService>(binder);
98}
99
Nikita Ioffeaedfef32021-04-28 13:54:14 +0100100android::base::Result<uint64_t> FlattenedApexHandlerAndroid::CalculateSize(
101 const std::vector<ApexInfo>& apex_infos) const {
102 return 0;
103}
104
105bool FlattenedApexHandlerAndroid::AllocateSpace(
106 const std::vector<ApexInfo>& apex_infos) const {
107 return true;
108}
109
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +0000110} // namespace chromeos_update_engine