Per UID DataLoader API.
Bug: 160634487 Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest Change-Id: Id423d838ac7950696b5f75bec2d1610fbc929210
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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 @@ 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<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 @@ 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<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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user