storaged: call getNamesForUids to get uid names
Calls getNamesForUids when one of the two conditions are true. 1. entries for new uids are reported from io stats 2. previous getNamesForUids failed Bug: 62805090 Change-Id: I120b81e1857b2aa0a90d0fb85c8d749e985df78e
This commit is contained in:
parent
f14126b926
commit
2d7bcceefc
2 changed files with 48 additions and 22 deletions
|
|
@ -9,7 +9,6 @@ LIBSTORAGED_SHARED_LIBRARIES := \
|
|||
libcutils \
|
||||
liblog \
|
||||
libsysutils \
|
||||
libpackagelistparser \
|
||||
libbatteryservice \
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
|
|
|||
|
|
@ -22,33 +22,24 @@
|
|||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <android/content/pm/IPackageManagerNative.h>
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/macros.h>
|
||||
#include <android-base/parseint.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <log/log_event_list.h>
|
||||
#include <packagelistparser/packagelistparser.h>
|
||||
|
||||
#include "storaged.h"
|
||||
#include "storaged_uid_monitor.h"
|
||||
|
||||
using namespace android;
|
||||
using namespace android::base;
|
||||
using namespace android::content::pm;
|
||||
|
||||
static bool packagelist_parse_cb(pkg_info* info, void* userdata)
|
||||
{
|
||||
std::unordered_map<uint32_t, struct uid_info>* uids =
|
||||
reinterpret_cast<std::unordered_map<uint32_t, struct uid_info>*>(userdata);
|
||||
|
||||
if (uids->find(info->uid) != uids->end()) {
|
||||
(*uids)[info->uid].name = info->name;
|
||||
}
|
||||
|
||||
packagelist_free(info);
|
||||
return true;
|
||||
}
|
||||
static bool refresh_uid_names;
|
||||
|
||||
std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats()
|
||||
{
|
||||
|
|
@ -116,6 +107,38 @@ bool io_usage::is_zero() const
|
|||
return true;
|
||||
}
|
||||
|
||||
static void get_uid_names(const vector<int>& uids, const vector<std::string*>& uid_names)
|
||||
{
|
||||
sp<IServiceManager> sm = defaultServiceManager();
|
||||
if (sm == NULL) {
|
||||
LOG_TO(SYSTEM, ERROR) << "defaultServiceManager failed";
|
||||
return;
|
||||
}
|
||||
|
||||
sp<IBinder> binder = sm->getService(String16("package_native"));
|
||||
if (binder == NULL) {
|
||||
LOG_TO(SYSTEM, ERROR) << "getService package_native failed";
|
||||
return;
|
||||
}
|
||||
|
||||
sp<IPackageManagerNative> package_mgr = interface_cast<IPackageManagerNative>(binder);
|
||||
std::vector<std::string> names;
|
||||
binder::Status status = package_mgr->getNamesForUids(uids, &names);
|
||||
if (!status.isOk()) {
|
||||
LOG_TO(SYSTEM, ERROR) << "package_native::getNamesForUids failed: "
|
||||
<< status.exceptionMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < uid_names.size(); i++) {
|
||||
if (!names[i].empty()) {
|
||||
*uid_names[i] = names[i];
|
||||
}
|
||||
}
|
||||
|
||||
refresh_uid_names = false;
|
||||
}
|
||||
|
||||
std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_locked()
|
||||
{
|
||||
std::unordered_map<uint32_t, struct uid_info> uid_io_stats;
|
||||
|
|
@ -127,7 +150,8 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
|
|||
|
||||
std::vector<std::string> io_stats = Split(std::move(buffer), "\n");
|
||||
struct uid_info u;
|
||||
bool refresh_uid = false;
|
||||
vector<int> uids;
|
||||
vector<std::string*> uid_names;
|
||||
|
||||
for (uint32_t i = 0; i < io_stats.size(); i++) {
|
||||
if (io_stats[i].empty()) {
|
||||
|
|
@ -137,12 +161,15 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
|
|||
if (io_stats[i].compare(0, 4, "task")) {
|
||||
if (!u.parse_uid_io_stats(std::move(io_stats[i])))
|
||||
continue;
|
||||
if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) {
|
||||
refresh_uid = true;
|
||||
u.name = std::to_string(u.uid);
|
||||
} else
|
||||
u.name = last_uid_io_stats[u.uid].name;
|
||||
uid_io_stats[u.uid] = u;
|
||||
uid_io_stats[u.uid].name = std::to_string(u.uid);
|
||||
uids.push_back(u.uid);
|
||||
uid_names.push_back(&uid_io_stats[u.uid].name);
|
||||
if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) {
|
||||
refresh_uid_names = true;
|
||||
} else {
|
||||
uid_io_stats[u.uid].name = last_uid_io_stats[u.uid].name;
|
||||
}
|
||||
} else {
|
||||
struct task_info t;
|
||||
if (!t.parse_task_io_stats(std::move(io_stats[i])))
|
||||
|
|
@ -151,8 +178,8 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
|
|||
}
|
||||
}
|
||||
|
||||
if (refresh_uid) {
|
||||
packagelist_parse(packagelist_parse_cb, &uid_io_stats);
|
||||
if (!uids.empty() && refresh_uid_names) {
|
||||
get_uid_names(uids, uid_names);
|
||||
}
|
||||
|
||||
return uid_io_stats;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue