diff options
author | Nandana Dutt <nandana@google.com> | 2018-11-19 16:02:43 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-11-19 16:02:43 +0000 |
commit | c6ad682a81c32514162311115426e966b447d4f5 (patch) | |
tree | 3a11e69b1f8544887eff7a2f93ff61a70908cad7 | |
parent | 6d4c9406d97cdbcd19ad928ec0bd4dea3f3f018b (diff) | |
parent | 197661dc27244177f08e82455c6d874fa72ba79f (diff) | |
download | native-c6ad682a81c32514162311115426e966b447d4f5.tar.gz |
Merge "Implement startBugreport binder function"
-rw-r--r-- | cmds/dumpstate/DumpstateService.cpp | 47 | ||||
-rw-r--r-- | cmds/dumpstate/DumpstateService.h | 3 | ||||
-rw-r--r-- | cmds/dumpstate/binder/android/os/IDumpstate.aidl | 25 | ||||
-rw-r--r-- | cmds/dumpstate/dumpstate.cpp | 14 | ||||
-rw-r--r-- | cmds/dumpstate/dumpstate.h | 21 | ||||
-rw-r--r-- | cmds/dumpstate/utils.cpp | 6 |
6 files changed, 92 insertions, 24 deletions
diff --git a/cmds/dumpstate/DumpstateService.cpp b/cmds/dumpstate/DumpstateService.cpp index 71658d819b..0ee6c3adac 100644 --- a/cmds/dumpstate/DumpstateService.cpp +++ b/cmds/dumpstate/DumpstateService.cpp @@ -24,10 +24,31 @@ #include "DumpstateInternal.h" +using android::base::StringPrintf; + namespace android { namespace os { namespace { + +static binder::Status exception(uint32_t code, const std::string& msg) { + MYLOGE("%s (%d) ", msg.c_str(), code); + return binder::Status::fromExceptionCode(code, String8(msg.c_str())); +} + +static binder::Status error(uint32_t code, const std::string& msg) { + MYLOGE("%s (%d) ", msg.c_str(), code); + return binder::Status::fromServiceSpecificError(code, String8(msg.c_str())); +} + +static void* callAndNotify(void* data) { + Dumpstate& ds = *static_cast<Dumpstate*>(data); + // TODO(111441001): Return status on listener. + ds.Run(); + MYLOGE("Finished Run()\n"); + return nullptr; +} + class DumpstateToken : public BnDumpstateToken {}; } @@ -77,10 +98,30 @@ binder::Status DumpstateService::setListener(const std::string& name, return binder::Status::ok(); } -binder::Status DumpstateService::startBugreport(int, const sp<IDumpstateListener>&, - const DumpstateOptions&, int32_t* returned_id) { - // TODO: fork to handle the bugreport request and return the process id or a request id here. +binder::Status DumpstateService::startBugreport(int, int bugreport_mode, int32_t* returned_id) { + // TODO(111441001): return a request id here. *returned_id = -1; + MYLOGI("startBugreport() with mode: %d\n", bugreport_mode); + + if (bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_FULL && + bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_INTERACTIVE && + bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_REMOTE && + bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_WEAR && + bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_TELEPHONY && + bugreport_mode != Dumpstate::BugreportMode::BUGREPORT_WIFI) { + return exception(binder::Status::EX_ILLEGAL_ARGUMENT, + StringPrintf("Invalid bugreport mode: %d", bugreport_mode)); + } + + std::unique_ptr<Dumpstate::DumpOptions> options = std::make_unique<Dumpstate::DumpOptions>(); + options->Initialize(static_cast<Dumpstate::BugreportMode>(bugreport_mode)); + ds_.SetOptions(std::move(options)); + + pthread_t thread; + status_t err = pthread_create(&thread, nullptr, callAndNotify, &ds_); + if (err != 0) { + return error(err, "Could not create a background thread."); + } return binder::Status::ok(); } diff --git a/cmds/dumpstate/DumpstateService.h b/cmds/dumpstate/DumpstateService.h index 131aff30a3..58095b38ff 100644 --- a/cmds/dumpstate/DumpstateService.h +++ b/cmds/dumpstate/DumpstateService.h @@ -41,8 +41,7 @@ class DumpstateService : public BinderService<DumpstateService>, public BnDumpst bool getSectionDetails, sp<IDumpstateToken>* returned_token) override; - binder::Status startBugreport(int fd, const sp<IDumpstateListener>& listener, - const DumpstateOptions& options, int32_t* returned_id) override; + binder::Status startBugreport(int fd, int bugreport_mode, int32_t* returned_id) override; private: Dumpstate& ds_; diff --git a/cmds/dumpstate/binder/android/os/IDumpstate.aidl b/cmds/dumpstate/binder/android/os/IDumpstate.aidl index 68a4f215e2..9e59f58aec 100644 --- a/cmds/dumpstate/binder/android/os/IDumpstate.aidl +++ b/cmds/dumpstate/binder/android/os/IDumpstate.aidl @@ -39,10 +39,27 @@ interface IDumpstate { IDumpstateToken setListener(@utf8InCpp String name, IDumpstateListener listener, boolean getSectionDetails); + // These modes encapsulate a set of run time options for generating bugreports. + // A zipped bugreport; default mode. + const int BUGREPORT_MODE_FULL = 0; + + // Interactive bugreport, i.e. triggered by the user. + const int BUGREPORT_MODE_INTERACTIVE = 1; + + // Remote bugreport triggered by DevicePolicyManager, for e.g. + const int BUGREPORT_MODE_REMOTE = 2; + + // Bugreport triggered on a wear device. + const int BUGREPORT_MODE_WEAR = 3; + + // Bugreport limited to only telephony info. + const int BUGREPORT_MODE_TELEPHONY = 4; + + // Bugreport limited to only wifi info. + const int BUGREPORT_MODE_WIFI = 5; + /* - * Starts a bugreport in a child process. - * - * Returns an identifier of the bugreport process running in the background. + * Starts a bugreport in the background. */ - int startBugreport(int fd, IDumpstateListener listener, in DumpstateOptions options); + int startBugreport(int fd, int bugreportMode); } diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index 7e42002c60..94e88775e1 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -2138,13 +2138,16 @@ bool Dumpstate::DumpOptions::ValidateOptions() const { return true; } -Dumpstate::RunStatus Dumpstate::RunWithOptions(std::unique_ptr<DumpOptions> options) { - if (!options->ValidateOptions()) { +void Dumpstate::SetOptions(std::unique_ptr<DumpOptions> options) { + options_ = std::move(options); +} + +Dumpstate::RunStatus Dumpstate::Run() { + if (!options_->ValidateOptions()) { MYLOGE("Invalid options specified\n"); - LogDumpOptions(*options); + LogDumpOptions(*options_); return RunStatus::INVALID_INPUT; } - options_ = std::move(options); /* set as high priority, and protect from OOM killer */ setpriority(PRIO_PROCESS, 0, -20); @@ -2366,7 +2369,8 @@ int run_main(int argc, char* argv[]) { std::unique_ptr<Dumpstate::DumpOptions> options = std::make_unique<Dumpstate::DumpOptions>(); Dumpstate::RunStatus status = options->Initialize(argc, argv); if (status == Dumpstate::RunStatus::OK) { - status = ds.RunWithOptions(std::move(options)); + ds.SetOptions(std::move(options)); + status = ds.Run(); } switch (status) { diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h index f75a668b3b..5e7f71d78e 100644 --- a/cmds/dumpstate/dumpstate.h +++ b/cmds/dumpstate/dumpstate.h @@ -27,6 +27,7 @@ #include <android-base/macros.h> #include <android-base/unique_fd.h> +#include <android/os/IDumpstate.h> #include <android/os/IDumpstateListener.h> #include <utils/StrongPointer.h> #include <ziparchive/zip_writer.h> @@ -188,15 +189,14 @@ class Dumpstate { public: enum RunStatus { OK, HELP, INVALID_INPUT, ERROR }; - // TODO(117177665): should enumerate constants in the AIDL file. // The mode under which the bugreport should be run. Each mode encapsulates a few options. enum BugreportMode { - BUGREPORT_FULL, - BUGREPORT_INTERACTIVE, - BUGREPORT_REMOTE, - BUGREPORT_WEAR, - BUGREPORT_TELEPHONY, - BUGREPORT_WIFI + BUGREPORT_FULL = android::os::IDumpstate::BUGREPORT_MODE_FULL, + BUGREPORT_INTERACTIVE = android::os::IDumpstate::BUGREPORT_MODE_INTERACTIVE, + BUGREPORT_REMOTE = android::os::IDumpstate::BUGREPORT_MODE_REMOTE, + BUGREPORT_WEAR = android::os::IDumpstate::BUGREPORT_MODE_WEAR, + BUGREPORT_TELEPHONY = android::os::IDumpstate::BUGREPORT_MODE_TELEPHONY, + BUGREPORT_WIFI = android::os::IDumpstate::BUGREPORT_MODE_WIFI }; static android::os::dumpstate::CommandOptions DEFAULT_DUMPSYS; @@ -308,8 +308,11 @@ class Dumpstate { struct DumpOptions; - /* Main entry point for running a complete bugreport. Takes ownership of options. */ - RunStatus RunWithOptions(std::unique_ptr<DumpOptions> options); + /* Main entry point for running a complete bugreport. */ + RunStatus Run(); + + /* Sets runtime options. */ + void SetOptions(std::unique_ptr<DumpOptions> options); // TODO: add other options from DumpState. /* diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp index 4ad5c4b7d5..6cbb691676 100644 --- a/cmds/dumpstate/utils.cpp +++ b/cmds/dumpstate/utils.cpp @@ -82,8 +82,12 @@ static const long STATS_MAX_AVERAGE = 100000; CommandOptions Dumpstate::DEFAULT_DUMPSYS = CommandOptions::WithTimeout(30).Build(); +// TODO(111441001): Default DumpOptions to sensible values. Dumpstate::Dumpstate(const std::string& version) - : pid_(getpid()), version_(version), now_(time(nullptr)) { + : pid_(getpid()), + options_(new Dumpstate::DumpOptions()), + version_(version), + now_(time(nullptr)) { } Dumpstate& Dumpstate::GetInstance() { |