Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp +69 −46 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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, Loading Loading @@ -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<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)); Loading Loading @@ -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; Loading @@ -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<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; Loading services/incremental/IncrementalService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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<milliseconds>(maxPendingTimeUs).count() << "ms < " << Constants::minPerUidTimeout.count() << "ms"; return; Loading services/incremental/ServiceWrappers.cpp +0 −4 Original line number Diff line number Diff line Loading @@ -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); } }; Loading Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +4 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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); Loading
services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp +69 −46 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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, Loading Loading @@ -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<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)); Loading Loading @@ -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; Loading @@ -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<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; Loading
services/incremental/IncrementalService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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<milliseconds>(maxPendingTimeUs).count() << "ms < " << Constants::minPerUidTimeout.count() << "ms"; return; Loading
services/incremental/ServiceWrappers.cpp +0 −4 Original line number Diff line number Diff line Loading @@ -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); } }; Loading