Merge changes I18592d29,Ic543e718,I9cd217df,I723c0850
* changes:
storaged: fix selinux dac_override denial
storaged: allow dump window to be less than an hour
storaged: add --force option to dumpsys
storaged: add dumpsys flags to limit data size
diff --git a/storaged/Android.mk b/storaged/Android.mk
index 5abfb7a..2adb14d 100644
--- a/storaged/Android.mk
+++ b/storaged/Android.mk
@@ -9,7 +9,6 @@
libcutils \
liblog \
libsysutils \
- libcap \
libpackagelistparser \
libbatteryservice \
diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h
index 7e5048f..591719e 100644
--- a/storaged/include/storaged.h
+++ b/storaged/include/storaged.h
@@ -257,6 +257,7 @@
#define DEFAULT_PERIODIC_CHORES_INTERVAL_DISK_STATS_PUBLISH ( 3600 )
#define DEFAULT_PERIODIC_CHORES_INTERVAL_EMMC_INFO_PUBLISH ( 86400 )
#define DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO ( 3600 )
+#define DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO_LIMIT (300)
// UID IO threshold in bytes
#define DEFAULT_PERIODIC_CHORES_UID_IO_THRESHOLD ( 1024 * 1024 * 1024ULL )
@@ -300,8 +301,14 @@
std::unordered_map<uint32_t, struct uid_info> get_uids(void) {
return mUidm.get_uid_io_stats();
}
- std::map<uint64_t, std::vector<struct uid_record>> get_uid_records(int hours) {
- return mUidm.dump(hours);
+ std::map<uint64_t, std::vector<struct uid_record>> get_uid_records(
+ double hours, uint64_t threshold, bool force_report) {
+ return mUidm.dump(hours, threshold, force_report);
+ }
+ void update_uid_io_interval(int interval) {
+ if (interval >= DEFAULT_PERIODIC_CHORES_INTERVAL_UID_IO_LIMIT) {
+ mConfig.periodic_chores_interval_uid_io = interval;
+ }
}
void init_battery_service();
diff --git a/storaged/include/storaged_uid_monitor.h b/storaged/include/storaged_uid_monitor.h
index 07e6daa..031b7c4 100644
--- a/storaged/include/storaged_uid_monitor.h
+++ b/storaged/include/storaged_uid_monitor.h
@@ -91,10 +91,11 @@
// called by storaged -u
std::unordered_map<uint32_t, struct uid_info> get_uid_io_stats();
// called by dumpsys
- std::map<uint64_t, std::vector<struct uid_record>> dump(int hours);
+ std::map<uint64_t, std::vector<struct uid_record>> dump(
+ double hours, uint64_t threshold, bool force_report);
// called by battery properties listener
void set_charger_state(charger_stat_t stat);
- // called by storaged periodic_chore
+ // called by storaged periodic_chore or dump with force_report
void report();
};
diff --git a/storaged/main.cpp b/storaged/main.cpp
index 1103df2..f5a8f39 100644
--- a/storaged/main.cpp
+++ b/storaged/main.cpp
@@ -55,32 +55,6 @@
if (setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_BACKGROUND) < 0) return -1;
- if (prctl(PR_SET_KEEPCAPS, 1) < 0) return -1;
-
- std::unique_ptr<struct _cap_struct, int(*)(void *)> caps(cap_init(), cap_free);
- if (cap_clear(caps.get()) < 0) return -1;
- cap_value_t cap_value[] = {
- CAP_SETGID,
- CAP_SETUID
- };
- if (cap_set_flag(caps.get(), CAP_PERMITTED,
- arraysize(cap_value), cap_value,
- CAP_SET) < 0) return -1;
- if (cap_set_flag(caps.get(), CAP_EFFECTIVE,
- arraysize(cap_value), cap_value,
- CAP_SET) < 0) return -1;
- if (cap_set_proc(caps.get()) < 0)
- return -1;
-
- if (setgid(AID_SYSTEM) != 0) return -1;
-
- if (setuid(AID_SYSTEM) != 0) return -1;
-
- if (cap_set_flag(caps.get(), CAP_PERMITTED, 2, cap_value, CAP_CLEAR) < 0) return -1;
- if (cap_set_flag(caps.get(), CAP_EFFECTIVE, 2, cap_value, CAP_CLEAR) < 0) return -1;
- if (cap_set_proc(caps.get()) < 0)
- return -1;
-
return 0;
}
diff --git a/storaged/storaged.rc b/storaged/storaged.rc
index 53fdb85..bb7c623 100644
--- a/storaged/storaged.rc
+++ b/storaged/storaged.rc
@@ -2,3 +2,5 @@
class main
file /d/mmc0/mmc0:0001/ext_csd r
writepid /dev/cpuset/system-background/tasks
+ user root
+ group system package_info
\ No newline at end of file
diff --git a/storaged/storaged_service.cpp b/storaged/storaged_service.cpp
index 6635431..9c8cbf0 100644
--- a/storaged/storaged_service.cpp
+++ b/storaged/storaged_service.cpp
@@ -88,19 +88,38 @@
return PERMISSION_DENIED;
}
- int hours = 0;
+ double hours = 0;
+ int time_window = 0;
+ uint64_t threshold = 0;
+ bool force_report = false;
for (size_t i = 0; i < args.size(); i++) {
const auto& arg = args[i];
if (arg == String16("--hours")) {
if (++i >= args.size())
break;
- hours = stoi(String16::std_string(args[i]));
+ hours = stod(String16::std_string(args[i]));
+ continue;
+ }
+ if (arg == String16("--time_window")) {
+ if (++i >= args.size())
+ break;
+ time_window = stoi(String16::std_string(args[i]));
+ continue;
+ }
+ if (arg == String16("--threshold")) {
+ if (++i >= args.size())
+ break;
+ threshold = stoll(String16::std_string(args[i]));
+ continue;
+ }
+ if (arg == String16("--force")) {
+ force_report = true;
continue;
}
}
const std::map<uint64_t, std::vector<struct uid_record>>& records =
- storaged.get_uid_records(hours);
+ storaged.get_uid_records(hours, threshold, force_report);
for (const auto& it : records) {
dprintf(fd, "%llu\n", (unsigned long long)it.first);
for (const auto& record : it.second) {
@@ -116,6 +135,11 @@
(unsigned long long)record.ios.bytes[WRITE][BACKGROUND][CHARGER_ON]);
}
}
+
+ if (time_window) {
+ storaged.update_uid_io_interval(time_window);
+ }
+
return NO_ERROR;
}
diff --git a/storaged/storaged_uid_monitor.cpp b/storaged/storaged_uid_monitor.cpp
index b46d09a..3b893b5 100644
--- a/storaged/storaged_uid_monitor.cpp
+++ b/storaged/storaged_uid_monitor.cpp
@@ -149,18 +149,41 @@
new_records.begin(), new_records.end());
}
-std::map<uint64_t, std::vector<struct uid_record>> uid_monitor::dump(int hours)
+std::map<uint64_t, std::vector<struct uid_record>> uid_monitor::dump(
+ double hours, uint64_t threshold, bool force_report)
{
+ if (force_report) {
+ report();
+ }
+
std::unique_ptr<lock_t> lock(new lock_t(&um_lock));
std::map<uint64_t, std::vector<struct uid_record>> dump_records;
uint64_t first_ts = 0;
if (hours != 0) {
- first_ts = time(NULL) - (uint64_t)hours * HOUR_TO_SEC;
+ first_ts = time(NULL) - hours * HOUR_TO_SEC;
}
- dump_records.insert(records.lower_bound(first_ts), records.end());
+ for (auto it = records.lower_bound(first_ts); it != records.end(); ++it) {
+ const std::vector<struct uid_record>& recs = it->second;
+ std::vector<struct uid_record> filtered;
+
+ for (const auto& rec : recs) {
+ if (rec.ios.bytes[READ][FOREGROUND][CHARGER_ON] +
+ rec.ios.bytes[READ][FOREGROUND][CHARGER_OFF] +
+ rec.ios.bytes[READ][BACKGROUND][CHARGER_ON] +
+ rec.ios.bytes[READ][BACKGROUND][CHARGER_OFF] +
+ rec.ios.bytes[WRITE][FOREGROUND][CHARGER_ON] +
+ rec.ios.bytes[WRITE][FOREGROUND][CHARGER_OFF] +
+ rec.ios.bytes[WRITE][BACKGROUND][CHARGER_ON] +
+ rec.ios.bytes[WRITE][BACKGROUND][CHARGER_OFF] > threshold) {
+ filtered.push_back(rec);
+ }
+ }
+ dump_records.insert(
+ std::pair<uint64_t, std::vector<struct uid_record>>(it->first, filtered));
+ }
return dump_records;
}