Merge "surfaceflinger: use std::vector for waitForEventLocked"
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 2d780f5..cd0fbd4 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,3 +1,15 @@
+[Builtin Hooks]
+clang_format = true
+
+[Builtin Hooks Options]
+# Only turn on clang-format check for the following subfolders.
+clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc,cpp
+ libs/gui/
+ libs/ui/
+ libs/vr/
+ services/surfaceflinger/
+ services/vr/
+
[Hook Scripts]
owners_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "OWNERS$"
installd_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "^cmds/installd/"
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp
index d294d1e..17bb7c3 100644
--- a/cmds/dumpstate/dumpstate.cpp
+++ b/cmds/dumpstate/dumpstate.cpp
@@ -1376,6 +1376,54 @@
printf("========================================================\n");
}
+/* Dumps state for the default case. Returns true if everything went fine. */
+static bool DumpstateDefault() {
+ // Dumps systrace right away, otherwise it will be filled with unnecessary events.
+ // First try to dump anrd trace if the daemon is running. Otherwise, dump
+ // the raw trace.
+ if (!dump_anrd_trace()) {
+ dump_systrace();
+ }
+
+ // Invoking the following dumpsys calls before dump_traces() to try and
+ // keep the system stats as close to its initial state as possible.
+ RunDumpsysCritical();
+
+ /* collect stack traces from Dalvik and native processes (needs root) */
+ dump_traces_path = dump_traces();
+
+ /* Run some operations that require root. */
+ ds.tombstone_data_ = GetDumpFds(TOMBSTONE_DIR, TOMBSTONE_FILE_PREFIX, !ds.IsZipping());
+ ds.anr_data_ = GetDumpFds(ANR_DIR, ANR_FILE_PREFIX, !ds.IsZipping());
+
+ ds.AddDir(RECOVERY_DIR, true);
+ ds.AddDir(RECOVERY_DATA_DIR, true);
+ ds.AddDir(UPDATE_ENGINE_LOG_DIR, true);
+ ds.AddDir(LOGPERSIST_DATA_DIR, false);
+ if (!PropertiesHelper::IsUserBuild()) {
+ ds.AddDir(PROFILE_DATA_DIR_CUR, true);
+ ds.AddDir(PROFILE_DATA_DIR_REF, true);
+ }
+ add_mountinfo();
+ DumpIpTablesAsRoot();
+
+ // Capture any IPSec policies in play. No keys are exposed here.
+ RunCommand("IP XFRM POLICY", {"ip", "xfrm", "policy"}, CommandOptions::WithTimeout(10).Build());
+
+ // Run ss as root so we can see socket marks.
+ RunCommand("DETAILED SOCKET STATE", {"ss", "-eionptu"}, CommandOptions::WithTimeout(10).Build());
+
+ // Run iotop as root to show top 100 IO threads
+ RunCommand("IOTOP", {"iotop", "-n", "1", "-m", "100"});
+
+ if (!DropRootUser()) {
+ return false;
+ }
+
+ dumpstate();
+ return true;
+}
+
// This method collects common dumpsys for telephony and wifi
static void DumpstateRadioCommon() {
DumpIpTablesAsRoot();
@@ -1716,6 +1764,178 @@
// clang-format on
}
+/*
+ * Prepares state like filename, screenshot path, etc in Dumpstate. Also initializes ZipWriter
+ * if we are writing zip files and adds the version file.
+ */
+static void PrepareToWriteToFile() {
+ const Dumpstate::DumpOptions& options = ds.options_;
+ ds.bugreport_dir_ = dirname(options.use_outfile.c_str());
+ std::string build_id = android::base::GetProperty("ro.build.id", "UNKNOWN_BUILD");
+ std::string device_name = android::base::GetProperty("ro.product.name", "UNKNOWN_DEVICE");
+ ds.base_name_ = android::base::StringPrintf("%s-%s-%s", basename(options.use_outfile.c_str()),
+ device_name.c_str(), build_id.c_str());
+ if (options.do_add_date) {
+ char date[80];
+ strftime(date, sizeof(date), "%Y-%m-%d-%H-%M-%S", localtime(&ds.now_));
+ ds.name_ = date;
+ } else {
+ ds.name_ = "undated";
+ }
+
+ if (options.telephony_only) {
+ ds.base_name_ += "-telephony";
+ } else if (options.wifi_only) {
+ ds.base_name_ += "-wifi";
+ }
+
+ if (options.do_fb) {
+ ds.screenshot_path_ = ds.GetPath(".png");
+ }
+ ds.tmp_path_ = ds.GetPath(".tmp");
+ ds.log_path_ = ds.GetPath("-dumpstate_log-" + std::to_string(ds.pid_) + ".txt");
+
+ MYLOGD(
+ "Bugreport dir: %s\n"
+ "Base name: %s\n"
+ "Suffix: %s\n"
+ "Log path: %s\n"
+ "Temporary path: %s\n"
+ "Screenshot path: %s\n",
+ ds.bugreport_dir_.c_str(), ds.base_name_.c_str(), ds.name_.c_str(), ds.log_path_.c_str(),
+ ds.tmp_path_.c_str(), ds.screenshot_path_.c_str());
+
+ if (options.do_zip_file) {
+ ds.path_ = ds.GetPath(".zip");
+ MYLOGD("Creating initial .zip file (%s)\n", ds.path_.c_str());
+ create_parent_dirs(ds.path_.c_str());
+ ds.zip_file.reset(fopen(ds.path_.c_str(), "wb"));
+ if (ds.zip_file == nullptr) {
+ MYLOGE("fopen(%s, 'wb'): %s\n", ds.path_.c_str(), strerror(errno));
+ } else {
+ ds.zip_writer_.reset(new ZipWriter(ds.zip_file.get()));
+ }
+ ds.AddTextZipEntry("version.txt", ds.version_);
+ }
+}
+
+/*
+ * Finalizes writing to the file by renaming or zipping the tmp file to the final location,
+ * printing zipped file status, etc.
+ */
+static void FinalizeFile() {
+ const Dumpstate::DumpOptions& options = ds.options_;
+ /* check if user changed the suffix using system properties */
+ std::string name =
+ android::base::GetProperty(android::base::StringPrintf("dumpstate.%d.name", ds.pid_), "");
+ bool change_suffix = false;
+ if (!name.empty()) {
+ /* must whitelist which characters are allowed, otherwise it could cross directories */
+ std::regex valid_regex("^[-_a-zA-Z0-9]+$");
+ if (std::regex_match(name.c_str(), valid_regex)) {
+ change_suffix = true;
+ } else {
+ MYLOGE("invalid suffix provided by user: %s\n", name.c_str());
+ }
+ }
+ if (change_suffix) {
+ MYLOGI("changing suffix from %s to %s\n", ds.name_.c_str(), name.c_str());
+ ds.name_ = name;
+ if (!ds.screenshot_path_.empty()) {
+ std::string new_screenshot_path = ds.GetPath(".png");
+ if (rename(ds.screenshot_path_.c_str(), new_screenshot_path.c_str())) {
+ MYLOGE("rename(%s, %s): %s\n", ds.screenshot_path_.c_str(),
+ new_screenshot_path.c_str(), strerror(errno));
+ } else {
+ ds.screenshot_path_ = new_screenshot_path;
+ }
+ }
+ }
+
+ bool do_text_file = true;
+ if (options.do_zip_file) {
+ if (!ds.FinishZipFile()) {
+ MYLOGE("Failed to finish zip file; sending text bugreport instead\n");
+ do_text_file = true;
+ } else {
+ do_text_file = false;
+ // Since zip file is already created, it needs to be renamed.
+ std::string new_path = ds.GetPath(".zip");
+ if (ds.path_ != new_path) {
+ MYLOGD("Renaming zip file from %s to %s\n", ds.path_.c_str(), new_path.c_str());
+ if (rename(ds.path_.c_str(), new_path.c_str())) {
+ MYLOGE("rename(%s, %s): %s\n", ds.path_.c_str(), new_path.c_str(),
+ strerror(errno));
+ } else {
+ ds.path_ = new_path;
+ }
+ }
+ }
+ }
+ if (do_text_file) {
+ ds.path_ = ds.GetPath(".txt");
+ MYLOGD("Generating .txt bugreport at %s from %s\n", ds.path_.c_str(), ds.tmp_path_.c_str());
+ if (rename(ds.tmp_path_.c_str(), ds.path_.c_str())) {
+ MYLOGE("rename(%s, %s): %s\n", ds.tmp_path_.c_str(), ds.path_.c_str(), strerror(errno));
+ ds.path_.clear();
+ }
+ }
+ if (options.use_control_socket) {
+ if (do_text_file) {
+ dprintf(ds.control_socket_fd_,
+ "FAIL:could not create zip file, check %s "
+ "for more details\n",
+ ds.log_path_.c_str());
+ } else {
+ dprintf(ds.control_socket_fd_, "OK:%s\n", ds.path_.c_str());
+ }
+ }
+}
+
+/* Broadcasts that we are done with the bugreport */
+static void SendBugreportFinishedBroadcast() {
+ const Dumpstate::DumpOptions& options = ds.options_;
+ if (!ds.path_.empty()) {
+ MYLOGI("Final bugreport path: %s\n", ds.path_.c_str());
+ // clang-format off
+
+ std::vector<std::string> am_args = {
+ "--receiver-permission", "android.permission.DUMP",
+ "--ei", "android.intent.extra.ID", std::to_string(ds.id_),
+ "--ei", "android.intent.extra.PID", std::to_string(ds.pid_),
+ "--ei", "android.intent.extra.MAX", std::to_string(ds.progress_->GetMax()),
+ "--es", "android.intent.extra.BUGREPORT", ds.path_,
+ "--es", "android.intent.extra.DUMPSTATE_LOG", ds.log_path_
+ };
+ // clang-format on
+ if (options.do_fb) {
+ am_args.push_back("--es");
+ am_args.push_back("android.intent.extra.SCREENSHOT");
+ am_args.push_back(ds.screenshot_path_);
+ }
+ if (!ds.notification_title.empty()) {
+ am_args.push_back("--es");
+ am_args.push_back("android.intent.extra.TITLE");
+ am_args.push_back(ds.notification_title);
+ if (!ds.notification_description.empty()) {
+ am_args.push_back("--es");
+ am_args.push_back("android.intent.extra.DESCRIPTION");
+ am_args.push_back(ds.notification_description);
+ }
+ }
+ if (options.is_remote_mode) {
+ am_args.push_back("--es");
+ am_args.push_back("android.intent.extra.REMOTE_BUGREPORT_HASH");
+ am_args.push_back(SHA256_file_hash(ds.path_));
+ SendBroadcast("com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED", am_args);
+ } else {
+ SendBroadcast("com.android.internal.intent.action.BUGREPORT_FINISHED", am_args);
+ }
+ } else {
+ MYLOGE("Skipping finished broadcast because bugreport could not be generated\n");
+ }
+}
+
int Dumpstate::ParseCommandlineOptions(int argc, char* argv[]) {
int ret = -1; // success
int c;
@@ -1864,8 +2084,7 @@
exit(1);
}
- // TODO: make const reference, but first avoid setting do_zip_file below.
- Dumpstate::DumpOptions& options = ds.options_;
+ const Dumpstate::DumpOptions& options = ds.options_;
if (options.show_header_only) {
ds.PrintHeader();
exit(0);
@@ -1922,60 +2141,11 @@
}
if (is_redirecting) {
- ds.bugreport_dir_ = dirname(options.use_outfile.c_str());
- std::string build_id = android::base::GetProperty("ro.build.id", "UNKNOWN_BUILD");
- std::string device_name = android::base::GetProperty("ro.product.name", "UNKNOWN_DEVICE");
- ds.base_name_ =
- android::base::StringPrintf("%s-%s-%s", basename(options.use_outfile.c_str()),
- device_name.c_str(), build_id.c_str());
- if (options.do_add_date) {
- char date[80];
- strftime(date, sizeof(date), "%Y-%m-%d-%H-%M-%S", localtime(&ds.now_));
- ds.name_ = date;
- } else {
- ds.name_ = "undated";
- }
-
- if (options.telephony_only) {
- ds.base_name_ += "-telephony";
- } else if (options.wifi_only) {
- ds.base_name_ += "-wifi";
- }
-
- if (options.do_fb) {
- ds.screenshot_path_ = ds.GetPath(".png");
- }
- ds.tmp_path_ = ds.GetPath(".tmp");
- ds.log_path_ = ds.GetPath("-dumpstate_log-" + std::to_string(ds.pid_) + ".txt");
-
- MYLOGD(
- "Bugreport dir: %s\n"
- "Base name: %s\n"
- "Suffix: %s\n"
- "Log path: %s\n"
- "Temporary path: %s\n"
- "Screenshot path: %s\n",
- ds.bugreport_dir_.c_str(), ds.base_name_.c_str(), ds.name_.c_str(),
- ds.log_path_.c_str(), ds.tmp_path_.c_str(), ds.screenshot_path_.c_str());
-
- if (options.do_zip_file) {
- ds.path_ = ds.GetPath(".zip");
- MYLOGD("Creating initial .zip file (%s)\n", ds.path_.c_str());
- create_parent_dirs(ds.path_.c_str());
- ds.zip_file.reset(fopen(ds.path_.c_str(), "wb"));
- if (ds.zip_file == nullptr) {
- MYLOGE("fopen(%s, 'wb'): %s\n", ds.path_.c_str(), strerror(errno));
- options.do_zip_file = false;
- } else {
- ds.zip_writer_.reset(new ZipWriter(ds.zip_file.get()));
- }
- ds.AddTextZipEntry("version.txt", ds.version_);
- }
+ PrepareToWriteToFile();
if (ds.update_progress_) {
if (options.do_broadcast) {
// clang-format off
-
std::vector<std::string> am_args = {
"--receiver-permission", "android.permission.DUMP",
"--es", "android.intent.extra.NAME", ds.name_,
@@ -2013,7 +2183,7 @@
}
}
- if (options.do_zip_file) {
+ if (options.do_zip_file && ds.zip_file != nullptr) {
if (chown(ds.path_.c_str(), AID_SHELL, AID_SHELL)) {
MYLOGE("Unable to change ownership of zip file %s: %s\n", ds.path_.c_str(),
strerror(errno));
@@ -2054,51 +2224,11 @@
} else if (options.wifi_only) {
DumpstateWifiOnly();
} else {
- // Dumps systrace right away, otherwise it will be filled with unnecessary events.
- // First try to dump anrd trace if the daemon is running. Otherwise, dump
- // the raw trace.
- if (!dump_anrd_trace()) {
- dump_systrace();
- }
-
- // Invoking the following dumpsys calls before dump_traces() to try and
- // keep the system stats as close to its initial state as possible.
- RunDumpsysCritical();
-
- /* collect stack traces from Dalvik and native processes (needs root) */
- dump_traces_path = dump_traces();
-
- /* Run some operations that require root. */
- ds.tombstone_data_ = GetDumpFds(TOMBSTONE_DIR, TOMBSTONE_FILE_PREFIX, !ds.IsZipping());
- ds.anr_data_ = GetDumpFds(ANR_DIR, ANR_FILE_PREFIX, !ds.IsZipping());
-
- ds.AddDir(RECOVERY_DIR, true);
- ds.AddDir(RECOVERY_DATA_DIR, true);
- ds.AddDir(UPDATE_ENGINE_LOG_DIR, true);
- ds.AddDir(LOGPERSIST_DATA_DIR, false);
- if (!PropertiesHelper::IsUserBuild()) {
- ds.AddDir(PROFILE_DATA_DIR_CUR, true);
- ds.AddDir(PROFILE_DATA_DIR_REF, true);
- }
- add_mountinfo();
- DumpIpTablesAsRoot();
-
- // Capture any IPSec policies in play. No keys are exposed here.
- RunCommand("IP XFRM POLICY", {"ip", "xfrm", "policy"},
- CommandOptions::WithTimeout(10).Build());
-
- // Run ss as root so we can see socket marks.
- RunCommand("DETAILED SOCKET STATE", {"ss", "-eionptu"},
- CommandOptions::WithTimeout(10).Build());
-
- // Run iotop as root to show top 100 IO threads
- RunCommand("IOTOP", {"iotop", "-n", "1", "-m", "100"});
-
- if (!DropRootUser()) {
+ // Dump state for the default case. This also drops root.
+ if (!DumpstateDefault()) {
+ // Something went wrong.
return -1;
}
-
- dumpstate();
}
/* close output if needed */
@@ -2108,73 +2238,7 @@
/* rename or zip the (now complete) .tmp file to its final location */
if (!options.use_outfile.empty()) {
- /* check if user changed the suffix using system properties */
- std::string name = android::base::GetProperty(
- android::base::StringPrintf("dumpstate.%d.name", ds.pid_), "");
- bool change_suffix = false;
- if (!name.empty()) {
- /* must whitelist which characters are allowed, otherwise it could cross directories */
- std::regex valid_regex("^[-_a-zA-Z0-9]+$");
- if (std::regex_match(name.c_str(), valid_regex)) {
- change_suffix = true;
- } else {
- MYLOGE("invalid suffix provided by user: %s\n", name.c_str());
- }
- }
- if (change_suffix) {
- MYLOGI("changing suffix from %s to %s\n", ds.name_.c_str(), name.c_str());
- ds.name_ = name;
- if (!ds.screenshot_path_.empty()) {
- std::string new_screenshot_path = ds.GetPath(".png");
- if (rename(ds.screenshot_path_.c_str(), new_screenshot_path.c_str())) {
- MYLOGE("rename(%s, %s): %s\n", ds.screenshot_path_.c_str(),
- new_screenshot_path.c_str(), strerror(errno));
- } else {
- ds.screenshot_path_ = new_screenshot_path;
- }
- }
- }
-
- bool do_text_file = true;
- if (options.do_zip_file) {
- if (!ds.FinishZipFile()) {
- MYLOGE("Failed to finish zip file; sending text bugreport instead\n");
- do_text_file = true;
- } else {
- do_text_file = false;
- // Since zip file is already created, it needs to be renamed.
- std::string new_path = ds.GetPath(".zip");
- if (ds.path_ != new_path) {
- MYLOGD("Renaming zip file from %s to %s\n", ds.path_.c_str(), new_path.c_str());
- if (rename(ds.path_.c_str(), new_path.c_str())) {
- MYLOGE("rename(%s, %s): %s\n", ds.path_.c_str(), new_path.c_str(),
- strerror(errno));
- } else {
- ds.path_ = new_path;
- }
- }
- }
- }
- if (do_text_file) {
- ds.path_ = ds.GetPath(".txt");
- MYLOGD("Generating .txt bugreport at %s from %s\n", ds.path_.c_str(),
- ds.tmp_path_.c_str());
- if (rename(ds.tmp_path_.c_str(), ds.path_.c_str())) {
- MYLOGE("rename(%s, %s): %s\n", ds.tmp_path_.c_str(), ds.path_.c_str(),
- strerror(errno));
- ds.path_.clear();
- }
- }
- if (options.use_control_socket) {
- if (do_text_file) {
- dprintf(ds.control_socket_fd_,
- "FAIL:could not create zip file, check %s "
- "for more details\n",
- ds.log_path_.c_str());
- } else {
- dprintf(ds.control_socket_fd_, "OK:%s\n", ds.path_.c_str());
- }
- }
+ FinalizeFile();
}
/* vibrate a few but shortly times to let user know it's finished */
@@ -2187,46 +2251,7 @@
/* tell activity manager we're done */
if (options.do_broadcast) {
- if (!ds.path_.empty()) {
- MYLOGI("Final bugreport path: %s\n", ds.path_.c_str());
- // clang-format off
-
- std::vector<std::string> am_args = {
- "--receiver-permission", "android.permission.DUMP",
- "--ei", "android.intent.extra.ID", std::to_string(ds.id_),
- "--ei", "android.intent.extra.PID", std::to_string(ds.pid_),
- "--ei", "android.intent.extra.MAX", std::to_string(ds.progress_->GetMax()),
- "--es", "android.intent.extra.BUGREPORT", ds.path_,
- "--es", "android.intent.extra.DUMPSTATE_LOG", ds.log_path_
- };
- // clang-format on
- if (options.do_fb) {
- am_args.push_back("--es");
- am_args.push_back("android.intent.extra.SCREENSHOT");
- am_args.push_back(ds.screenshot_path_);
- }
- if (!ds.notification_title.empty()) {
- am_args.push_back("--es");
- am_args.push_back("android.intent.extra.TITLE");
- am_args.push_back(ds.notification_title);
- if (!ds.notification_description.empty()) {
- am_args.push_back("--es");
- am_args.push_back("android.intent.extra.DESCRIPTION");
- am_args.push_back(ds.notification_description);
- }
- }
- if (options.is_remote_mode) {
- am_args.push_back("--es");
- am_args.push_back("android.intent.extra.REMOTE_BUGREPORT_HASH");
- am_args.push_back(SHA256_file_hash(ds.path_));
- SendBroadcast("com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED",
- am_args);
- } else {
- SendBroadcast("com.android.internal.intent.action.BUGREPORT_FINISHED", am_args);
- }
- } else {
- MYLOGE("Skipping finished broadcast because bugreport could not be generated\n");
- }
+ SendBugreportFinishedBroadcast();
}
MYLOGD("Final progress: %d/%d (estimated %d)\n", ds.progress_->Get(), ds.progress_->GetMax(),
diff --git a/cmds/installd/MatchExtensionGen.h b/cmds/installd/MatchExtensionGen.h
index fded6b7..35c3889 100644
--- a/cmds/installd/MatchExtensionGen.h
+++ b/cmds/installd/MatchExtensionGen.h
@@ -31,6 +31,7 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'p': case 'P':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
@@ -41,10 +42,15 @@
switch (ext[5]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
}
+ break;
}
+ break;
case 'a': case 'A':
switch (ext[1]) {
case 'a': case 'A':
@@ -53,7 +59,9 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'i': case 'I':
switch (ext[2]) {
case 'f': case 'F':
@@ -63,56 +71,73 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'f': case 'F':
switch (ext[4]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
}
+ break;
case 'm': case 'M':
switch (ext[2]) {
case 'r': case 'R':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[2]) {
case 't': case 'T':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
case 'w': case 'W':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 's': case 'S':
switch (ext[2]) {
case 'f': case 'F':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'v': case 'V':
switch (ext[2]) {
case 'i': case 'I':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'w': case 'W':
switch (ext[2]) {
case 'b': case 'B':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
}
+ break;
case 'b': case 'B':
switch (ext[1]) {
case 'm': case 'M':
@@ -121,8 +146,11 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'c': case 'C':
switch (ext[1]) {
case 'r': case 'R':
@@ -131,8 +159,11 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'd': case 'D':
switch (ext[1]) {
case 'i': case 'I':
@@ -141,23 +172,30 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'l': case 'L':
switch (ext[2]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'n': case 'N':
switch (ext[2]) {
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'v': case 'V':
switch (ext[2]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'f': case 'F':
switch (ext[1]) {
case 'l': case 'L':
@@ -168,13 +206,18 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'i': case 'I':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
case 'g': case 'G':
switch (ext[1]) {
case 'i': case 'I':
@@ -183,15 +226,20 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 's': case 'S':
switch (ext[2]) {
case 'm': case 'M':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
}
+ break;
case 'j': case 'J':
switch (ext[1]) {
case 'n': case 'N':
@@ -200,7 +248,9 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'p': case 'P':
switch (ext[2]) {
case 'e': case 'E':
@@ -210,13 +260,18 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'l': case 'L':
switch (ext[1]) {
case 's': case 'S':
@@ -225,12 +280,16 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
case 'm': case 'M':
switch (ext[1]) {
case '3':
@@ -239,36 +298,46 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case '4':
switch (ext[2]) {
case 'a': case 'A':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'v': case 'V':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'k': case 'K':
switch (ext[2]) {
case 'a': case 'A':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'v': case 'V':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'n': case 'N':
switch (ext[2]) {
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'o': case 'O':
switch (ext[2]) {
case 'v': case 'V':
@@ -280,23 +349,30 @@
switch (ext[5]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
}
+ break;
case 'p': case 'P':
switch (ext[2]) {
case '2':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case '3':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case '4':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'e': case 'E':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
@@ -307,8 +383,11 @@
switch (ext[5]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
}
+ break;
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
@@ -316,16 +395,22 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
}
+ break;
case 'x': case 'X':
switch (ext[2]) {
case 'u': case 'U':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
case 'n': case 'N':
switch (ext[1]) {
case 'e': case 'E':
@@ -334,15 +419,20 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[2]) {
case 'w': case 'W':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'o': case 'O':
switch (ext[1]) {
case 'g': case 'G':
@@ -351,19 +441,25 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[2]) {
case 'f': case 'F':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'p': case 'P':
switch (ext[1]) {
case 'b': case 'B':
@@ -372,68 +468,88 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'c': case 'C':
switch (ext[2]) {
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'e': case 'E':
switch (ext[2]) {
case 'f': case 'F':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'g': case 'G':
switch (ext[2]) {
case 'm': case 'M':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'l': case 'L':
switch (ext[2]) {
case 's': case 'S':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'n': case 'N':
switch (ext[2]) {
case 'g': case 'G':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
case 'm': case 'M':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'p': case 'P':
switch (ext[2]) {
case 'm': case 'M':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 's': case 'S':
switch (ext[2]) {
case 'd': case 'D':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'q': case 'Q':
switch (ext[1]) {
case 't': case 'T':
switch (ext[2]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[1]) {
case 'a': case 'A':
@@ -443,30 +559,39 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 's': case 'S':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'g': case 'G':
switch (ext[2]) {
case 'b': case 'B':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'm': case 'M':
switch (ext[2]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'w': case 'W':
switch (ext[2]) {
case '2':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 's': case 'S':
switch (ext[1]) {
case 'd': case 'D':
@@ -475,21 +600,27 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'n': case 'N':
switch (ext[2]) {
case 'd': case 'D':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[2]) {
case 'w': case 'W':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'v': case 'V':
switch (ext[2]) {
case 'g': case 'G':
@@ -499,9 +630,13 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
}
+ break;
case 't': case 'T':
switch (ext[1]) {
case 'i': case 'I':
@@ -513,13 +648,18 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 's': case 'S':
switch (ext[2]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'v': case 'V':
switch (ext[1]) {
case 'o': case 'O':
@@ -528,8 +668,11 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
case 'w': case 'W':
switch (ext[1]) {
case 'a': case 'A':
@@ -538,11 +681,14 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
}
+ break;
case 'b': case 'B':
switch (ext[2]) {
case 'm': case 'M':
@@ -551,8 +697,11 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'e': case 'E':
switch (ext[2]) {
case 'b': case 'B':
@@ -561,12 +710,16 @@
switch (ext[4]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'p': case 'P':
switch (ext[4]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
case 'm': case 'M':
switch (ext[2]) {
case '\0': return AID_MEDIA_VIDEO;
@@ -574,30 +727,39 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_AUDIO;
}
+ break;
case 'v': case 'V':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'r': case 'R':
switch (ext[2]) {
case 'f': case 'F':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
case 'v': case 'V':
switch (ext[2]) {
case 'x': case 'X':
switch (ext[3]) {
case '\0': return AID_MEDIA_VIDEO;
}
+ break;
}
+ break;
}
+ break;
case 'x': case 'X':
switch (ext[1]) {
case 'b': case 'B':
@@ -606,22 +768,29 @@
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'p': case 'P':
switch (ext[2]) {
case 'm': case 'M':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
case 'w': case 'W':
switch (ext[2]) {
case 'd': case 'D':
switch (ext[3]) {
case '\0': return AID_MEDIA_IMAGE;
}
+ break;
}
+ break;
}
+ break;
}
return 0;
diff --git a/cmds/installd/matchgen.py b/cmds/installd/matchgen.py
index 131487d..42ce82b 100644
--- a/cmds/installd/matchgen.py
+++ b/cmds/installd/matchgen.py
@@ -84,6 +84,8 @@
print "%scase '%s':" % (prefix, k)
dump(target[k], index + 1)
print "%s}" % (prefix)
+ if index > 0:
+ print "%sbreak;" % (prefix)
dump(trie, 0)
diff --git a/cmds/installd/tests/installd_utils_test.cpp b/cmds/installd/tests/installd_utils_test.cpp
index bcdd03e..ad7a5ae 100644
--- a/cmds/installd/tests/installd_utils_test.cpp
+++ b/cmds/installd/tests/installd_utils_test.cpp
@@ -21,6 +21,7 @@
#include <gtest/gtest.h>
#include "InstalldNativeService.h"
+#include "MatchExtensionGen.h"
#include "globals.h"
#include "utils.h"
@@ -529,5 +530,19 @@
EXPECT_NE(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/dir//file"));
}
+TEST_F(UtilsTest, MatchExtension_Valid) {
+ EXPECT_EQ(AID_MEDIA_VIDEO, MatchExtension("mpg"));
+ EXPECT_EQ(AID_MEDIA_VIDEO, MatchExtension("mpeg"));
+ EXPECT_EQ(AID_MEDIA_VIDEO, MatchExtension("mPeG"));
+ EXPECT_EQ(AID_MEDIA_VIDEO, MatchExtension("MPEG"));
+}
+
+TEST_F(UtilsTest, MatchExtension_Invalid) {
+ EXPECT_EQ(0, MatchExtension("log"));
+ EXPECT_EQ(0, MatchExtension("3amp"));
+ EXPECT_EQ(0, MatchExtension("fpe"));
+ EXPECT_EQ(0, MatchExtension("docx"));
+}
+
} // namespace installd
} // namespace android
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 90721b8..1421a48 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -38,6 +38,18 @@
extern "C" {
android_namespace_t* android_get_exported_namespace(const char*);
+
+ // TODO(ianelliott@): Get this from an ANGLE header:
+ typedef enum ANGLEPreference {
+ ANGLE_NO_PREFERENCE = 0,
+ ANGLE_PREFER_NATIVE = 1,
+ ANGLE_PREFER_ANGLE = 2,
+ } ANGLEPreference;
+
+ // TODO(ianelliott@): Get this from an ANGLE header:
+ typedef bool (*fpANGLEUseForApplication)(const char* appName, const char* deviceMfr,
+ const char* deviceModel, ANGLEPreference developerOption,
+ ANGLEPreference appPreference);
}
// ----------------------------------------------------------------------------
@@ -475,6 +487,18 @@
return nullptr;
}
+static ANGLEPreference getAnglePref(const char* app_pref) {
+ if (app_pref == nullptr)
+ return ANGLE_NO_PREFERENCE;
+
+ if (strcmp(app_pref, "angle") == 0) {
+ return ANGLE_PREFER_ANGLE;
+ } else if (strcmp(app_pref, "native") == 0) {
+ return ANGLE_PREFER_NATIVE;
+ }
+ return ANGLE_NO_PREFERENCE;
+}
+
static void* load_angle(const char* kind, egl_connection_t* cnx) {
// Only attempt to load ANGLE libs
if (strcmp(kind, "EGL") != 0 && strcmp(kind, "GLESv2") != 0 && strcmp(kind, "GLESv1_CM") != 0)
@@ -489,23 +513,54 @@
const char* app_pref = android_getAngleAppPref();
bool developer_opt_in = android_getAngleDeveloperOptIn();
- if (ns) {
- // If we got a namespce for ANGLE, check any other conditions
- // before loading from it.
- // TODO: Call opt-in logic rather than use pref directly
- // app_pref will be "angle", "native", or "dontcare"
- if ((developer_opt_in || !strcmp(app_pref, "angle"))) {
- so = load_angle_from_namespace(kind, ns);
+ // Determine whether or not to use ANGLE:
+ ANGLEPreference developer_option = developer_opt_in ? ANGLE_PREFER_ANGLE : ANGLE_NO_PREFERENCE;
+ bool use_angle = (developer_option == ANGLE_PREFER_ANGLE);
+
+ if (use_angle) {
+ ALOGV("User set \"Developer Options\" to force the use of ANGLE");
+ } else {
+ // The "Developer Options" value wasn't set to force the use of ANGLE. Need to temporarily
+ // load ANGLE and call the updatable opt-in/out logic:
+ std::string app_name_str = app_name ? app_name : "";
+ char manufacturer[PROPERTY_VALUE_MAX];
+ char model[PROPERTY_VALUE_MAX];
+ property_get("ro.product.manufacturer", manufacturer, "UNSET");
+ property_get("ro.product.model", model, "UNSET");
+ ANGLEPreference app_preference = getAnglePref(android_getAngleAppPref());
+
+ so = load_angle_from_namespace("GLESv2", ns);
+ if (so) {
+ ALOGV("Temporarily loaded ANGLE's opt-in/out logic from namespace");
+ fpANGLEUseForApplication fp =
+ (fpANGLEUseForApplication)dlsym(so, "ANGLEUseForApplication");
+ if (fp) {
+ use_angle = (fp)(app_name_str.c_str(), manufacturer, model, developer_option,
+ app_preference);
+ ALOGV("Result of opt-in/out logic is %s", use_angle ? "true" : "false");
+ }
+
+ ALOGV("Close temporarily-loaded ANGLE opt-in/out logic");
+ dlclose(so);
+ so = nullptr;
+ } else {
+ // We weren't able to load and call the updateable opt-in/out logic.
+ // If we can't load the library, there is no ANGLE available.
+ use_angle = false;
+ ALOGV("Could not temporarily-load the ANGLE opt-in/out logic, cannot use ANGLE.");
}
}
+ if (use_angle) {
+ so = load_angle_from_namespace(kind, ns);
+ }
if (so) {
- ALOGD("Loaded ANGLE %s library for %s (instead of native)",
+ ALOGV("Loaded ANGLE %s library for %s (instead of native)",
kind, app_name ? app_name : "nullptr");
property_get("debug.angle.backend", prop, "UNSET");
- ALOGD("ANGLE's backend set to %s", prop);
+ ALOGV("ANGLE's backend set to %s", prop);
property_get("debug.hwui.renderer", prop, "UNSET");
- ALOGD("Skia's renderer set to %s", prop);
+ ALOGV("Skia's renderer set to %s", prop);
cnx->useAngle = true;
// Find and load vendor libEGL for ANGLE
if (!cnx->vendorEGL) {
@@ -513,7 +568,7 @@
}
return so;
} else {
- ALOGD("Loaded native %s library for %s (instead of ANGLE)",
+ ALOGV("Loaded native %s library for %s (instead of ANGLE)",
kind, app_name ? app_name : "nullptr");
}