Skip to content

Commit

Permalink
Merge QP1A.190530.001
Browse files Browse the repository at this point in the history
Change-Id: I802b7f465b775163726de0627cf9cb5e6773a190
  • Loading branch information
Scott Lobdell authored and Justin DeMartino committed May 31, 2019
2 parents 597b6c9 + 4b44886 commit a97ca47
Show file tree
Hide file tree
Showing 610 changed files with 13,306 additions and 6,994 deletions.
66 changes: 66 additions & 0 deletions api/test-current.txt
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,7 @@ package android.content {
method public void setAutofillOptions(@Nullable android.content.AutofillOptions);
method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions);
field public static final String BUGREPORT_SERVICE = "bugreport";
field public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture";
field public static final String ROLLBACK_SERVICE = "rollback";
field public static final String STATUS_BAR_SERVICE = "statusbar";
field public static final String TEST_NETWORK_SERVICE = "test_network";
Expand Down Expand Up @@ -1916,6 +1917,10 @@ package android.os {
method public boolean hasSingleFileDescriptor();
}

public final class Parcel {
method public int readExceptionCode();
}

public class ParcelFileDescriptor implements java.io.Closeable android.os.Parcelable {
method public static java.io.File getFile(java.io.FileDescriptor) throws java.io.IOException;
}
Expand Down Expand Up @@ -1985,6 +1990,7 @@ package android.os {
public class SystemProperties {
method @NonNull public static String get(@NonNull String);
method @NonNull public static String get(@NonNull String, @Nullable String);
method public static boolean getBoolean(@NonNull String, boolean);
}

public final class UserHandle implements android.os.Parcelable {
Expand Down Expand Up @@ -2139,6 +2145,36 @@ package android.os.health {

}

package android.os.image {

public class DynamicSystemClient {
ctor public DynamicSystemClient(@NonNull android.content.Context);
method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void bind();
method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long);
method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long, long);
method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void unbind();
field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6
field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4
field public static final int CAUSE_ERROR_IO = 3; // 0x3
field public static final int CAUSE_ERROR_IPC = 5; // 0x5
field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2
field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1
field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0
field public static final int STATUS_IN_PROGRESS = 2; // 0x2
field public static final int STATUS_IN_USE = 4; // 0x4
field public static final int STATUS_NOT_STARTED = 1; // 0x1
field public static final int STATUS_READY = 3; // 0x3
field public static final int STATUS_UNKNOWN = 0; // 0x0
}

public static interface DynamicSystemClient.OnStatusChangedListener {
method public void onStatusChanged(int, int, long, @Nullable Throwable);
}

}

package android.os.storage {

public class StorageManager {
Expand All @@ -2161,18 +2197,33 @@ package android.os.strictmode {
package android.permission {

public final class PermissionControllerManager {
method @RequiresPermission("android.permission.GET_RUNTIME_PERMISSIONS") public void getAppPermissions(@NonNull String, @NonNull android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, @Nullable android.os.Handler);
method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback);
field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1
field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2
field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2
field public static final int REASON_MALWARE = 1; // 0x1
}

public static interface PermissionControllerManager.OnGetAppPermissionResultCallback {
method public void onGetAppPermissions(@NonNull java.util.List<android.permission.RuntimePermissionPresentationInfo>);
}

public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback {
ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback();
method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>);
}

public final class RuntimePermissionPresentationInfo implements android.os.Parcelable {
ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean);
method public int describeContents();
method @NonNull public CharSequence getLabel();
method public boolean isGranted();
method public boolean isStandard();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR;
}

}

