xref: /aosp_15_r20/system/update_engine/aosp/apex_handler_android.cc (revision 5a9231315b4521097b8dc3750bc806fcafe0c72f)
1*5a923131SAndroid Build Coastguard Worker //
2*5a923131SAndroid Build Coastguard Worker // Copyright (C) 2021 The Android Open Source Project
3*5a923131SAndroid Build Coastguard Worker //
4*5a923131SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*5a923131SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*5a923131SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*5a923131SAndroid Build Coastguard Worker //
8*5a923131SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
9*5a923131SAndroid Build Coastguard Worker //
10*5a923131SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*5a923131SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*5a923131SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5a923131SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*5a923131SAndroid Build Coastguard Worker // limitations under the License.
15*5a923131SAndroid Build Coastguard Worker //
16*5a923131SAndroid Build Coastguard Worker 
17*5a923131SAndroid Build Coastguard Worker #include <memory>
18*5a923131SAndroid Build Coastguard Worker #include <utility>
19*5a923131SAndroid Build Coastguard Worker 
20*5a923131SAndroid Build Coastguard Worker #include <base/files/file_util.h>
21*5a923131SAndroid Build Coastguard Worker 
22*5a923131SAndroid Build Coastguard Worker #include <ApexProperties.sysprop.h>
23*5a923131SAndroid Build Coastguard Worker 
24*5a923131SAndroid Build Coastguard Worker #include "update_engine/aosp/apex_handler_android.h"
25*5a923131SAndroid Build Coastguard Worker 
26*5a923131SAndroid Build Coastguard Worker namespace chromeos_update_engine {
27*5a923131SAndroid Build Coastguard Worker 
28*5a923131SAndroid Build Coastguard Worker namespace {
29*5a923131SAndroid Build Coastguard Worker 
CreateCompressedApexInfoList(const std::vector<ApexInfo> & apex_infos)30*5a923131SAndroid Build Coastguard Worker android::apex::CompressedApexInfoList CreateCompressedApexInfoList(
31*5a923131SAndroid Build Coastguard Worker     const std::vector<ApexInfo>& apex_infos) {
32*5a923131SAndroid Build Coastguard Worker   android::apex::CompressedApexInfoList compressed_apex_info_list;
33*5a923131SAndroid Build Coastguard Worker   for (const auto& apex_info : apex_infos) {
34*5a923131SAndroid Build Coastguard Worker     if (!apex_info.is_compressed()) {
35*5a923131SAndroid Build Coastguard Worker       continue;
36*5a923131SAndroid Build Coastguard Worker     }
37*5a923131SAndroid Build Coastguard Worker     android::apex::CompressedApexInfo compressed_apex_info;
38*5a923131SAndroid Build Coastguard Worker     compressed_apex_info.moduleName = apex_info.package_name();
39*5a923131SAndroid Build Coastguard Worker     compressed_apex_info.versionCode = apex_info.version();
40*5a923131SAndroid Build Coastguard Worker     compressed_apex_info.decompressedSize = apex_info.decompressed_size();
41*5a923131SAndroid Build Coastguard Worker     compressed_apex_info_list.apexInfos.emplace_back(
42*5a923131SAndroid Build Coastguard Worker         std::move(compressed_apex_info));
43*5a923131SAndroid Build Coastguard Worker   }
44*5a923131SAndroid Build Coastguard Worker   return compressed_apex_info_list;
45*5a923131SAndroid Build Coastguard Worker }
46*5a923131SAndroid Build Coastguard Worker 
47*5a923131SAndroid Build Coastguard Worker }  // namespace
48*5a923131SAndroid Build Coastguard Worker 
49*5a923131SAndroid Build Coastguard Worker std::unique_ptr<ApexHandlerInterface>
CreateApexHandler()50*5a923131SAndroid Build Coastguard Worker ApexHandlerInterface::CreateApexHandler() {
51*5a923131SAndroid Build Coastguard Worker   if (android::sysprop::ApexProperties::updatable().value_or(false)) {
52*5a923131SAndroid Build Coastguard Worker     return std::make_unique<ApexHandlerAndroid>();
53*5a923131SAndroid Build Coastguard Worker   } else {
54*5a923131SAndroid Build Coastguard Worker     return std::make_unique<FlattenedApexHandlerAndroid>();
55*5a923131SAndroid Build Coastguard Worker   }
56*5a923131SAndroid Build Coastguard Worker }
57*5a923131SAndroid Build Coastguard Worker 
CalculateSize(const std::vector<ApexInfo> & apex_infos) const58*5a923131SAndroid Build Coastguard Worker android::base::Result<uint64_t> ApexHandlerAndroid::CalculateSize(
59*5a923131SAndroid Build Coastguard Worker     const std::vector<ApexInfo>& apex_infos) const {
60*5a923131SAndroid Build Coastguard Worker   // We might not need to decompress every APEX. Communicate with apexd to get
61*5a923131SAndroid Build Coastguard Worker   // accurate requirement.
62*5a923131SAndroid Build Coastguard Worker   auto apex_service = GetApexService();
63*5a923131SAndroid Build Coastguard Worker   if (apex_service == nullptr) {
64*5a923131SAndroid Build Coastguard Worker     return android::base::Error() << "Failed to get hold of apexservice";
65*5a923131SAndroid Build Coastguard Worker   }
66*5a923131SAndroid Build Coastguard Worker 
67*5a923131SAndroid Build Coastguard Worker   auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
68*5a923131SAndroid Build Coastguard Worker   int64_t size_from_apexd = 0;
69*5a923131SAndroid Build Coastguard Worker   auto result = apex_service->calculateSizeForCompressedApex(
70*5a923131SAndroid Build Coastguard Worker       compressed_apex_info_list, &size_from_apexd);
71*5a923131SAndroid Build Coastguard Worker   if (!result.isOk()) {
72*5a923131SAndroid Build Coastguard Worker     return android::base::Error()
73*5a923131SAndroid Build Coastguard Worker            << "Failed to get size required from apexservice";
74*5a923131SAndroid Build Coastguard Worker   }
75*5a923131SAndroid Build Coastguard Worker   return size_from_apexd;
76*5a923131SAndroid Build Coastguard Worker }
77*5a923131SAndroid Build Coastguard Worker 
AllocateSpace(const std::vector<ApexInfo> & apex_infos) const78*5a923131SAndroid Build Coastguard Worker bool ApexHandlerAndroid::AllocateSpace(
79*5a923131SAndroid Build Coastguard Worker     const std::vector<ApexInfo>& apex_infos) const {
80*5a923131SAndroid Build Coastguard Worker   auto apex_service = GetApexService();
81*5a923131SAndroid Build Coastguard Worker   if (apex_service == nullptr) {
82*5a923131SAndroid Build Coastguard Worker     return false;
83*5a923131SAndroid Build Coastguard Worker   }
84*5a923131SAndroid Build Coastguard Worker   auto compressed_apex_info_list = CreateCompressedApexInfoList(apex_infos);
85*5a923131SAndroid Build Coastguard Worker   auto result =
86*5a923131SAndroid Build Coastguard Worker       apex_service->reserveSpaceForCompressedApex(compressed_apex_info_list);
87*5a923131SAndroid Build Coastguard Worker   return result.isOk();
88*5a923131SAndroid Build Coastguard Worker }
89*5a923131SAndroid Build Coastguard Worker 
GetApexService() const90*5a923131SAndroid Build Coastguard Worker android::sp<android::apex::IApexService> ApexHandlerAndroid::GetApexService()
91*5a923131SAndroid Build Coastguard Worker     const {
92*5a923131SAndroid Build Coastguard Worker   auto binder = android::defaultServiceManager()->waitForService(
93*5a923131SAndroid Build Coastguard Worker       android::String16("apexservice"));
94*5a923131SAndroid Build Coastguard Worker   if (binder == nullptr) {
95*5a923131SAndroid Build Coastguard Worker     return nullptr;
96*5a923131SAndroid Build Coastguard Worker   }
97*5a923131SAndroid Build Coastguard Worker   return android::interface_cast<android::apex::IApexService>(binder);
98*5a923131SAndroid Build Coastguard Worker }
99*5a923131SAndroid Build Coastguard Worker 
CalculateSize(const std::vector<ApexInfo> & apex_infos) const100*5a923131SAndroid Build Coastguard Worker android::base::Result<uint64_t> FlattenedApexHandlerAndroid::CalculateSize(
101*5a923131SAndroid Build Coastguard Worker     const std::vector<ApexInfo>& apex_infos) const {
102*5a923131SAndroid Build Coastguard Worker   return 0;
103*5a923131SAndroid Build Coastguard Worker }
104*5a923131SAndroid Build Coastguard Worker 
AllocateSpace(const std::vector<ApexInfo> & apex_infos) const105*5a923131SAndroid Build Coastguard Worker bool FlattenedApexHandlerAndroid::AllocateSpace(
106*5a923131SAndroid Build Coastguard Worker     const std::vector<ApexInfo>& apex_infos) const {
107*5a923131SAndroid Build Coastguard Worker   return true;
108*5a923131SAndroid Build Coastguard Worker }
109*5a923131SAndroid Build Coastguard Worker 
110*5a923131SAndroid Build Coastguard Worker }  // namespace chromeos_update_engine
111