1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker *
4*33f37583SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker *
8*33f37583SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker *
10*33f37583SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker */
16*33f37583SAndroid Build Coastguard Worker
17*33f37583SAndroid Build Coastguard Worker #include "apexservice.h"
18*33f37583SAndroid Build Coastguard Worker
19*33f37583SAndroid Build Coastguard Worker #include <android-base/file.h>
20*33f37583SAndroid Build Coastguard Worker #include <android-base/logging.h>
21*33f37583SAndroid Build Coastguard Worker #include <android-base/properties.h>
22*33f37583SAndroid Build Coastguard Worker #include <android-base/result.h>
23*33f37583SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
24*33f37583SAndroid Build Coastguard Worker #include <android-base/strings.h>
25*33f37583SAndroid Build Coastguard Worker #include <android/apex/BnApexService.h>
26*33f37583SAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
27*33f37583SAndroid Build Coastguard Worker #include <binder/IResultReceiver.h>
28*33f37583SAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
29*33f37583SAndroid Build Coastguard Worker #include <binder/LazyServiceRegistrar.h>
30*33f37583SAndroid Build Coastguard Worker #include <binder/ProcessState.h>
31*33f37583SAndroid Build Coastguard Worker #include <binder/Status.h>
32*33f37583SAndroid Build Coastguard Worker #include <dirent.h>
33*33f37583SAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
34*33f37583SAndroid Build Coastguard Worker #include <stdio.h>
35*33f37583SAndroid Build Coastguard Worker #include <stdlib.h>
36*33f37583SAndroid Build Coastguard Worker #include <utils/String16.h>
37*33f37583SAndroid Build Coastguard Worker
38*33f37583SAndroid Build Coastguard Worker #include "apex_constants.h"
39*33f37583SAndroid Build Coastguard Worker #include "apex_file.h"
40*33f37583SAndroid Build Coastguard Worker #include "apex_file_repository.h"
41*33f37583SAndroid Build Coastguard Worker #include "apexd.h"
42*33f37583SAndroid Build Coastguard Worker #include "apexd_metrics.h"
43*33f37583SAndroid Build Coastguard Worker #include "apexd_session.h"
44*33f37583SAndroid Build Coastguard Worker #include "string_log.h"
45*33f37583SAndroid Build Coastguard Worker
46*33f37583SAndroid Build Coastguard Worker using android::base::Join;
47*33f37583SAndroid Build Coastguard Worker using android::base::Result;
48*33f37583SAndroid Build Coastguard Worker
49*33f37583SAndroid Build Coastguard Worker namespace android {
50*33f37583SAndroid Build Coastguard Worker namespace apex {
51*33f37583SAndroid Build Coastguard Worker namespace binder {
52*33f37583SAndroid Build Coastguard Worker namespace {
53*33f37583SAndroid Build Coastguard Worker
54*33f37583SAndroid Build Coastguard Worker using BinderStatus = ::android::binder::Status;
55*33f37583SAndroid Build Coastguard Worker
CheckCallerIsRoot(const std::string & name)56*33f37583SAndroid Build Coastguard Worker BinderStatus CheckCallerIsRoot(const std::string& name) {
57*33f37583SAndroid Build Coastguard Worker uid_t uid = IPCThreadState::self()->getCallingUid();
58*33f37583SAndroid Build Coastguard Worker if (uid != AID_ROOT) {
59*33f37583SAndroid Build Coastguard Worker std::string msg = "Only root is allowed to call " + name;
60*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(BinderStatus::EX_SECURITY,
61*33f37583SAndroid Build Coastguard Worker String8(msg.c_str()));
62*33f37583SAndroid Build Coastguard Worker }
63*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
64*33f37583SAndroid Build Coastguard Worker }
65*33f37583SAndroid Build Coastguard Worker
CheckCallerSystemOrRoot(const std::string & name)66*33f37583SAndroid Build Coastguard Worker BinderStatus CheckCallerSystemOrRoot(const std::string& name) {
67*33f37583SAndroid Build Coastguard Worker uid_t uid = IPCThreadState::self()->getCallingUid();
68*33f37583SAndroid Build Coastguard Worker if (uid != AID_ROOT && uid != AID_SYSTEM) {
69*33f37583SAndroid Build Coastguard Worker std::string msg = "Only root and system_server are allowed to call " + name;
70*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(BinderStatus::EX_SECURITY,
71*33f37583SAndroid Build Coastguard Worker String8(msg.c_str()));
72*33f37583SAndroid Build Coastguard Worker }
73*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
74*33f37583SAndroid Build Coastguard Worker }
75*33f37583SAndroid Build Coastguard Worker
76*33f37583SAndroid Build Coastguard Worker class ApexService : public BnApexService {
77*33f37583SAndroid Build Coastguard Worker public:
78*33f37583SAndroid Build Coastguard Worker using BinderStatus = ::android::binder::Status;
79*33f37583SAndroid Build Coastguard Worker using SessionState = ::apex::proto::SessionState;
80*33f37583SAndroid Build Coastguard Worker
ApexService()81*33f37583SAndroid Build Coastguard Worker ApexService(){};
82*33f37583SAndroid Build Coastguard Worker
83*33f37583SAndroid Build Coastguard Worker BinderStatus stagePackages(const std::vector<std::string>& paths) override;
84*33f37583SAndroid Build Coastguard Worker BinderStatus unstagePackages(const std::vector<std::string>& paths) override;
85*33f37583SAndroid Build Coastguard Worker BinderStatus submitStagedSession(const ApexSessionParams& params,
86*33f37583SAndroid Build Coastguard Worker ApexInfoList* apex_info_list) override;
87*33f37583SAndroid Build Coastguard Worker BinderStatus markStagedSessionReady(int session_id) override;
88*33f37583SAndroid Build Coastguard Worker BinderStatus markStagedSessionSuccessful(int session_id) override;
89*33f37583SAndroid Build Coastguard Worker BinderStatus getSessions(std::vector<ApexSessionInfo>* aidl_return) override;
90*33f37583SAndroid Build Coastguard Worker BinderStatus getStagedSessionInfo(
91*33f37583SAndroid Build Coastguard Worker int session_id, ApexSessionInfo* apex_session_info) override;
92*33f37583SAndroid Build Coastguard Worker BinderStatus getStagedApexInfos(const ApexSessionParams& params,
93*33f37583SAndroid Build Coastguard Worker std::vector<ApexInfo>* aidl_return) override;
94*33f37583SAndroid Build Coastguard Worker BinderStatus getActivePackages(std::vector<ApexInfo>* aidl_return) override;
95*33f37583SAndroid Build Coastguard Worker BinderStatus getActivePackage(const std::string& package_name,
96*33f37583SAndroid Build Coastguard Worker ApexInfo* aidl_return) override;
97*33f37583SAndroid Build Coastguard Worker BinderStatus getAllPackages(std::vector<ApexInfo>* aidl_return) override;
98*33f37583SAndroid Build Coastguard Worker BinderStatus abortStagedSession(int session_id) override;
99*33f37583SAndroid Build Coastguard Worker BinderStatus revertActiveSessions() override;
100*33f37583SAndroid Build Coastguard Worker BinderStatus resumeRevertIfNeeded() override;
101*33f37583SAndroid Build Coastguard Worker BinderStatus snapshotCeData(int user_id, int rollback_id,
102*33f37583SAndroid Build Coastguard Worker const std::string& apex_name) override;
103*33f37583SAndroid Build Coastguard Worker BinderStatus restoreCeData(int user_id, int rollback_id,
104*33f37583SAndroid Build Coastguard Worker const std::string& apex_name) override;
105*33f37583SAndroid Build Coastguard Worker BinderStatus destroyDeSnapshots(int rollback_id) override;
106*33f37583SAndroid Build Coastguard Worker BinderStatus destroyCeSnapshots(int user_id, int rollback_id) override;
107*33f37583SAndroid Build Coastguard Worker BinderStatus destroyCeSnapshotsNotSpecified(
108*33f37583SAndroid Build Coastguard Worker int user_id, const std::vector<int>& retain_rollback_ids) override;
109*33f37583SAndroid Build Coastguard Worker BinderStatus recollectPreinstalledData() override;
110*33f37583SAndroid Build Coastguard Worker BinderStatus markBootCompleted() override;
111*33f37583SAndroid Build Coastguard Worker BinderStatus calculateSizeForCompressedApex(
112*33f37583SAndroid Build Coastguard Worker const CompressedApexInfoList& compressed_apex_info_list,
113*33f37583SAndroid Build Coastguard Worker int64_t* required_size) override;
114*33f37583SAndroid Build Coastguard Worker BinderStatus reserveSpaceForCompressedApex(
115*33f37583SAndroid Build Coastguard Worker const CompressedApexInfoList& compressed_apex_info_list) override;
116*33f37583SAndroid Build Coastguard Worker BinderStatus installAndActivatePackage(const std::string& package_path,
117*33f37583SAndroid Build Coastguard Worker bool force,
118*33f37583SAndroid Build Coastguard Worker ApexInfo* aidl_return) override;
119*33f37583SAndroid Build Coastguard Worker
120*33f37583SAndroid Build Coastguard Worker status_t dump(int fd, const Vector<String16>& args) override;
121*33f37583SAndroid Build Coastguard Worker
122*33f37583SAndroid Build Coastguard Worker // Override onTransact so we can handle shellCommand.
123*33f37583SAndroid Build Coastguard Worker status_t onTransact(uint32_t _aidl_code, const Parcel& _aidl_data,
124*33f37583SAndroid Build Coastguard Worker Parcel* _aidl_reply, uint32_t _aidl_flags) override;
125*33f37583SAndroid Build Coastguard Worker
126*33f37583SAndroid Build Coastguard Worker status_t shellCommand(int in, int out, int err, const Vector<String16>& args);
127*33f37583SAndroid Build Coastguard Worker };
128*33f37583SAndroid Build Coastguard Worker
CheckDebuggable(const std::string & name)129*33f37583SAndroid Build Coastguard Worker BinderStatus CheckDebuggable(const std::string& name) {
130*33f37583SAndroid Build Coastguard Worker if (!::android::base::GetBoolProperty("ro.debuggable", false)) {
131*33f37583SAndroid Build Coastguard Worker std::string tmp = name + " unavailable on non-debuggable builds";
132*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(BinderStatus::EX_SECURITY,
133*33f37583SAndroid Build Coastguard Worker String8(tmp.c_str()));
134*33f37583SAndroid Build Coastguard Worker }
135*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
136*33f37583SAndroid Build Coastguard Worker }
137*33f37583SAndroid Build Coastguard Worker
stagePackages(const std::vector<std::string> & paths)138*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::stagePackages(const std::vector<std::string>& paths) {
139*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "stagePackages() received by ApexService, paths "
140*33f37583SAndroid Build Coastguard Worker << android::base::Join(paths, ',');
141*33f37583SAndroid Build Coastguard Worker
142*33f37583SAndroid Build Coastguard Worker BinderStatus debug_check = CheckDebuggable("stagePackages");
143*33f37583SAndroid Build Coastguard Worker if (!debug_check.isOk()) {
144*33f37583SAndroid Build Coastguard Worker return debug_check;
145*33f37583SAndroid Build Coastguard Worker }
146*33f37583SAndroid Build Coastguard Worker if (auto is_root = CheckCallerIsRoot("stagePackages"); !is_root.isOk()) {
147*33f37583SAndroid Build Coastguard Worker return is_root;
148*33f37583SAndroid Build Coastguard Worker }
149*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::StagePackages(paths);
150*33f37583SAndroid Build Coastguard Worker
151*33f37583SAndroid Build Coastguard Worker if (res.ok()) {
152*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
153*33f37583SAndroid Build Coastguard Worker }
154*33f37583SAndroid Build Coastguard Worker
155*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to stage " << android::base::Join(paths, ',') << ": "
156*33f37583SAndroid Build Coastguard Worker << res.error();
157*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
158*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
159*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
160*33f37583SAndroid Build Coastguard Worker }
161*33f37583SAndroid Build Coastguard Worker
unstagePackages(const std::vector<std::string> & paths)162*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::unstagePackages(
163*33f37583SAndroid Build Coastguard Worker const std::vector<std::string>& paths) {
164*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "unstagePackages() received by ApexService, paths "
165*33f37583SAndroid Build Coastguard Worker << android::base::Join(paths, ',');
166*33f37583SAndroid Build Coastguard Worker
167*33f37583SAndroid Build Coastguard Worker if (auto check = CheckCallerSystemOrRoot("unstagePackages"); !check.isOk()) {
168*33f37583SAndroid Build Coastguard Worker return check;
169*33f37583SAndroid Build Coastguard Worker }
170*33f37583SAndroid Build Coastguard Worker
171*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::UnstagePackages(paths);
172*33f37583SAndroid Build Coastguard Worker if (res.ok()) {
173*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
174*33f37583SAndroid Build Coastguard Worker }
175*33f37583SAndroid Build Coastguard Worker
176*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to unstage " << android::base::Join(paths, ',') << ": "
177*33f37583SAndroid Build Coastguard Worker << res.error();
178*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
179*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
180*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
181*33f37583SAndroid Build Coastguard Worker }
182*33f37583SAndroid Build Coastguard Worker
submitStagedSession(const ApexSessionParams & params,ApexInfoList * apex_info_list)183*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::submitStagedSession(const ApexSessionParams& params,
184*33f37583SAndroid Build Coastguard Worker ApexInfoList* apex_info_list) {
185*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "submitStagedSession() received by ApexService, session id "
186*33f37583SAndroid Build Coastguard Worker << params.sessionId << " child sessions: ["
187*33f37583SAndroid Build Coastguard Worker << android::base::Join(params.childSessionIds, ',') << "]";
188*33f37583SAndroid Build Coastguard Worker
189*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("submitStagedSession");
190*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
191*33f37583SAndroid Build Coastguard Worker return check;
192*33f37583SAndroid Build Coastguard Worker }
193*33f37583SAndroid Build Coastguard Worker
194*33f37583SAndroid Build Coastguard Worker Result<std::vector<ApexFile>> packages = ::android::apex::SubmitStagedSession(
195*33f37583SAndroid Build Coastguard Worker params.sessionId, params.childSessionIds, params.hasRollbackEnabled,
196*33f37583SAndroid Build Coastguard Worker params.isRollback, params.rollbackId);
197*33f37583SAndroid Build Coastguard Worker if (!packages.ok()) {
198*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to submit session id " << params.sessionId << ": "
199*33f37583SAndroid Build Coastguard Worker << packages.error();
200*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
201*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
202*33f37583SAndroid Build Coastguard Worker String8(packages.error().message().c_str()));
203*33f37583SAndroid Build Coastguard Worker }
204*33f37583SAndroid Build Coastguard Worker
205*33f37583SAndroid Build Coastguard Worker for (const auto& package : *packages) {
206*33f37583SAndroid Build Coastguard Worker ApexInfo out;
207*33f37583SAndroid Build Coastguard Worker out.moduleName = package.GetManifest().name();
208*33f37583SAndroid Build Coastguard Worker out.modulePath = package.GetPath();
209*33f37583SAndroid Build Coastguard Worker out.versionCode = package.GetManifest().version();
210*33f37583SAndroid Build Coastguard Worker apex_info_list->apexInfos.push_back(out);
211*33f37583SAndroid Build Coastguard Worker }
212*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
213*33f37583SAndroid Build Coastguard Worker }
214*33f37583SAndroid Build Coastguard Worker
markStagedSessionReady(int session_id)215*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::markStagedSessionReady(int session_id) {
216*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "markStagedSessionReady() received by ApexService, session id "
217*33f37583SAndroid Build Coastguard Worker << session_id;
218*33f37583SAndroid Build Coastguard Worker
219*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("markStagedSessionReady");
220*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
221*33f37583SAndroid Build Coastguard Worker return check;
222*33f37583SAndroid Build Coastguard Worker }
223*33f37583SAndroid Build Coastguard Worker
224*33f37583SAndroid Build Coastguard Worker Result<void> success = ::android::apex::MarkStagedSessionReady(session_id);
225*33f37583SAndroid Build Coastguard Worker if (!success.ok()) {
226*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to mark session id " << session_id
227*33f37583SAndroid Build Coastguard Worker << " as ready: " << success.error();
228*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
229*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
230*33f37583SAndroid Build Coastguard Worker String8(success.error().message().c_str()));
231*33f37583SAndroid Build Coastguard Worker }
232*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
233*33f37583SAndroid Build Coastguard Worker }
234*33f37583SAndroid Build Coastguard Worker
markStagedSessionSuccessful(int session_id)235*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::markStagedSessionSuccessful(int session_id) {
236*33f37583SAndroid Build Coastguard Worker LOG(INFO)
237*33f37583SAndroid Build Coastguard Worker << "markStagedSessionSuccessful() received by ApexService, session id "
238*33f37583SAndroid Build Coastguard Worker << session_id;
239*33f37583SAndroid Build Coastguard Worker
240*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("markStagedSessionSuccessful");
241*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
242*33f37583SAndroid Build Coastguard Worker return check;
243*33f37583SAndroid Build Coastguard Worker }
244*33f37583SAndroid Build Coastguard Worker
245*33f37583SAndroid Build Coastguard Worker Result<void> ret = ::android::apex::MarkStagedSessionSuccessful(session_id);
246*33f37583SAndroid Build Coastguard Worker if (!ret.ok()) {
247*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to mark session " << session_id
248*33f37583SAndroid Build Coastguard Worker << " as SUCCESS: " << ret.error();
249*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
250*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_ILLEGAL_ARGUMENT,
251*33f37583SAndroid Build Coastguard Worker String8(ret.error().message().c_str()));
252*33f37583SAndroid Build Coastguard Worker }
253*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
254*33f37583SAndroid Build Coastguard Worker }
255*33f37583SAndroid Build Coastguard Worker
markBootCompleted()256*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::markBootCompleted() {
257*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "markBootCompleted() received by ApexService";
258*33f37583SAndroid Build Coastguard Worker
259*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("markBootCompleted");
260*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
261*33f37583SAndroid Build Coastguard Worker return check;
262*33f37583SAndroid Build Coastguard Worker }
263*33f37583SAndroid Build Coastguard Worker
264*33f37583SAndroid Build Coastguard Worker ::android::apex::OnBootCompleted();
265*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
266*33f37583SAndroid Build Coastguard Worker }
267*33f37583SAndroid Build Coastguard Worker
calculateSizeForCompressedApex(const CompressedApexInfoList & compressed_apex_info_list,int64_t * required_size)268*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::calculateSizeForCompressedApex(
269*33f37583SAndroid Build Coastguard Worker const CompressedApexInfoList& compressed_apex_info_list,
270*33f37583SAndroid Build Coastguard Worker int64_t* required_size) {
271*33f37583SAndroid Build Coastguard Worker std::vector<std::tuple<std::string, int64_t, int64_t>> compressed_apexes;
272*33f37583SAndroid Build Coastguard Worker compressed_apexes.reserve(compressed_apex_info_list.apexInfos.size());
273*33f37583SAndroid Build Coastguard Worker for (const auto& apex_info : compressed_apex_info_list.apexInfos) {
274*33f37583SAndroid Build Coastguard Worker compressed_apexes.emplace_back(apex_info.moduleName, apex_info.versionCode,
275*33f37583SAndroid Build Coastguard Worker apex_info.decompressedSize);
276*33f37583SAndroid Build Coastguard Worker }
277*33f37583SAndroid Build Coastguard Worker const auto& instance = ApexFileRepository::GetInstance();
278*33f37583SAndroid Build Coastguard Worker *required_size = ::android::apex::CalculateSizeForCompressedApex(
279*33f37583SAndroid Build Coastguard Worker compressed_apexes, instance);
280*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
281*33f37583SAndroid Build Coastguard Worker }
282*33f37583SAndroid Build Coastguard Worker
reserveSpaceForCompressedApex(const CompressedApexInfoList & compressed_apex_info_list)283*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::reserveSpaceForCompressedApex(
284*33f37583SAndroid Build Coastguard Worker const CompressedApexInfoList& compressed_apex_info_list) {
285*33f37583SAndroid Build Coastguard Worker int64_t required_size;
286*33f37583SAndroid Build Coastguard Worker if (auto res = calculateSizeForCompressedApex(compressed_apex_info_list,
287*33f37583SAndroid Build Coastguard Worker &required_size);
288*33f37583SAndroid Build Coastguard Worker !res.isOk()) {
289*33f37583SAndroid Build Coastguard Worker return res;
290*33f37583SAndroid Build Coastguard Worker }
291*33f37583SAndroid Build Coastguard Worker if (auto res = ReserveSpaceForCompressedApex(required_size, kOtaReservedDir);
292*33f37583SAndroid Build Coastguard Worker !res.ok()) {
293*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
294*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
295*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
296*33f37583SAndroid Build Coastguard Worker }
297*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
298*33f37583SAndroid Build Coastguard Worker }
299*33f37583SAndroid Build Coastguard Worker
ClearSessionInfo(ApexSessionInfo * session_info)300*33f37583SAndroid Build Coastguard Worker static void ClearSessionInfo(ApexSessionInfo* session_info) {
301*33f37583SAndroid Build Coastguard Worker session_info->sessionId = -1;
302*33f37583SAndroid Build Coastguard Worker session_info->isUnknown = false;
303*33f37583SAndroid Build Coastguard Worker session_info->isVerified = false;
304*33f37583SAndroid Build Coastguard Worker session_info->isStaged = false;
305*33f37583SAndroid Build Coastguard Worker session_info->isActivated = false;
306*33f37583SAndroid Build Coastguard Worker session_info->isRevertInProgress = false;
307*33f37583SAndroid Build Coastguard Worker session_info->isActivationFailed = false;
308*33f37583SAndroid Build Coastguard Worker session_info->isSuccess = false;
309*33f37583SAndroid Build Coastguard Worker session_info->isReverted = false;
310*33f37583SAndroid Build Coastguard Worker session_info->isRevertFailed = false;
311*33f37583SAndroid Build Coastguard Worker }
312*33f37583SAndroid Build Coastguard Worker
ConvertToApexSessionInfo(const ApexSession & session,ApexSessionInfo * session_info)313*33f37583SAndroid Build Coastguard Worker void ConvertToApexSessionInfo(const ApexSession& session,
314*33f37583SAndroid Build Coastguard Worker ApexSessionInfo* session_info) {
315*33f37583SAndroid Build Coastguard Worker using SessionState = ::apex::proto::SessionState;
316*33f37583SAndroid Build Coastguard Worker
317*33f37583SAndroid Build Coastguard Worker ClearSessionInfo(session_info);
318*33f37583SAndroid Build Coastguard Worker session_info->sessionId = session.GetId();
319*33f37583SAndroid Build Coastguard Worker session_info->crashingNativeProcess = session.GetCrashingNativeProcess();
320*33f37583SAndroid Build Coastguard Worker session_info->errorMessage = session.GetErrorMessage();
321*33f37583SAndroid Build Coastguard Worker
322*33f37583SAndroid Build Coastguard Worker switch (session.GetState()) {
323*33f37583SAndroid Build Coastguard Worker case SessionState::VERIFIED:
324*33f37583SAndroid Build Coastguard Worker session_info->isVerified = true;
325*33f37583SAndroid Build Coastguard Worker break;
326*33f37583SAndroid Build Coastguard Worker case SessionState::STAGED:
327*33f37583SAndroid Build Coastguard Worker session_info->isStaged = true;
328*33f37583SAndroid Build Coastguard Worker break;
329*33f37583SAndroid Build Coastguard Worker case SessionState::ACTIVATED:
330*33f37583SAndroid Build Coastguard Worker session_info->isActivated = true;
331*33f37583SAndroid Build Coastguard Worker break;
332*33f37583SAndroid Build Coastguard Worker case SessionState::ACTIVATION_FAILED:
333*33f37583SAndroid Build Coastguard Worker session_info->isActivationFailed = true;
334*33f37583SAndroid Build Coastguard Worker break;
335*33f37583SAndroid Build Coastguard Worker case SessionState::SUCCESS:
336*33f37583SAndroid Build Coastguard Worker session_info->isSuccess = true;
337*33f37583SAndroid Build Coastguard Worker break;
338*33f37583SAndroid Build Coastguard Worker case SessionState::REVERT_IN_PROGRESS:
339*33f37583SAndroid Build Coastguard Worker session_info->isRevertInProgress = true;
340*33f37583SAndroid Build Coastguard Worker break;
341*33f37583SAndroid Build Coastguard Worker case SessionState::REVERTED:
342*33f37583SAndroid Build Coastguard Worker session_info->isReverted = true;
343*33f37583SAndroid Build Coastguard Worker break;
344*33f37583SAndroid Build Coastguard Worker case SessionState::REVERT_FAILED:
345*33f37583SAndroid Build Coastguard Worker session_info->isRevertFailed = true;
346*33f37583SAndroid Build Coastguard Worker break;
347*33f37583SAndroid Build Coastguard Worker case SessionState::UNKNOWN:
348*33f37583SAndroid Build Coastguard Worker default:
349*33f37583SAndroid Build Coastguard Worker session_info->isUnknown = true;
350*33f37583SAndroid Build Coastguard Worker break;
351*33f37583SAndroid Build Coastguard Worker }
352*33f37583SAndroid Build Coastguard Worker }
353*33f37583SAndroid Build Coastguard Worker
Cast(ApexPartition in)354*33f37583SAndroid Build Coastguard Worker static ::android::apex::ApexInfo::Partition Cast(ApexPartition in) {
355*33f37583SAndroid Build Coastguard Worker switch (in) {
356*33f37583SAndroid Build Coastguard Worker case ApexPartition::System:
357*33f37583SAndroid Build Coastguard Worker return ::android::apex::ApexInfo::Partition::SYSTEM;
358*33f37583SAndroid Build Coastguard Worker case ApexPartition::SystemExt:
359*33f37583SAndroid Build Coastguard Worker return ::android::apex::ApexInfo::Partition::SYSTEM_EXT;
360*33f37583SAndroid Build Coastguard Worker case ApexPartition::Product:
361*33f37583SAndroid Build Coastguard Worker return ::android::apex::ApexInfo::Partition::PRODUCT;
362*33f37583SAndroid Build Coastguard Worker case ApexPartition::Vendor:
363*33f37583SAndroid Build Coastguard Worker return ::android::apex::ApexInfo::Partition::VENDOR;
364*33f37583SAndroid Build Coastguard Worker case ApexPartition::Odm:
365*33f37583SAndroid Build Coastguard Worker return ::android::apex::ApexInfo::Partition::ODM;
366*33f37583SAndroid Build Coastguard Worker }
367*33f37583SAndroid Build Coastguard Worker }
368*33f37583SAndroid Build Coastguard Worker
GetApexInfo(const ApexFile & package)369*33f37583SAndroid Build Coastguard Worker static ApexInfo GetApexInfo(const ApexFile& package) {
370*33f37583SAndroid Build Coastguard Worker auto& instance = ApexFileRepository::GetInstance();
371*33f37583SAndroid Build Coastguard Worker ApexInfo out;
372*33f37583SAndroid Build Coastguard Worker out.moduleName = package.GetManifest().name();
373*33f37583SAndroid Build Coastguard Worker out.modulePath = package.GetPath();
374*33f37583SAndroid Build Coastguard Worker out.versionCode = package.GetManifest().version();
375*33f37583SAndroid Build Coastguard Worker out.versionName = package.GetManifest().versionname();
376*33f37583SAndroid Build Coastguard Worker out.isFactory = instance.IsPreInstalledApex(package);
377*33f37583SAndroid Build Coastguard Worker out.isActive = false;
378*33f37583SAndroid Build Coastguard Worker Result<std::string> preinstalled_path =
379*33f37583SAndroid Build Coastguard Worker instance.GetPreinstalledPath(package.GetManifest().name());
380*33f37583SAndroid Build Coastguard Worker if (preinstalled_path.ok()) {
381*33f37583SAndroid Build Coastguard Worker out.preinstalledModulePath = *preinstalled_path;
382*33f37583SAndroid Build Coastguard Worker }
383*33f37583SAndroid Build Coastguard Worker out.activeApexChanged = ::android::apex::IsActiveApexChanged(package);
384*33f37583SAndroid Build Coastguard Worker out.partition = Cast(OR_FATAL(instance.GetPartition(package)));
385*33f37583SAndroid Build Coastguard Worker return out;
386*33f37583SAndroid Build Coastguard Worker }
387*33f37583SAndroid Build Coastguard Worker
ToString(const ApexInfo & package)388*33f37583SAndroid Build Coastguard Worker static std::string ToString(const ApexInfo& package) {
389*33f37583SAndroid Build Coastguard Worker std::string msg =
390*33f37583SAndroid Build Coastguard Worker StringLog() << "Module: " << package.moduleName
391*33f37583SAndroid Build Coastguard Worker << " Version: " << package.versionCode
392*33f37583SAndroid Build Coastguard Worker << " VersionName: " << package.versionName
393*33f37583SAndroid Build Coastguard Worker << " Path: " << package.modulePath
394*33f37583SAndroid Build Coastguard Worker << " IsActive: " << std::boolalpha << package.isActive
395*33f37583SAndroid Build Coastguard Worker << " IsFactory: " << std::boolalpha << package.isFactory
396*33f37583SAndroid Build Coastguard Worker << " Partition: " << toString(package.partition) << std::endl;
397*33f37583SAndroid Build Coastguard Worker return msg;
398*33f37583SAndroid Build Coastguard Worker }
399*33f37583SAndroid Build Coastguard Worker
getSessions(std::vector<ApexSessionInfo> * aidl_return)400*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getSessions(
401*33f37583SAndroid Build Coastguard Worker std::vector<ApexSessionInfo>* aidl_return) {
402*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getSessions() received by ApexService";
403*33f37583SAndroid Build Coastguard Worker
404*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getSessions");
405*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
406*33f37583SAndroid Build Coastguard Worker return check;
407*33f37583SAndroid Build Coastguard Worker }
408*33f37583SAndroid Build Coastguard Worker
409*33f37583SAndroid Build Coastguard Worker auto sessions = GetSessionManager()->GetSessions();
410*33f37583SAndroid Build Coastguard Worker for (const auto& session : sessions) {
411*33f37583SAndroid Build Coastguard Worker ApexSessionInfo session_info;
412*33f37583SAndroid Build Coastguard Worker ConvertToApexSessionInfo(session, &session_info);
413*33f37583SAndroid Build Coastguard Worker aidl_return->push_back(session_info);
414*33f37583SAndroid Build Coastguard Worker }
415*33f37583SAndroid Build Coastguard Worker
416*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
417*33f37583SAndroid Build Coastguard Worker }
418*33f37583SAndroid Build Coastguard Worker
getStagedSessionInfo(int session_id,ApexSessionInfo * apex_session_info)419*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getStagedSessionInfo(
420*33f37583SAndroid Build Coastguard Worker int session_id, ApexSessionInfo* apex_session_info) {
421*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getStagedSessionInfo() received by ApexService, session id "
422*33f37583SAndroid Build Coastguard Worker << session_id;
423*33f37583SAndroid Build Coastguard Worker
424*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getStagedSessionInfo");
425*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
426*33f37583SAndroid Build Coastguard Worker return check;
427*33f37583SAndroid Build Coastguard Worker }
428*33f37583SAndroid Build Coastguard Worker
429*33f37583SAndroid Build Coastguard Worker auto session = GetSessionManager()->GetSession(session_id);
430*33f37583SAndroid Build Coastguard Worker if (!session.ok()) {
431*33f37583SAndroid Build Coastguard Worker // Unknown session.
432*33f37583SAndroid Build Coastguard Worker ClearSessionInfo(apex_session_info);
433*33f37583SAndroid Build Coastguard Worker apex_session_info->isUnknown = true;
434*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
435*33f37583SAndroid Build Coastguard Worker }
436*33f37583SAndroid Build Coastguard Worker
437*33f37583SAndroid Build Coastguard Worker ConvertToApexSessionInfo(*session, apex_session_info);
438*33f37583SAndroid Build Coastguard Worker
439*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
440*33f37583SAndroid Build Coastguard Worker }
441*33f37583SAndroid Build Coastguard Worker
getStagedApexInfos(const ApexSessionParams & params,std::vector<ApexInfo> * aidl_return)442*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getStagedApexInfos(
443*33f37583SAndroid Build Coastguard Worker const ApexSessionParams& params, std::vector<ApexInfo>* aidl_return) {
444*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getStagedApexInfos() received by ApexService, session id "
445*33f37583SAndroid Build Coastguard Worker << params.sessionId << " child sessions: ["
446*33f37583SAndroid Build Coastguard Worker << android::base::Join(params.childSessionIds, ',') << "]";
447*33f37583SAndroid Build Coastguard Worker
448*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getStagedApexInfos");
449*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
450*33f37583SAndroid Build Coastguard Worker return check;
451*33f37583SAndroid Build Coastguard Worker }
452*33f37583SAndroid Build Coastguard Worker
453*33f37583SAndroid Build Coastguard Worker Result<std::vector<ApexFile>> files = ::android::apex::GetStagedApexFiles(
454*33f37583SAndroid Build Coastguard Worker params.sessionId, params.childSessionIds);
455*33f37583SAndroid Build Coastguard Worker if (!files.ok()) {
456*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to getStagedApexInfo session id " << params.sessionId
457*33f37583SAndroid Build Coastguard Worker << ": " << files.error();
458*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
459*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
460*33f37583SAndroid Build Coastguard Worker String8(files.error().message().c_str()));
461*33f37583SAndroid Build Coastguard Worker }
462*33f37583SAndroid Build Coastguard Worker
463*33f37583SAndroid Build Coastguard Worker // Retrieve classpath information
464*33f37583SAndroid Build Coastguard Worker auto class_path = ::android::apex::MountAndDeriveClassPath(*files);
465*33f37583SAndroid Build Coastguard Worker if (!class_path.ok()) {
466*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to getStagedApexInfo session id " << params.sessionId
467*33f37583SAndroid Build Coastguard Worker << ": " << class_path.error();
468*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
469*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
470*33f37583SAndroid Build Coastguard Worker String8(class_path.error().message().c_str()));
471*33f37583SAndroid Build Coastguard Worker }
472*33f37583SAndroid Build Coastguard Worker
473*33f37583SAndroid Build Coastguard Worker for (const auto& apex_file : *files) {
474*33f37583SAndroid Build Coastguard Worker ApexInfo apex_info = GetApexInfo(apex_file);
475*33f37583SAndroid Build Coastguard Worker auto package_name = apex_info.moduleName;
476*33f37583SAndroid Build Coastguard Worker apex_info.hasClassPathJars = class_path->HasClassPathJars(package_name);
477*33f37583SAndroid Build Coastguard Worker aidl_return->push_back(std::move(apex_info));
478*33f37583SAndroid Build Coastguard Worker }
479*33f37583SAndroid Build Coastguard Worker
480*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
481*33f37583SAndroid Build Coastguard Worker }
482*33f37583SAndroid Build Coastguard Worker
getActivePackages(std::vector<ApexInfo> * aidl_return)483*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getActivePackages(
484*33f37583SAndroid Build Coastguard Worker std::vector<ApexInfo>* aidl_return) {
485*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getActivePackages received by ApexService";
486*33f37583SAndroid Build Coastguard Worker
487*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getActivePackages");
488*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
489*33f37583SAndroid Build Coastguard Worker return check;
490*33f37583SAndroid Build Coastguard Worker }
491*33f37583SAndroid Build Coastguard Worker
492*33f37583SAndroid Build Coastguard Worker auto packages = ::android::apex::GetActivePackages();
493*33f37583SAndroid Build Coastguard Worker for (const auto& package : packages) {
494*33f37583SAndroid Build Coastguard Worker ApexInfo apex_info = GetApexInfo(package);
495*33f37583SAndroid Build Coastguard Worker apex_info.isActive = true;
496*33f37583SAndroid Build Coastguard Worker aidl_return->push_back(std::move(apex_info));
497*33f37583SAndroid Build Coastguard Worker }
498*33f37583SAndroid Build Coastguard Worker
499*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
500*33f37583SAndroid Build Coastguard Worker }
501*33f37583SAndroid Build Coastguard Worker
getActivePackage(const std::string & package_name,ApexInfo * aidl_return)502*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getActivePackage(const std::string& package_name,
503*33f37583SAndroid Build Coastguard Worker ApexInfo* aidl_return) {
504*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getActivePackage received by ApexService package_name : "
505*33f37583SAndroid Build Coastguard Worker << package_name;
506*33f37583SAndroid Build Coastguard Worker
507*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getActivePackage");
508*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
509*33f37583SAndroid Build Coastguard Worker return check;
510*33f37583SAndroid Build Coastguard Worker }
511*33f37583SAndroid Build Coastguard Worker
512*33f37583SAndroid Build Coastguard Worker Result<ApexFile> apex = ::android::apex::GetActivePackage(package_name);
513*33f37583SAndroid Build Coastguard Worker if (apex.ok()) {
514*33f37583SAndroid Build Coastguard Worker *aidl_return = GetApexInfo(*apex);
515*33f37583SAndroid Build Coastguard Worker aidl_return->isActive = true;
516*33f37583SAndroid Build Coastguard Worker }
517*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
518*33f37583SAndroid Build Coastguard Worker }
519*33f37583SAndroid Build Coastguard Worker
getAllPackages(std::vector<ApexInfo> * aidl_return)520*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::getAllPackages(std::vector<ApexInfo>* aidl_return) {
521*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "getAllPackages received by ApexService";
522*33f37583SAndroid Build Coastguard Worker
523*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("getAllPackages");
524*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
525*33f37583SAndroid Build Coastguard Worker return check;
526*33f37583SAndroid Build Coastguard Worker }
527*33f37583SAndroid Build Coastguard Worker
528*33f37583SAndroid Build Coastguard Worker const auto& active = ::android::apex::GetActivePackages();
529*33f37583SAndroid Build Coastguard Worker const auto& factory = ::android::apex::GetFactoryPackages();
530*33f37583SAndroid Build Coastguard Worker for (const ApexFile& pkg : active) {
531*33f37583SAndroid Build Coastguard Worker ApexInfo apex_info = GetApexInfo(pkg);
532*33f37583SAndroid Build Coastguard Worker apex_info.isActive = true;
533*33f37583SAndroid Build Coastguard Worker aidl_return->push_back(std::move(apex_info));
534*33f37583SAndroid Build Coastguard Worker }
535*33f37583SAndroid Build Coastguard Worker for (const ApexFile& pkg : factory) {
536*33f37583SAndroid Build Coastguard Worker const auto& same_path = [&pkg](const auto& o) {
537*33f37583SAndroid Build Coastguard Worker return o.GetPath() == pkg.GetPath();
538*33f37583SAndroid Build Coastguard Worker };
539*33f37583SAndroid Build Coastguard Worker if (std::find_if(active.begin(), active.end(), same_path) == active.end()) {
540*33f37583SAndroid Build Coastguard Worker aidl_return->push_back(GetApexInfo(pkg));
541*33f37583SAndroid Build Coastguard Worker }
542*33f37583SAndroid Build Coastguard Worker }
543*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
544*33f37583SAndroid Build Coastguard Worker }
545*33f37583SAndroid Build Coastguard Worker
installAndActivatePackage(const std::string & package_path,bool force,ApexInfo * aidl_return)546*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::installAndActivatePackage(
547*33f37583SAndroid Build Coastguard Worker const std::string& package_path, bool force, ApexInfo* aidl_return) {
548*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "installAndActivatePackage() received by ApexService, path: "
549*33f37583SAndroid Build Coastguard Worker << package_path << " force : " << force;
550*33f37583SAndroid Build Coastguard Worker
551*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("installAndActivatePackage");
552*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
553*33f37583SAndroid Build Coastguard Worker return check;
554*33f37583SAndroid Build Coastguard Worker }
555*33f37583SAndroid Build Coastguard Worker
556*33f37583SAndroid Build Coastguard Worker if (force) {
557*33f37583SAndroid Build Coastguard Worker auto debug_check = CheckDebuggable("Forced non-staged APEX update");
558*33f37583SAndroid Build Coastguard Worker if (!debug_check.isOk()) {
559*33f37583SAndroid Build Coastguard Worker return debug_check;
560*33f37583SAndroid Build Coastguard Worker }
561*33f37583SAndroid Build Coastguard Worker }
562*33f37583SAndroid Build Coastguard Worker
563*33f37583SAndroid Build Coastguard Worker auto res = InstallPackage(package_path, force);
564*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
565*33f37583SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to install package " << package_path << " : "
566*33f37583SAndroid Build Coastguard Worker << res.error();
567*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
568*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
569*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
570*33f37583SAndroid Build Coastguard Worker }
571*33f37583SAndroid Build Coastguard Worker *aidl_return = GetApexInfo(*res);
572*33f37583SAndroid Build Coastguard Worker aidl_return->isActive = true;
573*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
574*33f37583SAndroid Build Coastguard Worker }
575*33f37583SAndroid Build Coastguard Worker
abortStagedSession(int session_id)576*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::abortStagedSession(int session_id) {
577*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "abortStagedSession() received by ApexService session : "
578*33f37583SAndroid Build Coastguard Worker << session_id;
579*33f37583SAndroid Build Coastguard Worker
580*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("abortStagedSession");
581*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
582*33f37583SAndroid Build Coastguard Worker return check;
583*33f37583SAndroid Build Coastguard Worker }
584*33f37583SAndroid Build Coastguard Worker
585*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::AbortStagedSession(session_id);
586*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
587*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
588*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_ILLEGAL_ARGUMENT,
589*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
590*33f37583SAndroid Build Coastguard Worker }
591*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
592*33f37583SAndroid Build Coastguard Worker }
593*33f37583SAndroid Build Coastguard Worker
revertActiveSessions()594*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::revertActiveSessions() {
595*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "revertActiveSessions() received by ApexService.";
596*33f37583SAndroid Build Coastguard Worker
597*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("revertActiveSessions");
598*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
599*33f37583SAndroid Build Coastguard Worker return check;
600*33f37583SAndroid Build Coastguard Worker }
601*33f37583SAndroid Build Coastguard Worker
602*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::RevertActiveSessions("", "");
603*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
604*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
605*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_ILLEGAL_ARGUMENT,
606*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
607*33f37583SAndroid Build Coastguard Worker }
608*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
609*33f37583SAndroid Build Coastguard Worker }
610*33f37583SAndroid Build Coastguard Worker
resumeRevertIfNeeded()611*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::resumeRevertIfNeeded() {
612*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "resumeRevertIfNeeded() received by ApexService.";
613*33f37583SAndroid Build Coastguard Worker
614*33f37583SAndroid Build Coastguard Worker BinderStatus debug_check = CheckDebuggable("resumeRevertIfNeeded");
615*33f37583SAndroid Build Coastguard Worker if (!debug_check.isOk()) {
616*33f37583SAndroid Build Coastguard Worker return debug_check;
617*33f37583SAndroid Build Coastguard Worker }
618*33f37583SAndroid Build Coastguard Worker
619*33f37583SAndroid Build Coastguard Worker auto root_check = CheckCallerIsRoot("resumeRevertIfNeeded");
620*33f37583SAndroid Build Coastguard Worker if (!root_check.isOk()) {
621*33f37583SAndroid Build Coastguard Worker return root_check;
622*33f37583SAndroid Build Coastguard Worker }
623*33f37583SAndroid Build Coastguard Worker
624*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::ResumeRevertIfNeeded();
625*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
626*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
627*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_ILLEGAL_ARGUMENT,
628*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
629*33f37583SAndroid Build Coastguard Worker }
630*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
631*33f37583SAndroid Build Coastguard Worker }
632*33f37583SAndroid Build Coastguard Worker
snapshotCeData(int user_id,int rollback_id,const std::string & apex_name)633*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::snapshotCeData(int user_id, int rollback_id,
634*33f37583SAndroid Build Coastguard Worker const std::string& apex_name) {
635*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "snapshotCeData() received by ApexService user_id : " << user_id
636*33f37583SAndroid Build Coastguard Worker << " rollback_id : " << rollback_id << " apex_name : " << apex_name;
637*33f37583SAndroid Build Coastguard Worker
638*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("snapshotCeData");
639*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
640*33f37583SAndroid Build Coastguard Worker return check;
641*33f37583SAndroid Build Coastguard Worker }
642*33f37583SAndroid Build Coastguard Worker
643*33f37583SAndroid Build Coastguard Worker Result<void> res =
644*33f37583SAndroid Build Coastguard Worker ::android::apex::SnapshotCeData(user_id, rollback_id, apex_name);
645*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
646*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
647*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
648*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
649*33f37583SAndroid Build Coastguard Worker }
650*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
651*33f37583SAndroid Build Coastguard Worker }
652*33f37583SAndroid Build Coastguard Worker
restoreCeData(int user_id,int rollback_id,const std::string & apex_name)653*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::restoreCeData(int user_id, int rollback_id,
654*33f37583SAndroid Build Coastguard Worker const std::string& apex_name) {
655*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "restoreCeData() received by ApexService user_id : " << user_id
656*33f37583SAndroid Build Coastguard Worker << " rollback_id : " << rollback_id << " apex_name : " << apex_name;
657*33f37583SAndroid Build Coastguard Worker
658*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("restoreCeData");
659*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
660*33f37583SAndroid Build Coastguard Worker return check;
661*33f37583SAndroid Build Coastguard Worker }
662*33f37583SAndroid Build Coastguard Worker
663*33f37583SAndroid Build Coastguard Worker Result<void> res =
664*33f37583SAndroid Build Coastguard Worker ::android::apex::RestoreCeData(user_id, rollback_id, apex_name);
665*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
666*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
667*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
668*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
669*33f37583SAndroid Build Coastguard Worker }
670*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
671*33f37583SAndroid Build Coastguard Worker }
672*33f37583SAndroid Build Coastguard Worker
destroyDeSnapshots(int rollback_id)673*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::destroyDeSnapshots(int rollback_id) {
674*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "destroyDeSnapshots() received by ApexService rollback_id : "
675*33f37583SAndroid Build Coastguard Worker << rollback_id;
676*33f37583SAndroid Build Coastguard Worker
677*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("destroyDeSnapshots");
678*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
679*33f37583SAndroid Build Coastguard Worker return check;
680*33f37583SAndroid Build Coastguard Worker }
681*33f37583SAndroid Build Coastguard Worker
682*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::DestroyDeSnapshots(rollback_id);
683*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
684*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
685*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
686*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
687*33f37583SAndroid Build Coastguard Worker }
688*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
689*33f37583SAndroid Build Coastguard Worker }
690*33f37583SAndroid Build Coastguard Worker
destroyCeSnapshots(int user_id,int rollback_id)691*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::destroyCeSnapshots(int user_id, int rollback_id) {
692*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "destroyCeSnapshots() received by ApexService user_id : "
693*33f37583SAndroid Build Coastguard Worker << user_id << " rollback_id : " << rollback_id;
694*33f37583SAndroid Build Coastguard Worker
695*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("destroyCeSnapshots");
696*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
697*33f37583SAndroid Build Coastguard Worker return check;
698*33f37583SAndroid Build Coastguard Worker }
699*33f37583SAndroid Build Coastguard Worker
700*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::DestroyCeSnapshots(user_id, rollback_id);
701*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
702*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
703*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
704*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
705*33f37583SAndroid Build Coastguard Worker }
706*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
707*33f37583SAndroid Build Coastguard Worker }
708*33f37583SAndroid Build Coastguard Worker
destroyCeSnapshotsNotSpecified(int user_id,const std::vector<int> & retain_rollback_ids)709*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::destroyCeSnapshotsNotSpecified(
710*33f37583SAndroid Build Coastguard Worker int user_id, const std::vector<int>& retain_rollback_ids) {
711*33f37583SAndroid Build Coastguard Worker LOG(INFO)
712*33f37583SAndroid Build Coastguard Worker << "destroyCeSnapshotsNotSpecified() received by ApexService user_id : "
713*33f37583SAndroid Build Coastguard Worker << user_id << " retain_rollback_ids : [" << Join(retain_rollback_ids, ',')
714*33f37583SAndroid Build Coastguard Worker << "]";
715*33f37583SAndroid Build Coastguard Worker
716*33f37583SAndroid Build Coastguard Worker auto check = CheckCallerSystemOrRoot("destroyCeSnapshotsNotSpecified");
717*33f37583SAndroid Build Coastguard Worker if (!check.isOk()) {
718*33f37583SAndroid Build Coastguard Worker return check;
719*33f37583SAndroid Build Coastguard Worker }
720*33f37583SAndroid Build Coastguard Worker
721*33f37583SAndroid Build Coastguard Worker Result<void> res = ::android::apex::DestroyCeSnapshotsNotSpecified(
722*33f37583SAndroid Build Coastguard Worker user_id, retain_rollback_ids);
723*33f37583SAndroid Build Coastguard Worker if (!res.ok()) {
724*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
725*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
726*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
727*33f37583SAndroid Build Coastguard Worker }
728*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
729*33f37583SAndroid Build Coastguard Worker }
730*33f37583SAndroid Build Coastguard Worker
recollectPreinstalledData()731*33f37583SAndroid Build Coastguard Worker BinderStatus ApexService::recollectPreinstalledData() {
732*33f37583SAndroid Build Coastguard Worker LOG(INFO) << "recollectPreinstalledData() received by ApexService";
733*33f37583SAndroid Build Coastguard Worker
734*33f37583SAndroid Build Coastguard Worker if (auto debug = CheckDebuggable("recollectPreinstalledData");
735*33f37583SAndroid Build Coastguard Worker !debug.isOk()) {
736*33f37583SAndroid Build Coastguard Worker return debug;
737*33f37583SAndroid Build Coastguard Worker }
738*33f37583SAndroid Build Coastguard Worker if (auto root = CheckCallerIsRoot("recollectPreinstalledData");
739*33f37583SAndroid Build Coastguard Worker !root.isOk()) {
740*33f37583SAndroid Build Coastguard Worker return root;
741*33f37583SAndroid Build Coastguard Worker }
742*33f37583SAndroid Build Coastguard Worker
743*33f37583SAndroid Build Coastguard Worker ApexFileRepository& instance = ApexFileRepository::GetInstance();
744*33f37583SAndroid Build Coastguard Worker if (auto res = instance.AddPreInstalledApex(kBuiltinApexPackageDirs);
745*33f37583SAndroid Build Coastguard Worker !res.ok()) {
746*33f37583SAndroid Build Coastguard Worker return BinderStatus::fromExceptionCode(
747*33f37583SAndroid Build Coastguard Worker BinderStatus::EX_SERVICE_SPECIFIC,
748*33f37583SAndroid Build Coastguard Worker String8(res.error().message().c_str()));
749*33f37583SAndroid Build Coastguard Worker }
750*33f37583SAndroid Build Coastguard Worker return BinderStatus::ok();
751*33f37583SAndroid Build Coastguard Worker }
752*33f37583SAndroid Build Coastguard Worker
onTransact(uint32_t _aidl_code,const Parcel & _aidl_data,Parcel * _aidl_reply,uint32_t _aidl_flags)753*33f37583SAndroid Build Coastguard Worker status_t ApexService::onTransact(uint32_t _aidl_code, const Parcel& _aidl_data,
754*33f37583SAndroid Build Coastguard Worker Parcel* _aidl_reply, uint32_t _aidl_flags) {
755*33f37583SAndroid Build Coastguard Worker switch (_aidl_code) {
756*33f37583SAndroid Build Coastguard Worker case IBinder::SHELL_COMMAND_TRANSACTION: {
757*33f37583SAndroid Build Coastguard Worker int in = _aidl_data.readFileDescriptor();
758*33f37583SAndroid Build Coastguard Worker int out = _aidl_data.readFileDescriptor();
759*33f37583SAndroid Build Coastguard Worker int err = _aidl_data.readFileDescriptor();
760*33f37583SAndroid Build Coastguard Worker int argc = _aidl_data.readInt32();
761*33f37583SAndroid Build Coastguard Worker Vector<String16> args;
762*33f37583SAndroid Build Coastguard Worker for (int i = 0; i < argc && _aidl_data.dataAvail() > 0; i++) {
763*33f37583SAndroid Build Coastguard Worker args.add(_aidl_data.readString16());
764*33f37583SAndroid Build Coastguard Worker }
765*33f37583SAndroid Build Coastguard Worker sp<IBinder> unused_callback;
766*33f37583SAndroid Build Coastguard Worker sp<IResultReceiver> result_receiver;
767*33f37583SAndroid Build Coastguard Worker status_t status;
768*33f37583SAndroid Build Coastguard Worker if ((status = _aidl_data.readNullableStrongBinder(&unused_callback)) !=
769*33f37583SAndroid Build Coastguard Worker OK)
770*33f37583SAndroid Build Coastguard Worker return status;
771*33f37583SAndroid Build Coastguard Worker if ((status = _aidl_data.readNullableStrongBinder(&result_receiver)) !=
772*33f37583SAndroid Build Coastguard Worker OK)
773*33f37583SAndroid Build Coastguard Worker return status;
774*33f37583SAndroid Build Coastguard Worker status = shellCommand(in, out, err, args);
775*33f37583SAndroid Build Coastguard Worker if (result_receiver != nullptr) {
776*33f37583SAndroid Build Coastguard Worker result_receiver->send(status);
777*33f37583SAndroid Build Coastguard Worker }
778*33f37583SAndroid Build Coastguard Worker return OK;
779*33f37583SAndroid Build Coastguard Worker }
780*33f37583SAndroid Build Coastguard Worker }
781*33f37583SAndroid Build Coastguard Worker return BnApexService::onTransact(_aidl_code, _aidl_data, _aidl_reply,
782*33f37583SAndroid Build Coastguard Worker _aidl_flags);
783*33f37583SAndroid Build Coastguard Worker }
dump(int fd,const Vector<String16> &)784*33f37583SAndroid Build Coastguard Worker status_t ApexService::dump(int fd, const Vector<String16>& /*args*/) {
785*33f37583SAndroid Build Coastguard Worker std::vector<ApexInfo> list;
786*33f37583SAndroid Build Coastguard Worker BinderStatus status = getActivePackages(&list);
787*33f37583SAndroid Build Coastguard Worker dprintf(fd, "ACTIVE PACKAGES:\n");
788*33f37583SAndroid Build Coastguard Worker if (!status.isOk()) {
789*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog() << "Failed to retrieve packages: "
790*33f37583SAndroid Build Coastguard Worker << status.toString8().c_str() << std::endl;
791*33f37583SAndroid Build Coastguard Worker dprintf(fd, "%s", msg.c_str());
792*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
793*33f37583SAndroid Build Coastguard Worker } else {
794*33f37583SAndroid Build Coastguard Worker for (const auto& item : list) {
795*33f37583SAndroid Build Coastguard Worker std::string msg = ToString(item);
796*33f37583SAndroid Build Coastguard Worker dprintf(fd, "%s", msg.c_str());
797*33f37583SAndroid Build Coastguard Worker }
798*33f37583SAndroid Build Coastguard Worker }
799*33f37583SAndroid Build Coastguard Worker
800*33f37583SAndroid Build Coastguard Worker dprintf(fd, "SESSIONS:\n");
801*33f37583SAndroid Build Coastguard Worker std::vector<ApexSession> sessions = GetSessionManager()->GetSessions();
802*33f37583SAndroid Build Coastguard Worker
803*33f37583SAndroid Build Coastguard Worker for (const auto& session : sessions) {
804*33f37583SAndroid Build Coastguard Worker std::string child_ids_str = "";
805*33f37583SAndroid Build Coastguard Worker auto child_ids = session.GetChildSessionIds();
806*33f37583SAndroid Build Coastguard Worker if (child_ids.size() > 0) {
807*33f37583SAndroid Build Coastguard Worker child_ids_str = "Child IDs:";
808*33f37583SAndroid Build Coastguard Worker for (auto childSessionId : session.GetChildSessionIds()) {
809*33f37583SAndroid Build Coastguard Worker child_ids_str += " " + std::to_string(childSessionId);
810*33f37583SAndroid Build Coastguard Worker }
811*33f37583SAndroid Build Coastguard Worker }
812*33f37583SAndroid Build Coastguard Worker std::string revert_reason = "";
813*33f37583SAndroid Build Coastguard Worker const auto& crashing_native_process = session.GetCrashingNativeProcess();
814*33f37583SAndroid Build Coastguard Worker if (!crashing_native_process.empty()) {
815*33f37583SAndroid Build Coastguard Worker revert_reason = " Revert Reason: " + crashing_native_process;
816*33f37583SAndroid Build Coastguard Worker }
817*33f37583SAndroid Build Coastguard Worker std::string error_message_dump = "";
818*33f37583SAndroid Build Coastguard Worker const auto& error_message = session.GetErrorMessage();
819*33f37583SAndroid Build Coastguard Worker if (!error_message.empty()) {
820*33f37583SAndroid Build Coastguard Worker error_message_dump = " Error Message: " + error_message;
821*33f37583SAndroid Build Coastguard Worker }
822*33f37583SAndroid Build Coastguard Worker std::string msg =
823*33f37583SAndroid Build Coastguard Worker StringLog() << "Session ID: " << session.GetId() << child_ids_str
824*33f37583SAndroid Build Coastguard Worker << " State: " << SessionState_State_Name(session.GetState())
825*33f37583SAndroid Build Coastguard Worker << revert_reason << error_message_dump << std::endl;
826*33f37583SAndroid Build Coastguard Worker dprintf(fd, "%s", msg.c_str());
827*33f37583SAndroid Build Coastguard Worker }
828*33f37583SAndroid Build Coastguard Worker
829*33f37583SAndroid Build Coastguard Worker return OK;
830*33f37583SAndroid Build Coastguard Worker }
831*33f37583SAndroid Build Coastguard Worker
shellCommand(int in,int out,int err,const Vector<String16> & args)832*33f37583SAndroid Build Coastguard Worker status_t ApexService::shellCommand(int in, int out, int err,
833*33f37583SAndroid Build Coastguard Worker const Vector<String16>& args) {
834*33f37583SAndroid Build Coastguard Worker if (in == BAD_TYPE || out == BAD_TYPE || err == BAD_TYPE) {
835*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
836*33f37583SAndroid Build Coastguard Worker }
837*33f37583SAndroid Build Coastguard Worker auto print_help = [](int fd, const char* prefix = nullptr) {
838*33f37583SAndroid Build Coastguard Worker StringLog log;
839*33f37583SAndroid Build Coastguard Worker if (prefix != nullptr) {
840*33f37583SAndroid Build Coastguard Worker log << prefix << std::endl;
841*33f37583SAndroid Build Coastguard Worker }
842*33f37583SAndroid Build Coastguard Worker log << "ApexService:" << std::endl
843*33f37583SAndroid Build Coastguard Worker << " help - display this help" << std::endl
844*33f37583SAndroid Build Coastguard Worker << " getActivePackage [package_name] - return info for active package "
845*33f37583SAndroid Build Coastguard Worker "with given name, if present"
846*33f37583SAndroid Build Coastguard Worker << std::endl
847*33f37583SAndroid Build Coastguard Worker << " getAllPackages - return the list of all packages" << std::endl
848*33f37583SAndroid Build Coastguard Worker << " getActivePackages - return the list of active packages"
849*33f37583SAndroid Build Coastguard Worker << std::endl
850*33f37583SAndroid Build Coastguard Worker << " getStagedSessionInfo [sessionId] - displays information about a "
851*33f37583SAndroid Build Coastguard Worker "given session previously submitted"
852*33f37583SAndroid Build Coastguard Worker << std::endl;
853*33f37583SAndroid Build Coastguard Worker dprintf(fd, "%s", log.operator std::string().c_str());
854*33f37583SAndroid Build Coastguard Worker };
855*33f37583SAndroid Build Coastguard Worker
856*33f37583SAndroid Build Coastguard Worker if (args.size() == 0) {
857*33f37583SAndroid Build Coastguard Worker print_help(err, "No command given");
858*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
859*33f37583SAndroid Build Coastguard Worker }
860*33f37583SAndroid Build Coastguard Worker
861*33f37583SAndroid Build Coastguard Worker const String16& cmd = args[0];
862*33f37583SAndroid Build Coastguard Worker
863*33f37583SAndroid Build Coastguard Worker if (cmd == String16("getAllPackages")) {
864*33f37583SAndroid Build Coastguard Worker if (args.size() != 1) {
865*33f37583SAndroid Build Coastguard Worker print_help(err, "Unrecognized options");
866*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
867*33f37583SAndroid Build Coastguard Worker }
868*33f37583SAndroid Build Coastguard Worker std::vector<ApexInfo> list;
869*33f37583SAndroid Build Coastguard Worker BinderStatus status = getAllPackages(&list);
870*33f37583SAndroid Build Coastguard Worker if (status.isOk()) {
871*33f37583SAndroid Build Coastguard Worker for (const auto& item : list) {
872*33f37583SAndroid Build Coastguard Worker std::string msg = ToString(item);
873*33f37583SAndroid Build Coastguard Worker dprintf(out, "%s", msg.c_str());
874*33f37583SAndroid Build Coastguard Worker }
875*33f37583SAndroid Build Coastguard Worker return OK;
876*33f37583SAndroid Build Coastguard Worker }
877*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog() << "Failed to retrieve packages: "
878*33f37583SAndroid Build Coastguard Worker << status.toString8().c_str() << std::endl;
879*33f37583SAndroid Build Coastguard Worker dprintf(err, "%s", msg.c_str());
880*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
881*33f37583SAndroid Build Coastguard Worker }
882*33f37583SAndroid Build Coastguard Worker
883*33f37583SAndroid Build Coastguard Worker if (cmd == String16("getActivePackages")) {
884*33f37583SAndroid Build Coastguard Worker if (args.size() != 1) {
885*33f37583SAndroid Build Coastguard Worker print_help(err, "Unrecognized options");
886*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
887*33f37583SAndroid Build Coastguard Worker }
888*33f37583SAndroid Build Coastguard Worker std::vector<ApexInfo> list;
889*33f37583SAndroid Build Coastguard Worker BinderStatus status = getActivePackages(&list);
890*33f37583SAndroid Build Coastguard Worker if (status.isOk()) {
891*33f37583SAndroid Build Coastguard Worker for (const auto& item : list) {
892*33f37583SAndroid Build Coastguard Worker std::string msg = ToString(item);
893*33f37583SAndroid Build Coastguard Worker dprintf(out, "%s", msg.c_str());
894*33f37583SAndroid Build Coastguard Worker }
895*33f37583SAndroid Build Coastguard Worker return OK;
896*33f37583SAndroid Build Coastguard Worker }
897*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog() << "Failed to retrieve packages: "
898*33f37583SAndroid Build Coastguard Worker << status.toString8().c_str() << std::endl;
899*33f37583SAndroid Build Coastguard Worker dprintf(err, "%s", msg.c_str());
900*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
901*33f37583SAndroid Build Coastguard Worker }
902*33f37583SAndroid Build Coastguard Worker
903*33f37583SAndroid Build Coastguard Worker if (cmd == String16("getActivePackage")) {
904*33f37583SAndroid Build Coastguard Worker if (args.size() != 2) {
905*33f37583SAndroid Build Coastguard Worker print_help(err, "Unrecognized options");
906*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
907*33f37583SAndroid Build Coastguard Worker }
908*33f37583SAndroid Build Coastguard Worker
909*33f37583SAndroid Build Coastguard Worker ApexInfo package;
910*33f37583SAndroid Build Coastguard Worker BinderStatus status = getActivePackage(String8(args[1]).c_str(), &package);
911*33f37583SAndroid Build Coastguard Worker if (status.isOk()) {
912*33f37583SAndroid Build Coastguard Worker std::string msg = ToString(package);
913*33f37583SAndroid Build Coastguard Worker dprintf(out, "%s", msg.c_str());
914*33f37583SAndroid Build Coastguard Worker return OK;
915*33f37583SAndroid Build Coastguard Worker }
916*33f37583SAndroid Build Coastguard Worker
917*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog()
918*33f37583SAndroid Build Coastguard Worker << "Failed to fetch active package: "
919*33f37583SAndroid Build Coastguard Worker << String8(args[1]).c_str()
920*33f37583SAndroid Build Coastguard Worker << ", error: " << status.toString8().c_str() << std::endl;
921*33f37583SAndroid Build Coastguard Worker dprintf(err, "%s", msg.c_str());
922*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
923*33f37583SAndroid Build Coastguard Worker }
924*33f37583SAndroid Build Coastguard Worker
925*33f37583SAndroid Build Coastguard Worker if (cmd == String16("getStagedSessionInfo")) {
926*33f37583SAndroid Build Coastguard Worker if (args.size() != 2) {
927*33f37583SAndroid Build Coastguard Worker print_help(err, "getStagedSessionInfo requires one session id");
928*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
929*33f37583SAndroid Build Coastguard Worker }
930*33f37583SAndroid Build Coastguard Worker int session_id = strtol(String8(args[1]).c_str(), nullptr, 10);
931*33f37583SAndroid Build Coastguard Worker if (session_id < 0) {
932*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog()
933*33f37583SAndroid Build Coastguard Worker << "Failed to parse session id. Must be an integer.";
934*33f37583SAndroid Build Coastguard Worker dprintf(err, "%s", msg.c_str());
935*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
936*33f37583SAndroid Build Coastguard Worker }
937*33f37583SAndroid Build Coastguard Worker
938*33f37583SAndroid Build Coastguard Worker ApexSessionInfo session_info;
939*33f37583SAndroid Build Coastguard Worker BinderStatus status = getStagedSessionInfo(session_id, &session_info);
940*33f37583SAndroid Build Coastguard Worker if (status.isOk()) {
941*33f37583SAndroid Build Coastguard Worker std::string revert_reason = "";
942*33f37583SAndroid Build Coastguard Worker std::string crashing_native_process = session_info.crashingNativeProcess;
943*33f37583SAndroid Build Coastguard Worker if (!crashing_native_process.empty()) {
944*33f37583SAndroid Build Coastguard Worker revert_reason = " revertReason: " + crashing_native_process;
945*33f37583SAndroid Build Coastguard Worker }
946*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog()
947*33f37583SAndroid Build Coastguard Worker << "session_info: "
948*33f37583SAndroid Build Coastguard Worker << " isUnknown: " << session_info.isUnknown
949*33f37583SAndroid Build Coastguard Worker << " isVerified: " << session_info.isVerified
950*33f37583SAndroid Build Coastguard Worker << " isStaged: " << session_info.isStaged
951*33f37583SAndroid Build Coastguard Worker << " isActivated: " << session_info.isActivated
952*33f37583SAndroid Build Coastguard Worker << " isActivationFailed: "
953*33f37583SAndroid Build Coastguard Worker << session_info.isActivationFailed << revert_reason
954*33f37583SAndroid Build Coastguard Worker << std::endl;
955*33f37583SAndroid Build Coastguard Worker dprintf(out, "%s", msg.c_str());
956*33f37583SAndroid Build Coastguard Worker return OK;
957*33f37583SAndroid Build Coastguard Worker }
958*33f37583SAndroid Build Coastguard Worker std::string msg = StringLog() << "Failed to query session: "
959*33f37583SAndroid Build Coastguard Worker << status.toString8().c_str() << std::endl;
960*33f37583SAndroid Build Coastguard Worker dprintf(err, "%s", msg.c_str());
961*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
962*33f37583SAndroid Build Coastguard Worker }
963*33f37583SAndroid Build Coastguard Worker
964*33f37583SAndroid Build Coastguard Worker if (cmd == String16("help")) {
965*33f37583SAndroid Build Coastguard Worker if (args.size() != 1) {
966*33f37583SAndroid Build Coastguard Worker print_help(err, "Help has no options");
967*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
968*33f37583SAndroid Build Coastguard Worker }
969*33f37583SAndroid Build Coastguard Worker print_help(out);
970*33f37583SAndroid Build Coastguard Worker return OK;
971*33f37583SAndroid Build Coastguard Worker }
972*33f37583SAndroid Build Coastguard Worker
973*33f37583SAndroid Build Coastguard Worker print_help(err);
974*33f37583SAndroid Build Coastguard Worker return BAD_VALUE;
975*33f37583SAndroid Build Coastguard Worker }
976*33f37583SAndroid Build Coastguard Worker
977*33f37583SAndroid Build Coastguard Worker } // namespace
978*33f37583SAndroid Build Coastguard Worker
979*33f37583SAndroid Build Coastguard Worker static constexpr const char* kApexServiceName = "apexservice";
980*33f37583SAndroid Build Coastguard Worker
981*33f37583SAndroid Build Coastguard Worker using android::IPCThreadState;
982*33f37583SAndroid Build Coastguard Worker using android::ProcessState;
983*33f37583SAndroid Build Coastguard Worker using android::sp;
984*33f37583SAndroid Build Coastguard Worker using android::binder::LazyServiceRegistrar;
985*33f37583SAndroid Build Coastguard Worker
CreateAndRegisterService()986*33f37583SAndroid Build Coastguard Worker void CreateAndRegisterService() {
987*33f37583SAndroid Build Coastguard Worker sp<ProcessState> ps(ProcessState::self());
988*33f37583SAndroid Build Coastguard Worker
989*33f37583SAndroid Build Coastguard Worker // Create binder service and register with LazyServiceRegistrar
990*33f37583SAndroid Build Coastguard Worker sp<ApexService> apex_service = sp<ApexService>::make();
991*33f37583SAndroid Build Coastguard Worker auto lazy_registrar = LazyServiceRegistrar::getInstance();
992*33f37583SAndroid Build Coastguard Worker lazy_registrar.forcePersist(true);
993*33f37583SAndroid Build Coastguard Worker lazy_registrar.registerService(apex_service, kApexServiceName);
994*33f37583SAndroid Build Coastguard Worker }
995*33f37583SAndroid Build Coastguard Worker
AllowServiceShutdown()996*33f37583SAndroid Build Coastguard Worker void AllowServiceShutdown() {
997*33f37583SAndroid Build Coastguard Worker auto lazy_registrar = LazyServiceRegistrar::getInstance();
998*33f37583SAndroid Build Coastguard Worker lazy_registrar.forcePersist(false);
999*33f37583SAndroid Build Coastguard Worker }
1000*33f37583SAndroid Build Coastguard Worker
StartThreadPool()1001*33f37583SAndroid Build Coastguard Worker void StartThreadPool() {
1002*33f37583SAndroid Build Coastguard Worker sp<ProcessState> ps(ProcessState::self());
1003*33f37583SAndroid Build Coastguard Worker
1004*33f37583SAndroid Build Coastguard Worker // Start threadpool, wait for IPC
1005*33f37583SAndroid Build Coastguard Worker ps->startThreadPool();
1006*33f37583SAndroid Build Coastguard Worker }
1007*33f37583SAndroid Build Coastguard Worker
JoinThreadPool()1008*33f37583SAndroid Build Coastguard Worker void JoinThreadPool() {
1009*33f37583SAndroid Build Coastguard Worker IPCThreadState::self()->joinThreadPool(); // should not return
1010*33f37583SAndroid Build Coastguard Worker }
1011*33f37583SAndroid Build Coastguard Worker
1012*33f37583SAndroid Build Coastguard Worker } // namespace binder
1013*33f37583SAndroid Build Coastguard Worker } // namespace apex
1014*33f37583SAndroid Build Coastguard Worker } // namespace android
1015