blob: acf40c88a00dbba930fd24592189da9ee30c6efa [file] [log] [blame]
David Chende701692017-10-05 13:16:02 -07001/*
yro0feae942017-11-15 14:38:48 -08002 * Copyright (C) 2017 The Android Open Source Project
David Chende701692017-10-05 13:16:02 -07003 *
4 * Licensed under the Apache License, versionCode 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
David Chenf384b902018-03-14 18:36:45 -070016#define DEBUG false // STOPSHIP if true
Joe Onorato9fc9edf2017-10-15 20:08:52 -070017#include "Log.h"
18
Yangster-mac9def8e32018-04-17 13:55:51 -070019#include "hash.h"
Yangster-mac330af582018-02-08 15:24:38 -080020#include "stats_log_util.h"
David Chenc136f45a2017-11-27 11:52:26 -080021#include "guardrail/StatsdStats.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070022#include "packages/UidMap.h"
23
Dianne Hackborn3accca02013-09-20 09:32:11 -070024#include <inttypes.h>
25
David Chende701692017-10-05 13:16:02 -070026using namespace android;
27
David Chenf384b902018-03-14 18:36:45 -070028using android::base::StringPrintf;
29using android::util::FIELD_COUNT_REPEATED;
30using android::util::FIELD_TYPE_BOOL;
31using android::util::FIELD_TYPE_FLOAT;
32using android::util::FIELD_TYPE_INT32;
33using android::util::FIELD_TYPE_INT64;
Yangster-mac9def8e32018-04-17 13:55:51 -070034using android::util::FIELD_TYPE_UINT64;
David Chenf384b902018-03-14 18:36:45 -070035using android::util::FIELD_TYPE_MESSAGE;
36using android::util::FIELD_TYPE_STRING;
37using android::util::ProtoOutputStream;
38
David Chende701692017-10-05 13:16:02 -070039namespace android {
40namespace os {
41namespace statsd {
42
David Chenf384b902018-03-14 18:36:45 -070043const int FIELD_ID_SNAPSHOT_PACKAGE_NAME = 1;
44const int FIELD_ID_SNAPSHOT_PACKAGE_VERSION = 2;
45const int FIELD_ID_SNAPSHOT_PACKAGE_UID = 3;
David Chenbd125272018-04-04 19:02:50 -070046const int FIELD_ID_SNAPSHOT_PACKAGE_DELETED = 4;
Yangster-mac9def8e32018-04-17 13:55:51 -070047const int FIELD_ID_SNAPSHOT_PACKAGE_NAME_HASH = 5;
dwchen730403e2018-10-29 11:41:56 -070048const int FIELD_ID_SNAPSHOT_PACKAGE_VERSION_STRING = 6;
49const int FIELD_ID_SNAPSHOT_PACKAGE_VERSION_STRING_HASH = 7;
50const int FIELD_ID_SNAPSHOT_PACKAGE_INSTALLER = 8;
51const int FIELD_ID_SNAPSHOT_PACKAGE_INSTALLER_HASH = 9;
David Chenf384b902018-03-14 18:36:45 -070052const int FIELD_ID_SNAPSHOT_TIMESTAMP = 1;
53const int FIELD_ID_SNAPSHOT_PACKAGE_INFO = 2;
54const int FIELD_ID_SNAPSHOTS = 1;
55const int FIELD_ID_CHANGES = 2;
56const int FIELD_ID_CHANGE_DELETION = 1;
57const int FIELD_ID_CHANGE_TIMESTAMP = 2;
58const int FIELD_ID_CHANGE_PACKAGE = 3;
59const int FIELD_ID_CHANGE_UID = 4;
David Chenbd125272018-04-04 19:02:50 -070060const int FIELD_ID_CHANGE_NEW_VERSION = 5;
61const int FIELD_ID_CHANGE_PREV_VERSION = 6;
Yangster-mac9def8e32018-04-17 13:55:51 -070062const int FIELD_ID_CHANGE_PACKAGE_HASH = 7;
dwchen730403e2018-10-29 11:41:56 -070063const int FIELD_ID_CHANGE_NEW_VERSION_STRING = 8;
64const int FIELD_ID_CHANGE_PREV_VERSION_STRING = 9;
65const int FIELD_ID_CHANGE_NEW_VERSION_STRING_HASH = 10;
66const int FIELD_ID_CHANGE_PREV_VERSION_STRING_HASH = 11;
David Chenf384b902018-03-14 18:36:45 -070067
Yangster9df9a7f2017-12-18 13:33:05 -080068UidMap::UidMap() : mBytesUsed(0) {}
69
70UidMap::~UidMap() {}
David Chenc136f45a2017-11-27 11:52:26 -080071
Yao Chen4ce07292019-02-13 13:06:36 -080072sp<UidMap> UidMap::getInstance() {
73 static sp<UidMap> sInstance = new UidMap();
74 return sInstance;
75}
76
David Chende701692017-10-05 13:16:02 -070077bool UidMap::hasApp(int uid, const string& packageName) const {
78 lock_guard<mutex> lock(mMutex);
79
David Chenbd125272018-04-04 19:02:50 -070080 auto it = mMap.find(std::make_pair(uid, packageName));
81 return it != mMap.end() && !it->second.deleted;
David Chende701692017-10-05 13:16:02 -070082}
83
Yangster9df9a7f2017-12-18 13:33:05 -080084string UidMap::normalizeAppName(const string& appName) const {
85 string normalizedName = appName;
86 std::transform(normalizedName.begin(), normalizedName.end(), normalizedName.begin(), ::tolower);
87 return normalizedName;
88}
89
90std::set<string> UidMap::getAppNamesFromUid(const int32_t& uid, bool returnNormalized) const {
91 lock_guard<mutex> lock(mMutex);
92 return getAppNamesFromUidLocked(uid,returnNormalized);
93}
94
95std::set<string> UidMap::getAppNamesFromUidLocked(const int32_t& uid, bool returnNormalized) const {
96 std::set<string> names;
David Chenbd125272018-04-04 19:02:50 -070097 for (const auto& kv : mMap) {
98 if (kv.first.first == uid && !kv.second.deleted) {
99 names.insert(returnNormalized ? normalizeAppName(kv.first.second) : kv.first.second);
100 }
Yangster9df9a7f2017-12-18 13:33:05 -0800101 }
102 return names;
103}
104
Dianne Hackborn3accca02013-09-20 09:32:11 -0700105int64_t UidMap::getAppVersion(int uid, const string& packageName) const {
David Chende701692017-10-05 13:16:02 -0700106 lock_guard<mutex> lock(mMutex);
107
David Chenbd125272018-04-04 19:02:50 -0700108 auto it = mMap.find(std::make_pair(uid, packageName));
109 if (it == mMap.end() || it->second.deleted) {
110 return 0;
David Chende701692017-10-05 13:16:02 -0700111 }
David Chenbd125272018-04-04 19:02:50 -0700112 return it->second.versionCode;
David Chend6896892017-10-25 11:49:03 -0700113}
114
115void UidMap::updateMap(const int64_t& timestamp, const vector<int32_t>& uid,
dwchen730403e2018-10-29 11:41:56 -0700116 const vector<int64_t>& versionCode, const vector<String16>& versionString,
117 const vector<String16>& packageName, const vector<String16>& installer) {
Tej Singh9ec159a2019-11-14 11:59:48 -0800118 wp<PackageInfoListener> broadcast = NULL;
Yao Chend10f7b12017-12-18 12:53:50 -0800119 {
120 lock_guard<mutex> lock(mMutex); // Exclusively lock for updates.
David Chende701692017-10-05 13:16:02 -0700121
David Chenbd125272018-04-04 19:02:50 -0700122 std::unordered_map<std::pair<int, string>, AppData, PairHash> deletedApps;
123
124 // Copy all the deleted apps.
125 for (const auto& kv : mMap) {
126 if (kv.second.deleted) {
127 deletedApps[kv.first] = kv.second;
128 }
Yao Chend10f7b12017-12-18 12:53:50 -0800129 }
David Chende701692017-10-05 13:16:02 -0700130
David Chenbd125272018-04-04 19:02:50 -0700131 mMap.clear();
132 for (size_t j = 0; j < uid.size(); j++) {
133 string package = string(String8(packageName[j]).string());
dwchen730403e2018-10-29 11:41:56 -0700134 mMap[std::make_pair(uid[j], package)] =
135 AppData(versionCode[j], string(String8(versionString[j]).string()),
136 string(String8(installer[j]).string()));
David Chenbd125272018-04-04 19:02:50 -0700137 }
David Chenf384b902018-03-14 18:36:45 -0700138
David Chenbd125272018-04-04 19:02:50 -0700139 for (const auto& kv : deletedApps) {
140 auto mMapIt = mMap.find(kv.first);
141 if (mMapIt != mMap.end()) {
142 // Insert this deleted app back into the current map.
143 mMap[kv.first] = kv.second;
144 }
145 }
146
David Chenc0f6f632018-01-18 16:02:42 -0800147 ensureBytesUsedBelowLimit();
Yao Chend10f7b12017-12-18 12:53:50 -0800148 StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
Tej Singh9ec159a2019-11-14 11:59:48 -0800149 broadcast = mSubscriber;
David Chende701692017-10-05 13:16:02 -0700150 }
Yao Chend10f7b12017-12-18 12:53:50 -0800151 // To avoid invoking callback while holding the internal lock. we get a copy of the listener
Tej Singh9ec159a2019-11-14 11:59:48 -0800152 // and invoke the callback. It's still possible that after we copy the listener, it removes
153 // itself before we call it. It's then the listener's job to handle it (expect the callback to
154 // be called after listener is removed, and the listener should properly ignore it).
155 auto strongPtr = broadcast.promote();
156 if (strongPtr != NULL) {
157 strongPtr->onUidMapReceived(timestamp);
Yao Chend10f7b12017-12-18 12:53:50 -0800158 }
David Chende701692017-10-05 13:16:02 -0700159}
160
David Chend6896892017-10-25 11:49:03 -0700161void UidMap::updateApp(const int64_t& timestamp, const String16& app_16, const int32_t& uid,
dwchen730403e2018-10-29 11:41:56 -0700162 const int64_t& versionCode, const String16& versionString,
163 const String16& installer) {
Tej Singh9ec159a2019-11-14 11:59:48 -0800164 wp<PackageInfoListener> broadcast = NULL;
Yangster9df9a7f2017-12-18 13:33:05 -0800165 string appName = string(String8(app_16).string());
Yao Chend10f7b12017-12-18 12:53:50 -0800166 {
167 lock_guard<mutex> lock(mMutex);
David Chenbd125272018-04-04 19:02:50 -0700168 int32_t prevVersion = 0;
dwchen730403e2018-10-29 11:41:56 -0700169 string prevVersionString = "";
170 string newVersionString = string(String8(versionString).string());
David Chenbd125272018-04-04 19:02:50 -0700171 bool found = false;
172 auto it = mMap.find(std::make_pair(uid, appName));
173 if (it != mMap.end()) {
174 found = true;
175 prevVersion = it->second.versionCode;
dwchen730403e2018-10-29 11:41:56 -0700176 prevVersionString = it->second.versionString;
David Chenbd125272018-04-04 19:02:50 -0700177 it->second.versionCode = versionCode;
dwchen730403e2018-10-29 11:41:56 -0700178 it->second.versionString = newVersionString;
179 it->second.installer = string(String8(installer).string());
David Chenbd125272018-04-04 19:02:50 -0700180 it->second.deleted = false;
181 }
182 if (!found) {
183 // Otherwise, we need to add an app at this uid.
dwchen730403e2018-10-29 11:41:56 -0700184 mMap[std::make_pair(uid, appName)] =
185 AppData(versionCode, newVersionString, string(String8(installer).string()));
David Chenbd125272018-04-04 19:02:50 -0700186 } else {
187 // Only notify the listeners if this is an app upgrade. If this app is being installed
188 // for the first time, then we don't notify the listeners.
David Chen81245fd2018-04-12 14:33:37 -0700189 // It's also OK to split again if we're forming a partial bucket after re-installing an
190 // app after deletion.
Tej Singh9ec159a2019-11-14 11:59:48 -0800191 broadcast = mSubscriber;
David Chenbd125272018-04-04 19:02:50 -0700192 }
dwchen730403e2018-10-29 11:41:56 -0700193 mChanges.emplace_back(false, timestamp, appName, uid, versionCode, newVersionString,
194 prevVersion, prevVersionString);
David Chenf384b902018-03-14 18:36:45 -0700195 mBytesUsed += kBytesChangeRecord;
David Chenc0f6f632018-01-18 16:02:42 -0800196 ensureBytesUsedBelowLimit();
Yao Chend10f7b12017-12-18 12:53:50 -0800197 StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
David Chenf384b902018-03-14 18:36:45 -0700198 StatsdStats::getInstance().setUidMapChanges(mChanges.size());
David Chende701692017-10-05 13:16:02 -0700199 }
200
Tej Singh9ec159a2019-11-14 11:59:48 -0800201 auto strongPtr = broadcast.promote();
202 if (strongPtr != NULL) {
203 strongPtr->notifyAppUpgrade(timestamp, appName, uid, versionCode);
David Chende701692017-10-05 13:16:02 -0700204 }
David Chende701692017-10-05 13:16:02 -0700205}
206
David Chenc136f45a2017-11-27 11:52:26 -0800207void UidMap::ensureBytesUsedBelowLimit() {
208 size_t limit;
209 if (maxBytesOverride <= 0) {
210 limit = StatsdStats::kMaxBytesUsedUidMap;
211 } else {
212 limit = maxBytesOverride;
213 }
214 while (mBytesUsed > limit) {
David Chenf384b902018-03-14 18:36:45 -0700215 ALOGI("Bytes used %zu is above limit %zu, need to delete something", mBytesUsed, limit);
David Chenbd125272018-04-04 19:02:50 -0700216 if (mChanges.size() > 0) {
David Chenf384b902018-03-14 18:36:45 -0700217 mBytesUsed -= kBytesChangeRecord;
218 mChanges.pop_front();
David Chenbd125272018-04-04 19:02:50 -0700219 StatsdStats::getInstance().noteUidMapDropped(1);
David Chenc136f45a2017-11-27 11:52:26 -0800220 }
David Chenc136f45a2017-11-27 11:52:26 -0800221 }
222}
223
Yao Chend10f7b12017-12-18 12:53:50 -0800224void UidMap::removeApp(const int64_t& timestamp, const String16& app_16, const int32_t& uid) {
Tej Singh9ec159a2019-11-14 11:59:48 -0800225 wp<PackageInfoListener> broadcast = NULL;
Yao Chend10f7b12017-12-18 12:53:50 -0800226 string app = string(String8(app_16).string());
227 {
228 lock_guard<mutex> lock(mMutex);
229
Chenjie Yue36018b2018-04-16 15:18:30 -0700230 int64_t prevVersion = 0;
dwchen730403e2018-10-29 11:41:56 -0700231 string prevVersionString = "";
David Chenbd125272018-04-04 19:02:50 -0700232 auto key = std::make_pair(uid, app);
233 auto it = mMap.find(key);
234 if (it != mMap.end() && !it->second.deleted) {
235 prevVersion = it->second.versionCode;
dwchen730403e2018-10-29 11:41:56 -0700236 prevVersionString = it->second.versionString;
David Chenbd125272018-04-04 19:02:50 -0700237 it->second.deleted = true;
238 mDeletedApps.push_back(key);
239 }
240 if (mDeletedApps.size() > StatsdStats::kMaxDeletedAppsInUidMap) {
241 // Delete the oldest one.
242 auto oldest = mDeletedApps.front();
243 mDeletedApps.pop_front();
244 mMap.erase(oldest);
245 StatsdStats::getInstance().noteUidMapAppDeletionDropped();
246 }
dwchen730403e2018-10-29 11:41:56 -0700247 mChanges.emplace_back(true, timestamp, app, uid, 0, "", prevVersion, prevVersionString);
David Chenf384b902018-03-14 18:36:45 -0700248 mBytesUsed += kBytesChangeRecord;
David Chenc0f6f632018-01-18 16:02:42 -0800249 ensureBytesUsedBelowLimit();
Yao Chend10f7b12017-12-18 12:53:50 -0800250 StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
David Chenf384b902018-03-14 18:36:45 -0700251 StatsdStats::getInstance().setUidMapChanges(mChanges.size());
Tej Singh9ec159a2019-11-14 11:59:48 -0800252 broadcast = mSubscriber;
Yao Chend10f7b12017-12-18 12:53:50 -0800253 }
254
Tej Singh9ec159a2019-11-14 11:59:48 -0800255 auto strongPtr = broadcast.promote();
256 if (strongPtr != NULL) {
257 strongPtr->notifyAppRemoved(timestamp, app, uid);
Yao Chend10f7b12017-12-18 12:53:50 -0800258 }
259}
260
Tej Singh9ec159a2019-11-14 11:59:48 -0800261void UidMap::setListener(wp<PackageInfoListener> listener) {
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700262 lock_guard<mutex> lock(mMutex); // Lock for updates
Tej Singh9ec159a2019-11-14 11:59:48 -0800263 mSubscriber = listener;
David Chende701692017-10-05 13:16:02 -0700264}
265
David Chen21582962017-11-01 17:32:46 -0700266void UidMap::assignIsolatedUid(int isolatedUid, int parentUid) {
267 lock_guard<mutex> lock(mIsolatedMutex);
268
269 mIsolatedUidMap[isolatedUid] = parentUid;
270}
271
Bookatz3c648862018-05-25 13:32:43 -0700272void UidMap::removeIsolatedUid(int isolatedUid) {
David Chen21582962017-11-01 17:32:46 -0700273 lock_guard<mutex> lock(mIsolatedMutex);
274
275 auto it = mIsolatedUidMap.find(isolatedUid);
276 if (it != mIsolatedUidMap.end()) {
277 mIsolatedUidMap.erase(it);
278 }
279}
280
Yangster-macd40053e2018-01-09 16:29:22 -0800281int UidMap::getHostUidOrSelf(int uid) const {
David Chen21582962017-11-01 17:32:46 -0700282 lock_guard<mutex> lock(mIsolatedMutex);
283
284 auto it = mIsolatedUidMap.find(uid);
285 if (it != mIsolatedUidMap.end()) {
286 return it->second;
287 }
288 return uid;
289}
290
David Chend6896892017-10-25 11:49:03 -0700291void UidMap::clearOutput() {
David Chenf384b902018-03-14 18:36:45 -0700292 mChanges.clear();
David Chenc136f45a2017-11-27 11:52:26 -0800293 // Also update the guardrail trackers.
294 StatsdStats::getInstance().setUidMapChanges(0);
David Chencfc311d2018-01-23 17:55:54 -0800295 mBytesUsed = 0;
David Chenc136f45a2017-11-27 11:52:26 -0800296 StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
David Chend6896892017-10-25 11:49:03 -0700297}
David Chende701692017-10-05 13:16:02 -0700298
David Chend6896892017-10-25 11:49:03 -0700299int64_t UidMap::getMinimumTimestampNs() {
300 int64_t m = 0;
David Chenbd125272018-04-04 19:02:50 -0700301 for (const auto& kv : mLastUpdatePerConfigKey) {
David Chend6896892017-10-25 11:49:03 -0700302 if (m == 0) {
David Chenbd125272018-04-04 19:02:50 -0700303 m = kv.second;
304 } else if (kv.second < m) {
305 m = kv.second;
David Chend6896892017-10-25 11:49:03 -0700306 }
307 }
308 return m;
309}
310
Yao Chend10f7b12017-12-18 12:53:50 -0800311size_t UidMap::getBytesUsed() const {
David Chenc136f45a2017-11-27 11:52:26 -0800312 return mBytesUsed;
313}
314
Yao Chen4ce07292019-02-13 13:06:36 -0800315void UidMap::writeUidMapSnapshot(int64_t timestamp, bool includeVersionStrings,
316 bool includeInstaller, const std::set<int32_t>& interestingUids,
317 std::set<string>* str_set, ProtoOutputStream* proto) {
318 lock_guard<mutex> lock(mMutex);
319
320 writeUidMapSnapshotLocked(timestamp, includeVersionStrings, includeInstaller, interestingUids,
321 str_set, proto);
322}
323
324void UidMap::writeUidMapSnapshotLocked(int64_t timestamp, bool includeVersionStrings,
325 bool includeInstaller,
326 const std::set<int32_t>& interestingUids,
327 std::set<string>* str_set, ProtoOutputStream* proto) {
328 proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP, (long long)timestamp);
329 for (const auto& kv : mMap) {
330 if (!interestingUids.empty() &&
331 interestingUids.find(kv.first.first) == interestingUids.end()) {
332 continue;
333 }
334 uint64_t token = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
335 FIELD_ID_SNAPSHOT_PACKAGE_INFO);
336 if (str_set != nullptr) {
337 str_set->insert(kv.first.second);
338 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_SNAPSHOT_PACKAGE_NAME_HASH,
339 (long long)Hash64(kv.first.second));
340 if (includeVersionStrings) {
341 str_set->insert(kv.second.versionString);
342 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION_STRING_HASH,
343 (long long)Hash64(kv.second.versionString));
344 }
345 if (includeInstaller) {
346 str_set->insert(kv.second.installer);
347 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_SNAPSHOT_PACKAGE_INSTALLER_HASH,
348 (long long)Hash64(kv.second.installer));
349 }
350 } else {
351 proto->write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_NAME, kv.first.second);
352 if (includeVersionStrings) {
353 proto->write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_VERSION_STRING,
354 kv.second.versionString);
355 }
356 if (includeInstaller) {
357 proto->write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_INSTALLER,
358 kv.second.installer);
359 }
360 }
361
362 proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION,
363 (long long)kv.second.versionCode);
364 proto->write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_UID, kv.first.first);
365 proto->write(FIELD_TYPE_BOOL | FIELD_ID_SNAPSHOT_PACKAGE_DELETED, kv.second.deleted);
366 proto->end(token);
367 }
368}
369
dwchen730403e2018-10-29 11:41:56 -0700370void UidMap::appendUidMap(const int64_t& timestamp, const ConfigKey& key, std::set<string>* str_set,
371 bool includeVersionStrings, bool includeInstaller,
372 ProtoOutputStream* proto) {
David Chend6896892017-10-25 11:49:03 -0700373 lock_guard<mutex> lock(mMutex); // Lock for updates
374
David Chenf384b902018-03-14 18:36:45 -0700375 for (const ChangeRecord& record : mChanges) {
376 if (record.timestampNs > mLastUpdatePerConfigKey[key]) {
377 uint64_t changesToken =
yro4beccbe2018-03-15 19:42:05 -0700378 proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_CHANGES);
379 proto->write(FIELD_TYPE_BOOL | FIELD_ID_CHANGE_DELETION, (bool)record.deletion);
380 proto->write(FIELD_TYPE_INT64 | FIELD_ID_CHANGE_TIMESTAMP,
381 (long long)record.timestampNs);
Yangster-mac9def8e32018-04-17 13:55:51 -0700382 if (str_set != nullptr) {
383 str_set->insert(record.package);
384 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_CHANGE_PACKAGE_HASH,
385 (long long)Hash64(record.package));
dwchen730403e2018-10-29 11:41:56 -0700386 if (includeVersionStrings) {
387 str_set->insert(record.versionString);
388 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_CHANGE_NEW_VERSION_STRING_HASH,
389 (long long)Hash64(record.versionString));
390 str_set->insert(record.prevVersionString);
391 proto->write(FIELD_TYPE_UINT64 | FIELD_ID_CHANGE_PREV_VERSION_STRING_HASH,
392 (long long)Hash64(record.prevVersionString));
393 }
Yangster-mac9def8e32018-04-17 13:55:51 -0700394 } else {
395 proto->write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_PACKAGE, record.package);
dwchen730403e2018-10-29 11:41:56 -0700396 if (includeVersionStrings) {
397 proto->write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_NEW_VERSION_STRING,
398 record.versionString);
399 proto->write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_PREV_VERSION_STRING,
400 record.prevVersionString);
401 }
Yangster-mac9def8e32018-04-17 13:55:51 -0700402 }
403
yro4beccbe2018-03-15 19:42:05 -0700404 proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_UID, (int)record.uid);
Chenjie Yue36018b2018-04-16 15:18:30 -0700405 proto->write(FIELD_TYPE_INT64 | FIELD_ID_CHANGE_NEW_VERSION, (long long)record.version);
406 proto->write(FIELD_TYPE_INT64 | FIELD_ID_CHANGE_PREV_VERSION,
407 (long long)record.prevVersion);
yro4beccbe2018-03-15 19:42:05 -0700408 proto->end(changesToken);
David Chenf384b902018-03-14 18:36:45 -0700409 }
410 }
411
David Chenbd125272018-04-04 19:02:50 -0700412 // Write snapshot from current uid map state.
413 uint64_t snapshotsToken =
414 proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_SNAPSHOTS);
Yao Chen4ce07292019-02-13 13:06:36 -0800415 writeUidMapSnapshotLocked(timestamp, includeVersionStrings, includeInstaller,
416 std::set<int32_t>() /*empty uid set means including every uid*/,
417 str_set, proto);
David Chenbd125272018-04-04 19:02:50 -0700418 proto->end(snapshotsToken);
David Chenf384b902018-03-14 18:36:45 -0700419
David Chend6896892017-10-25 11:49:03 -0700420 int64_t prevMin = getMinimumTimestampNs();
421 mLastUpdatePerConfigKey[key] = timestamp;
422 int64_t newMin = getMinimumTimestampNs();
423
David Chenf384b902018-03-14 18:36:45 -0700424 if (newMin > prevMin) { // Delete anything possible now that the minimum has
425 // moved forward.
David Chend6896892017-10-25 11:49:03 -0700426 int64_t cutoff_nanos = newMin;
Yao Chen34900c32018-03-19 13:43:29 -0700427 for (auto it_changes = mChanges.begin(); it_changes != mChanges.end();) {
David Chenf384b902018-03-14 18:36:45 -0700428 if (it_changes->timestampNs < cutoff_nanos) {
429 mBytesUsed -= kBytesChangeRecord;
Yao Chen34900c32018-03-19 13:43:29 -0700430 it_changes = mChanges.erase(it_changes);
431 } else {
432 ++it_changes;
David Chend6896892017-10-25 11:49:03 -0700433 }
434 }
435 }
David Chenc136f45a2017-11-27 11:52:26 -0800436 StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
David Chenf384b902018-03-14 18:36:45 -0700437 StatsdStats::getInstance().setUidMapChanges(mChanges.size());
David Chende701692017-10-05 13:16:02 -0700438}
439
Yao Chena80e5c02018-09-04 13:55:29 -0700440void UidMap::printUidMap(int out) const {
David Chende701692017-10-05 13:16:02 -0700441 lock_guard<mutex> lock(mMutex);
442
David Chenbd125272018-04-04 19:02:50 -0700443 for (const auto& kv : mMap) {
444 if (!kv.second.deleted) {
dwchen730403e2018-10-29 11:41:56 -0700445 dprintf(out, "%s, v%" PRId64 ", %s, %s (%i)\n", kv.first.second.c_str(),
446 kv.second.versionCode, kv.second.versionString.c_str(),
447 kv.second.installer.c_str(), kv.first.first);
David Chenbd125272018-04-04 19:02:50 -0700448 }
David Chende701692017-10-05 13:16:02 -0700449 }
450}
451
David Chend6896892017-10-25 11:49:03 -0700452void UidMap::OnConfigUpdated(const ConfigKey& key) {
453 mLastUpdatePerConfigKey[key] = -1;
454}
455
456void UidMap::OnConfigRemoved(const ConfigKey& key) {
457 mLastUpdatePerConfigKey.erase(key);
458}
459
Yao Chend10f7b12017-12-18 12:53:50 -0800460set<int32_t> UidMap::getAppUid(const string& package) const {
461 lock_guard<mutex> lock(mMutex);
462
463 set<int32_t> results;
David Chenbd125272018-04-04 19:02:50 -0700464 for (const auto& kv : mMap) {
465 if (kv.first.second == package && !kv.second.deleted) {
466 results.insert(kv.first.first);
Yao Chend10f7b12017-12-18 12:53:50 -0800467 }
468 }
469 return results;
470}
471
Yao Chen147ce602017-12-22 14:35:34 -0800472// Note not all the following AIDs are used as uids. Some are used only for gids.
473// It's ok to leave them in the map, but we won't ever see them in the log's uid field.
474// App's uid starts from 10000, and will not overlap with the following AIDs.
475const std::map<string, uint32_t> UidMap::sAidToUidMapping = {{"AID_ROOT", 0},
476 {"AID_SYSTEM", 1000},
477 {"AID_RADIO", 1001},
478 {"AID_BLUETOOTH", 1002},
479 {"AID_GRAPHICS", 1003},
480 {"AID_INPUT", 1004},
481 {"AID_AUDIO", 1005},
482 {"AID_CAMERA", 1006},
483 {"AID_LOG", 1007},
484 {"AID_COMPASS", 1008},
485 {"AID_MOUNT", 1009},
486 {"AID_WIFI", 1010},
487 {"AID_ADB", 1011},
488 {"AID_INSTALL", 1012},
489 {"AID_MEDIA", 1013},
490 {"AID_DHCP", 1014},
491 {"AID_SDCARD_RW", 1015},
492 {"AID_VPN", 1016},
493 {"AID_KEYSTORE", 1017},
494 {"AID_USB", 1018},
495 {"AID_DRM", 1019},
496 {"AID_MDNSR", 1020},
497 {"AID_GPS", 1021},
498 // {"AID_UNUSED1", 1022},
499 {"AID_MEDIA_RW", 1023},
500 {"AID_MTP", 1024},
501 // {"AID_UNUSED2", 1025},
502 {"AID_DRMRPC", 1026},
503 {"AID_NFC", 1027},
504 {"AID_SDCARD_R", 1028},
505 {"AID_CLAT", 1029},
506 {"AID_LOOP_RADIO", 1030},
507 {"AID_MEDIA_DRM", 1031},
508 {"AID_PACKAGE_INFO", 1032},
509 {"AID_SDCARD_PICS", 1033},
510 {"AID_SDCARD_AV", 1034},
511 {"AID_SDCARD_ALL", 1035},
512 {"AID_LOGD", 1036},
513 {"AID_SHARED_RELRO", 1037},
514 {"AID_DBUS", 1038},
515 {"AID_TLSDATE", 1039},
516 {"AID_MEDIA_EX", 1040},
517 {"AID_AUDIOSERVER", 1041},
518 {"AID_METRICS_COLL", 1042},
519 {"AID_METRICSD", 1043},
520 {"AID_WEBSERV", 1044},
521 {"AID_DEBUGGERD", 1045},
522 {"AID_MEDIA_CODEC", 1046},
523 {"AID_CAMERASERVER", 1047},
524 {"AID_FIREWALL", 1048},
525 {"AID_TRUNKS", 1049},
526 {"AID_NVRAM", 1050},
527 {"AID_DNS", 1051},
528 {"AID_DNS_TETHER", 1052},
529 {"AID_WEBVIEW_ZYGOTE", 1053},
530 {"AID_VEHICLE_NETWORK", 1054},
531 {"AID_MEDIA_AUDIO", 1055},
532 {"AID_MEDIA_VIDEO", 1056},
533 {"AID_MEDIA_IMAGE", 1057},
534 {"AID_TOMBSTONED", 1058},
535 {"AID_MEDIA_OBB", 1059},
536 {"AID_ESE", 1060},
537 {"AID_OTA_UPDATE", 1061},
538 {"AID_AUTOMOTIVE_EVS", 1062},
539 {"AID_LOWPAN", 1063},
540 {"AID_HSM", 1064},
Yao Chen29f79b52018-01-17 10:56:48 -0800541 {"AID_RESERVED_DISK", 1065},
542 {"AID_STATSD", 1066},
543 {"AID_INCIDENTD", 1067},
Igor Murashkina1980ae2018-10-04 14:30:48 -0700544 {"AID_SECURE_ELEMENT", 1068},
545 {"AID_LMKD", 1069},
546 {"AID_LLKD", 1070},
Igor Murashkin12bb16c2018-10-05 16:25:21 -0700547 {"AID_IORAPD", 1071},
Tej Singh3be093b2020-03-04 20:08:38 -0800548 {"AID_GPU_SERVICE", 1072},
Chiachang Wang69e41312019-01-23 15:07:36 +0800549 {"AID_NETWORK_STACK", 1073},
Tej Singh3be093b2020-03-04 20:08:38 -0800550 {"AID_GSID", 1074},
551 {"AID_FSVERITY_CERT", 1075},
552 {"AID_CREDSTORE", 1076},
553 {"AID_EXTERNAL_STORAGE", 1077},
554 {"AID_EXT_DATA_RW", 1078},
555 {"AID_EXT_OBB_RW", 1079},
556 {"AID_CONTEXT_HUB", 1080},
Yao Chen147ce602017-12-22 14:35:34 -0800557 {"AID_SHELL", 2000},
558 {"AID_CACHE", 2001},
559 {"AID_DIAG", 2002}};
560
David Chende701692017-10-05 13:16:02 -0700561} // namespace statsd
562} // namespace os
Yao Chen29f79b52018-01-17 10:56:48 -0800563} // namespace android