summaryrefslogtreecommitdiffstats
path: root/storaged
diff options
context:
space:
mode:
authorJin Qian <jinqian@google.com>2017-07-28 18:45:59 -0700
committerJin Qian <jinqian@google.com>2017-08-08 10:51:17 -0700
commit2d7bcceefc2b57ee878f6f0a18eab34418c07814 (patch)
tree9603009dfafb19ba26fd5fe48a57460a84017d05 /storaged
parentf14126b926f9a4bafaa2a24a0064f7d6b343c62b (diff)
downloadsystem_core-2d7bcceefc2b57ee878f6f0a18eab34418c07814.tar.gz
system_core-2d7bcceefc2b57ee878f6f0a18eab34418c07814.tar.bz2
system_core-2d7bcceefc2b57ee878f6f0a18eab34418c07814.zip
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
Diffstat (limited to 'storaged')
-rw-r--r--storaged/Android.mk1
-rw-r--r--storaged/storaged_uid_monitor.cpp69
2 files changed, 48 insertions, 22 deletions
diff --git a/storaged/Android.mk b/storaged/Android.mk
index 5e6a3c0a1..a1abe0fd1 100644
--- a/storaged/Android.mk
+++ b/storaged/Android.mk
@@ -9,7 +9,6 @@ LIBSTORAGED_SHARED_LIBRARIES := \
libcutils \
liblog \
libsysutils \
- libpackagelistparser \
libbatteryservice \
include $(CLEAR_VARS)
diff --git a/storaged/storaged_uid_monitor.cpp b/storaged/storaged_uid_monitor.cpp
index 65fa6f902..2bbbfe0c9 100644
--- a/storaged/storaged_uid_monitor.cpp
+++ b/storaged/storaged_uid_monitor.cpp
@@ -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;