/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "apexd"
#include <strings.h>
#include <android-base/logging.h>
#include "apexd.h"
#include "apexd_checkpoint_vold.h"
#include "apexd_prepostinstall.h"
#include "apexd_prop.h"
#include "apexservice.h"
#include "status_or.h"
#include <android-base/properties.h>
namespace {
int HandleSubcommand(char** argv) {
if (strcmp("--pre-install", argv[1]) == 0) {
LOG(INFO) << "Preinstall subcommand detected";
return android::apex::RunPreInstall(argv);
}
if (strcmp("--post-install", argv[1]) == 0) {
LOG(INFO) << "Postinstall subcommand detected";
return android::apex::RunPostInstall(argv);
}
if (strcmp("--bootstrap", argv[1]) == 0) {
LOG(INFO) << "Bootstrap subcommand detected";
return android::apex::onBootstrap();
}
LOG(ERROR) << "Unknown subcommand: " << argv[1];
return 1;
}
struct CombinedLogger {
android::base::LogdLogger logd;
CombinedLogger() {}
void operator()(android::base::LogId id, android::base::LogSeverity severity,
const char* tag, const char* file, unsigned int line,
const char* message) {
logd(id, severity, tag, file, line, message);
KernelLogger(id, severity, tag, file, line, message);
}
};
} // namespace
int main(int /*argc*/, char** argv) {
// Use CombinedLogger to also log to the kernel log.
android::base::InitLogging(argv, CombinedLogger());
if (argv[1] != nullptr) {
return HandleSubcommand(argv);
}
// TODO: add a -v flag or an external setting to change LogSeverity.
android::base::SetMinimumLogSeverity(android::base::VERBOSE);
android::apex::StatusOr<android::apex::VoldCheckpointInterface>
vold_service_st = android::apex::VoldCheckpointInterface::Create();
android::apex::VoldCheckpointInterface* vold_service = nullptr;
if (!vold_service_st.Ok()) {
LOG(ERROR) << "Could not retrieve vold service: "
<< vold_service_st.ErrorMessage();
} else {
vold_service = &*vold_service_st;
}
android::apex::onStart(vold_service);
android::apex::binder::CreateAndRegisterService();
android::apex::binder::StartThreadPool();
// Notify other components (e.g. init) that all APEXs are correctly mounted
// and are ready to be used. Note that it's important that the binder service
// is registered at this point, since other system services might depend on
// it.
android::apex::onAllPackagesReady();
android::apex::waitForBootStatus(
android::apex::rollbackActiveSessionAndReboot,
android::apex::unmountDanglingMounts);
android::apex::binder::JoinThreadPool();
return 1;
}