diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 3207d56a820e5..212edf6d0daa7 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.InputStream; 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 @@ class PackageManagerShellCommand extends ShellCommand { 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 @@ class PackageManagerShellCommand extends ShellCommand { // 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 7b379e54a40ef..5a5b0a8d30aa6 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 #include #include +#include #include #include #include @@ -375,6 +376,9 @@ public: } 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 @@ private: 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(read.firstBlockIdx), - static_cast(read.count), - static_cast(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 @@ private: } // 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 @@ private: } } + // 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(read.firstBlockIdx), + static_cast(read.count), static_cast(fileIdx), + static_cast(appId), static_cast(userId)); + } else { + trace = android::base::StringPrintf("page_read: index=%lld count=%lld file=%d", + static_cast(read.firstBlockIdx), + static_cast(read.count), + static_cast(fileIdx)); + } + + ATRACE_BEGIN(trace.c_str()); + ATRACE_END(); + } + void receiver(unique_fd inout, MetadataMode mode) { std::vector data; std::vector instructions; diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 132f973ee83b1..56cb3d11d552a 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1091,7 +1091,7 @@ void IncrementalService::setUidReadTimeouts( 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(maxPendingTimeUs).count() << "ms < " << Constants::minPerUidTimeout.count() << "ms"; return; diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp index 3573177af1858..25d3f77fa58b9 100644 --- a/services/incremental/ServiceWrappers.cpp +++ b/services/incremental/ServiceWrappers.cpp @@ -221,10 +221,6 @@ public: 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); } };