Per UID DataLoader API.
Bug: 160634487
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest
Change-Id: Id423d838ac7950696b5f75bec2d1610fbc929210
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 3207d56a..212edf6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -122,6 +122,7 @@
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URISyntaxException;
+import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collection;
@@ -155,6 +156,8 @@
boolean mComponents;
int mQueryFlags;
+ private static final SecureRandom RANDOM = new SecureRandom();
+
PackageManagerShellCommand(PackageManagerService service, Context context) {
mInterface = service;
mLegacyPermissionManager = LocalServices.getService(LegacyPermissionManagerInternal.class);
@@ -3146,7 +3149,7 @@
// 1. Single file from stdin.
if (args.isEmpty() || STDIN_PATH.equals(args.get(0))) {
- final String name = "base." + (isApex ? "apex" : "apk");
+ final String name = "base" + RANDOM.nextInt() + "." + (isApex ? "apex" : "apk");
final Metadata metadata = Metadata.forStdIn(name);
session.addFile(LOCATION_DATA_APP, name, sessionSizeBytes,
metadata.toByteArray(), null);
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index 7b379e5..5a5b0a8 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -22,6 +22,7 @@
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <core_jni_helpers.h>
+#include <cutils/multiuser.h>
#include <cutils/trace.h>
#include <endian.h>
#include <nativehelper/JNIHelp.h>
@@ -375,6 +376,9 @@
}
private:
+ // Bitmask of supported features.
+ DataLoaderFeatures getFeatures() const final { return DATA_LOADER_FEATURE_UID; }
+
// Lifecycle.
bool onCreate(const android::dataloader::DataLoaderParams& params,
android::dataloader::FilesystemConnectorPtr ifs,
@@ -554,51 +558,6 @@
return true;
}
- // Read tracing.
- struct TracedRead {
- uint64_t timestampUs;
- android::dataloader::FileId fileId;
- uint32_t firstBlockIdx;
- uint32_t count;
- };
-
- void onPageReads(android::dataloader::PageReads pageReads) final {
- auto trace = atrace_is_tag_enabled(ATRACE_TAG);
- if (CC_LIKELY(!trace)) {
- return;
- }
-
- TracedRead last = {};
- for (auto&& read : pageReads) {
- if (read.id != last.fileId || read.block != last.firstBlockIdx + last.count) {
- traceRead(last);
- last = TracedRead{
- .timestampUs = read.bootClockTsUs,
- .fileId = read.id,
- .firstBlockIdx = (uint32_t)read.block,
- .count = 1,
- };
- } else {
- ++last.count;
- }
- }
- traceRead(last);
- }
-
- void traceRead(const TracedRead& read) {
- if (!read.count) {
- return;
- }
-
- FileIdx fileIdx = convertFileIdToFileIndex(read.fileId);
- auto str = android::base::StringPrintf("page_read: index=%lld count=%lld file=%d",
- static_cast<long long>(read.firstBlockIdx),
- static_cast<long long>(read.count),
- static_cast<int>(fileIdx));
- ATRACE_BEGIN(str.c_str());
- ATRACE_END();
- }
-
// Streaming.
bool initStreaming(unique_fd inout, MetadataMode mode) {
mEventFd.reset(eventfd(0, EFD_CLOEXEC));
@@ -634,7 +593,10 @@
}
// IFS callbacks.
- void onPendingReads(dataloader::PendingReads pendingReads) final {
+ void onPendingReads(dataloader::PendingReads pendingReads) final {}
+ void onPageReads(dataloader::PageReads pageReads) final {}
+
+ void onPendingReadsWithUid(dataloader::PendingReadsWithUid pendingReads) final {
std::lock_guard lock{mOutFdLock};
if (mOutFd < 0) {
return;
@@ -660,6 +622,67 @@
}
}
+ // Read tracing.
+ struct TracedRead {
+ uint64_t timestampUs;
+ android::dataloader::FileId fileId;
+ android::dataloader::Uid uid;
+ uint32_t firstBlockIdx;
+ uint32_t count;
+ };
+
+ void onPageReadsWithUid(dataloader::PageReadsWithUid pageReads) final {
+ auto trace = atrace_is_tag_enabled(ATRACE_TAG);
+ if (CC_LIKELY(!trace)) {
+ return;
+ }
+
+ TracedRead last = {};
+ for (auto&& read : pageReads) {
+ if (read.id != last.fileId || read.uid != last.uid ||
+ read.block != last.firstBlockIdx + last.count) {
+ traceRead(last);
+ last = TracedRead{
+ .timestampUs = read.bootClockTsUs,
+ .fileId = read.id,
+ .uid = read.uid,
+ .firstBlockIdx = (uint32_t)read.block,
+ .count = 1,
+ };
+ } else {
+ ++last.count;
+ }
+ }
+ traceRead(last);
+ }
+
+ void traceRead(const TracedRead& read) {
+ if (!read.count) {
+ return;
+ }
+
+ FileIdx fileIdx = convertFileIdToFileIndex(read.fileId);
+
+ std::string trace;
+ if (read.uid != kIncFsNoUid) {
+ auto appId = multiuser_get_app_id(read.uid);
+ auto userId = multiuser_get_user_id(read.uid);
+ trace = android::base::
+ StringPrintf("page_read: index=%lld count=%lld file=%d appid=%d userid=%d",
+ static_cast<long long>(read.firstBlockIdx),
+ static_cast<long long>(read.count), static_cast<int>(fileIdx),
+ static_cast<int>(appId), static_cast<int>(userId));
+ } else {
+ trace = android::base::StringPrintf("page_read: index=%lld count=%lld file=%d",
+ static_cast<long long>(read.firstBlockIdx),
+ static_cast<long long>(read.count),
+ static_cast<int>(fileIdx));
+ }
+
+ ATRACE_BEGIN(trace.c_str());
+ ATRACE_END();
+ }
+
void receiver(unique_fd inout, MetadataMode mode) {
std::vector<uint8_t> data;
std::vector<IncFsDataBlock> instructions;
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 132f973..56cb3d1 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -1091,7 +1091,7 @@
maxPendingTimeUs = std::max(maxPendingTimeUs, microseconds(timeouts.maxPendingTimeUs));
}
if (maxPendingTimeUs < Constants::minPerUidTimeout) {
- LOG(ERROR) << "Skip setting timeouts: maxPendingTime < Constants::minPerUidTimeout"
+ LOG(ERROR) << "Skip setting read timeouts (maxPendingTime < Constants::minPerUidTimeout): "
<< duration_cast<milliseconds>(maxPendingTimeUs).count() << "ms < "
<< Constants::minPerUidTimeout.count() << "ms";
return;
diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp
index 3573177..25d3f77 100644
--- a/services/incremental/ServiceWrappers.cpp
+++ b/services/incremental/ServiceWrappers.cpp
@@ -221,10 +221,6 @@
timeout.maxPendingTimeUs = perUidTimeout.maxPendingTimeUs;
}
- LOG(ERROR) << "Set read timeouts: " << timeouts.size() << " ["
- << (timeouts.empty() ? -1 : timeouts.front().uid) << "@"
- << (timeouts.empty() ? -1 : timeouts.front().minTimeUs / 1000) << "ms]";
-
return incfs::setUidReadTimeouts(control, timeouts);
}
};