package android.print {
Expand Down Expand Up @@ -2930,6 +2981,21 @@ package android.util {
method public E valueAtUnchecked(int);
}

public class FeatureFlagUtils {
ctor public FeatureFlagUtils();
method public static java.util.Map<java.lang.String,java.lang.String> getAllFeatureFlags();
method public static boolean isEnabled(android.content.Context, String);
method public static void setEnabled(android.content.Context, String, boolean);
field public static final String DYNAMIC_SYSTEM = "settings_dynamic_system";
field public static final String FFLAG_OVERRIDE_PREFIX = "sys.fflag.override.";
field public static final String FFLAG_PREFIX = "sys.fflag.";
field public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
field public static final String PERSIST_PREFIX = "persist.sys.fflag.override.";
field public static final String PIXEL_WALLPAPER_CATEGORY_SWITCH = "settings_pixel_wallpaper_category_switch";
field public static final String SCREENRECORD_LONG_PRESS = "settings_screenrecord_long_press";
field public static final String SEAMLESS_TRANSFER = "settings_seamless_transfer";
}

public class TimeUtils {
method public static String formatDuration(long);
}
Expand Down
7 changes: 5 additions & 2 deletions cmds/bootanimation/BootAnimation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
namespace android {

static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
Expand Down Expand Up @@ -141,7 +142,6 @@ sp<SurfaceComposerClient> BootAnimation::session() const {
return mSession;
}


void BootAnimation::binderDied(const wp<IBinder>&)
{
// woah, surfaceflinger died!
Expand Down Expand Up @@ -355,8 +355,11 @@ void BootAnimation::findBootAnimationFile() {
}
}
}

const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1;
static const char* bootFiles[] =
{PRODUCT_BOOTANIMATION_FILE, OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE};
{playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE,
OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE};
static const char* shutdownFiles[] =
{PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE};

Expand Down
2 changes: 1 addition & 1 deletion cmds/incidentd/src/FdBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ namespace os {
namespace incidentd {

const ssize_t BUFFER_SIZE = 16 * 1024; // 16 KB
const ssize_t MAX_BUFFER_COUNT = 1536; // 24 MB max
const ssize_t MAX_BUFFER_COUNT = 6144; // 96 MB max

FdBuffer::FdBuffer()
:mBuffer(new EncodedBuffer(BUFFER_SIZE)),
Expand Down
2 changes: 1 addition & 1 deletion cmds/incidentd/src/IncidentService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ enum {

#define DEFAULT_DELAY_NS (1000000000LL)

#define DEFAULT_BYTES_SIZE_LIMIT (20 * 1024 * 1024) // 20MB
#define DEFAULT_BYTES_SIZE_LIMIT (96 * 1024 * 1024) // 96MB
#define DEFAULT_REFACTORY_PERIOD_MS (24 * 60 * 60 * 1000) // 1 Day

// Skip these sections for dumpstate only. Dumpstate allows 10s max for each service to dump.
Expand Down
2 changes: 1 addition & 1 deletion cmds/incidentd/src/WorkDirectory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ status_t ReportFile::load_envelope_impl(bool cleanup) {
WorkDirectory::WorkDirectory()
:mDirectory("/data/misc/incidents"),
mMaxFileCount(100),
mMaxDiskUsageBytes(30 * 1024 * 1024) { // Incident reports can take up to 30MB on disk.
mMaxDiskUsageBytes(100 * 1024 * 1024) { // Incident reports can take up to 100MB on disk.
// TODO: Should be a flag.
create_directory(mDirectory.c_str());
}
Expand Down
1 change: 0 additions & 1 deletion cmds/incidentd/testdata/morethan24MB.txt

This file was deleted.

1 change: 1 addition & 0 deletions cmds/incidentd/testdata/morethan96MB.txt

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions cmds/incidentd/tests/FdBuffer_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ TEST_F(FdBufferTest, ReadInStreamEmpty) {
}

TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithMove) {
const std::string testFile = kTestDataPath + "morethan24MB.txt";
size_t twentyfourMB = (size_t)24 * 1024 * 1024;
const std::string testFile = kTestDataPath + "morethan96MB.txt";
size_t ninetySixMB = (size_t)96 * 1024 * 1024;
unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
ASSERT_NE(fd.get(), -1);
int pid = fork();
Expand All @@ -254,21 +254,21 @@ TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithMove) {
ASSERT_EQ(NO_ERROR,
buffer.readProcessedDataInStream(fd, std::move(p2cPipe.writeFd()),
std::move(c2pPipe.readFd()), READ_TIMEOUT));
EXPECT_EQ(buffer.size(), twentyfourMB);
EXPECT_EQ(buffer.size(), ninetySixMB);
EXPECT_FALSE(buffer.timedOut());
EXPECT_TRUE(buffer.truncated());
wait(&pid);
sp<ProtoReader> reader = buffer.data()->read();
reader->move(twentyfourMB);
reader->move(ninetySixMB);

EXPECT_EQ(reader->bytesRead(), twentyfourMB);
EXPECT_EQ(reader->bytesRead(), ninetySixMB);
EXPECT_FALSE(reader->hasNext());
}
}

TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithNext) {
const std::string testFile = kTestDataPath + "morethan24MB.txt";
size_t twentyfourMB = (size_t)24 * 1024 * 1024;
const std::string testFile = kTestDataPath + "morethan96MB.txt";
size_t ninetySixMB = (size_t)96 * 1024 * 1024;
unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
ASSERT_NE(fd.get(), -1);
int pid = fork();
Expand All @@ -288,7 +288,7 @@ TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithNext) {
ASSERT_EQ(NO_ERROR,
buffer.readProcessedDataInStream(fd, std::move(p2cPipe.writeFd()),
std::move(c2pPipe.readFd()), READ_TIMEOUT));
EXPECT_EQ(buffer.size(), twentyfourMB);
EXPECT_EQ(buffer.size(), ninetySixMB);
EXPECT_FALSE(buffer.timedOut());
EXPECT_TRUE(buffer.truncated());
wait(&pid);
Expand Down
1 change: 1 addition & 0 deletions cmds/statsd/Android.bp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ cc_defaults {
":statsd_aidl",
"src/active_config_list.proto",
"src/statsd_config.proto",
"src/uid_data.proto",
"src/FieldValue.cpp",
"src/hash.cpp",
"src/stats_log_util.cpp",
Expand Down
108 changes: 100 additions & 8 deletions cmds/statsd/src/StatsService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <cutils/multiuser.h>
#include <dirent.h>
#include <frameworks/base/cmds/statsd/src/statsd_config.pb.h>
#include <frameworks/base/cmds/statsd/src/uid_data.pb.h>
#include <private/android_filesystem_config.h>
#include <statslog.h>
#include <stdio.h>
Expand Down Expand Up @@ -953,16 +954,49 @@ bool StatsService::getUidFromString(const char* s, int32_t& uid) {
|| (callingUid == AID_ROOT && goodUid == AID_SHELL); // ROOT can impersonate SHELL.
}

Status StatsService::informAllUidData(const vector<int32_t>& uid, const vector<int64_t>& version,
const vector<String16>& version_string,
const vector<String16>& app,
const vector<String16>& installer) {
Status StatsService::informAllUidData(const ParcelFileDescriptor& fd) {
ENFORCE_UID(AID_SYSTEM);
// Read stream into buffer.
string buffer;
if (!android::base::ReadFdToString(fd.get(), &buffer)) {
return exception(Status::EX_ILLEGAL_ARGUMENT, "Failed to read all data from the pipe.");
}

// Parse buffer.
UidData uidData;
if (!uidData.ParseFromString(buffer)) {
return exception(Status::EX_ILLEGAL_ARGUMENT, "Error parsing proto stream for UidData.");
}

VLOG("StatsService::informAllUidData was called");
mUidMap->updateMap(getElapsedRealtimeNs(), uid, version, version_string, app, installer);
VLOG("StatsService::informAllUidData succeeded");
vector<String16> versionStrings;
vector<String16> installers;
vector<String16> packageNames;
vector<int32_t> uids;
vector<int64_t> versions;

const auto numEntries = uidData.app_info_size();
versionStrings.reserve(numEntries);
installers.reserve(numEntries);
packageNames.reserve(numEntries);
uids.reserve(numEntries);
versions.reserve(numEntries);

for (const auto& appInfo: uidData.app_info()) {
packageNames.emplace_back(String16(appInfo.package_name().c_str()));
uids.push_back(appInfo.uid());
versions.push_back(appInfo.version());
versionStrings.emplace_back(String16(appInfo.version_string().c_str()));
installers.emplace_back(String16(appInfo.installer().c_str()));
}

mUidMap->updateMap(getElapsedRealtimeNs(),
uids,
versions,
versionStrings,
packageNames,
installers);

VLOG("StatsService::informAllUidData UidData proto parsed successfully.");
return Status::ok();
}

Expand Down Expand Up @@ -1264,7 +1298,7 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra
// This method only sends data, it does not receive it.
pid_t pid = IPCThreadState::self()->getCallingPid();
uid_t uid = IPCThreadState::self()->getCallingUid();
// Root, system, and shell always have access
// Root, system, and shell always have access
if (uid != AID_ROOT && uid != AID_SYSTEM && uid != AID_SHELL) {
// Caller must be granted these permissions
if (!checkCallingPermission(String16(kPermissionDump))) {
Expand Down Expand Up @@ -1349,6 +1383,64 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra
return Status::ok();
}

Status StatsService::sendWatchdogRollbackOccurredAtom(const int32_t rollbackTypeIn,
const android::String16& packageNameIn,
const int64_t packageVersionCodeIn) {
// Note: We skip the usage stats op check here since we do not have a package name.
// This is ok since we are overloading the usage_stats permission.
// This method only sends data, it does not receive it.
pid_t pid = IPCThreadState::self()->getCallingPid();
uid_t uid = IPCThreadState::self()->getCallingUid();
// Root, system, and shell always have access
if (uid != AID_ROOT && uid != AID_SYSTEM && uid != AID_SHELL) {
// Caller must be granted these permissions
if (!checkCallingPermission(String16(kPermissionDump))) {
return exception(binder::Status::EX_SECURITY,
StringPrintf("UID %d / PID %d lacks permission %s", uid, pid,
kPermissionDump));
}
if (!checkCallingPermission(String16(kPermissionUsage))) {
return exception(binder::Status::EX_SECURITY,
StringPrintf("UID %d / PID %d lacks permission %s", uid, pid,
kPermissionUsage));
}
}

android::util::stats_write(android::util::WATCHDOG_ROLLBACK_OCCURRED,
rollbackTypeIn, String8(packageNameIn).string(), packageVersionCodeIn);

// Fast return to save disk read.
if (rollbackTypeIn != android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS
&& rollbackTypeIn !=
android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE) {
return Status::ok();
}

bool readTrainInfoSuccess = false;
InstallTrainInfo trainInfoOnDisk;
readTrainInfoSuccess = StorageManager::readTrainInfo(trainInfoOnDisk);

if (!readTrainInfoSuccess) {
return Status::ok();
}
std::vector<int64_t> experimentIds = trainInfoOnDisk.experimentIds;
if (experimentIds.empty()) {
return Status::ok();
}
switch (rollbackTypeIn) {
case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE:
experimentIds.push_back(experimentIds[0] + 4);
break;
case android::util::WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS:
experimentIds.push_back(experimentIds[0] + 5);
break;
}
StorageManager::writeTrainInfo(trainInfoOnDisk.trainVersionCode, trainInfoOnDisk.trainName,
trainInfoOnDisk.status, experimentIds);
return Status::ok();
}


Status StatsService::getRegisteredExperimentIds(std::vector<int64_t>* experimentIdsOut) {
uid_t uid = IPCThreadState::self()->getCallingUid();

Expand Down
Loading

0 comments on commit a97ca47

Please sign in to comment.