blob: 8beef966603bf06416651809a5d1a670cdbde398 [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"
25#include "update_engine/common/utils.h"
26
27namespace chromeos_update_engine {
28
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000029namespace {
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000030
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000031android::apex::CompressedApexInfoList CreateCompressedApexInfoList(
32 const std::vector<ApexInfo>& apex_infos) {
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000033 android::apex::CompressedApexInfoList compressed_apex_info_list;
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000034 for (const auto& apex_info : apex_infos) {
35 if (!apex_info.is_compressed()) {
36 continue;
37 }
Mohammad Samiul Islam24a82792021-02-12 16:52:36 +000038 android::apex::CompressedApexInfo compressed_apex_info;
39 compressed_apex_info.moduleName = apex_info.package_name();
40 compressed_apex_info.versionCode = apex_info.version();
41 compressed_apex_info.decompressedSize = apex_info.decompressed_size();
42 compressed_apex_info_list.apexInfos.emplace_back(
43 std::move(compressed_apex_info));
44 }
Mohammad Samiul Islamb0ab8652021-02-26 14:04:17 +000045 return compressed_apex_info_list;
46}
47
48} // namespace
49
Nikita Ioffeaedfef32021-04-28 13:54:14 +010050std::unique_ptr<ApexHandlerInterface> CreateApexHandler() {
51 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);
68 int64_t size_from_apexd;
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