Merge "SurfaceView: Synchronize destframe updates with SurfaceView size changes" into sc-dev am: edec715c76 am: a837151720
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15363852
Change-Id: I206274af699bfefb13375fa9276ada37edce2177
diff --git a/cmds/cmd/fuzzer/Android.bp b/cmds/cmd/fuzzer/Android.bp
new file mode 100644
index 0000000..0c78c5a
--- /dev/null
+++ b/cmds/cmd/fuzzer/Android.bp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+cc_fuzz {
+ name: "cmd_fuzzer",
+ srcs: [
+ "cmd_fuzzer.cpp",
+ ],
+ static_libs: [
+ "libcmd",
+ "libutils",
+ "liblog",
+ "libselinux",
+ ],
+ shared_libs: [
+ "libbinder",
+ ],
+ fuzz_config: {
+ cc: [
+ "android-media-fuzzing-reports@google.com",
+ ],
+ componentid: 155276,
+ },
+}
diff --git a/cmds/cmd/fuzzer/README.md b/cmds/cmd/fuzzer/README.md
new file mode 100644
index 0000000..db37ece
--- /dev/null
+++ b/cmds/cmd/fuzzer/README.md
@@ -0,0 +1,51 @@
+# Fuzzer for libcmd_fuzzer
+
+## Plugin Design Considerations
+The fuzzer plugin for libcmd is designed based on the understanding of the library and tries to achieve the following:
+
+##### Maximize code coverage
+The configuration parameters are not hardcoded, but instead selected based on
+incoming data. This ensures more code paths are reached by the fuzzer.
+
+libcmd supports the following parameters:
+1. In (parameter name: `in`)
+2. Out (parameter name: `out`)
+3. Err (parameter name: `err`)
+4. Run Mode (parameter name: `runMode`)
+
+| Parameter| Valid Values| Configured Value|
+|------------- |-------------| ----- |
+| `in` | `INT32_MIN` to `INT32_MAX` | Value obtained from FuzzedDataProvider|
+| `out` | `INT32_MIN` to `INT32_MAX` | Value obtained from FuzzedDataProvider|
+| `err` | `INT32_MIN` to `INT32_MAX` | Value obtained from FuzzedDataProvider|
+| `runMode` | 1.`RunMode::kStandalone` 2. `RunMode::kLibrary` | Value chosen from valid values using FuzzedDataProvider|
+
+This also ensures that the plugin is always deterministic for any given input.
+
+##### Maximize utilization of input data
+The plugin feeds the entire input data to the cmd module.
+This ensures that the plugin tolerates any kind of input (empty, huge,
+malformed, etc) and doesnt `exit()` on any input and thereby increasing the
+chance of identifying vulnerabilities.
+
+## Build
+
+This describes steps to build cmd_fuzzer binary.
+
+### Android
+
+#### Steps to build
+Build the fuzzer
+```
+ $ mm -j$(nproc) cmd_fuzzer
+```
+#### Steps to run
+To run on device
+```
+ $ adb sync data
+ $ adb shell /data/fuzz/${TARGET_ARCH}/cmd_fuzzer/cmd_fuzzer
+```
+
+## References:
+ * http://llvm.org/docs/LibFuzzer.html
+ * https://github.com/google/oss-fuzz
diff --git a/cmds/cmd/fuzzer/cmd_fuzzer.cpp b/cmds/cmd/fuzzer/cmd_fuzzer.cpp
new file mode 100644
index 0000000..ab514a1
--- /dev/null
+++ b/cmds/cmd/fuzzer/cmd_fuzzer.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/TextOutput.h>
+#include <cmd.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string>
+#include <vector>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+using namespace std;
+using namespace android;
+
+class TestTextOutput : public TextOutput {
+public:
+ TestTextOutput() {}
+ virtual ~TestTextOutput() {}
+
+ virtual status_t print(const char* /*txt*/, size_t /*len*/) { return NO_ERROR; }
+ virtual void moveIndent(int /*delta*/) { return; }
+ virtual void pushBundle() { return; }
+ virtual void popBundle() { return; }
+};
+
+class CmdFuzzer {
+public:
+ void process(const uint8_t* data, size_t size);
+
+private:
+ FuzzedDataProvider* mFDP = nullptr;
+};
+
+void CmdFuzzer::process(const uint8_t* data, size_t size) {
+ mFDP = new FuzzedDataProvider(data, size);
+ vector<string> arguments;
+ if (mFDP->ConsumeBool()) {
+ if (mFDP->ConsumeBool()) {
+ arguments = {"-w", "media.aaudio"};
+ } else {
+ arguments = {"-l"};
+ }
+ } else {
+ while (mFDP->remaining_bytes() > 0) {
+ size_t sizestr = mFDP->ConsumeIntegralInRange<size_t>(1, mFDP->remaining_bytes());
+ string argument = mFDP->ConsumeBytesAsString(sizestr);
+ arguments.emplace_back(argument);
+ }
+ }
+ vector<string_view> argSV;
+ for (auto& argument : arguments) {
+ argSV.emplace_back(argument.c_str());
+ }
+ int32_t in = open("/dev/null", O_RDWR | O_CREAT);
+ int32_t out = open("/dev/null", O_RDWR | O_CREAT);
+ int32_t err = open("/dev/null", O_RDWR | O_CREAT);
+ TestTextOutput output;
+ TestTextOutput error;
+ RunMode runMode = mFDP->ConsumeBool() ? RunMode::kStandalone : RunMode::kLibrary;
+ cmdMain(argSV, output, error, in, out, err, runMode);
+ delete mFDP;
+ close(in);
+ close(out);
+ close(err);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+ CmdFuzzer cmdFuzzer;
+ cmdFuzzer.process(data, size);
+ return 0;
+}
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp
index 2d11b90..75505f3 100644
--- a/cmds/dumpstate/dumpstate.cpp
+++ b/cmds/dumpstate/dumpstate.cpp
@@ -1237,7 +1237,7 @@
std::string path(title);
path.append(" - ").append(String8(service).c_str());
size_t bytes_written = 0;
- status_t status = dumpsys.startDumpThread(Dumpsys::Type::DUMP, service, args);
+ status_t status = dumpsys.startDumpThread(Dumpsys::TYPE_DUMP, service, args);
if (status == OK) {
dumpsys.writeDumpHeader(STDOUT_FILENO, service, priority);
std::chrono::duration<double> elapsed_seconds;
@@ -1316,7 +1316,7 @@
path.append("_HIGH");
}
path.append(kProtoExt);
- status_t status = dumpsys.startDumpThread(Dumpsys::Type::DUMP, service, args);
+ status_t status = dumpsys.startDumpThread(Dumpsys::TYPE_DUMP, service, args);
if (status == OK) {
status = ds.AddZipEntryFromFd(path, dumpsys.getDumpFd(), service_timeout);
bool dumpTerminated = (status == OK);
diff --git a/cmds/dumpsys/dumpsys.cpp b/cmds/dumpsys/dumpsys.cpp
index ba1c449..f8fdaa0 100644
--- a/cmds/dumpsys/dumpsys.cpp
+++ b/cmds/dumpsys/dumpsys.cpp
@@ -24,6 +24,7 @@
#include <android-base/unique_fd.h>
#include <binder/Parcel.h>
#include <binder/ProcessState.h>
+#include <binder/Stability.h>
#include <binder/TextOutput.h>
#include <binderdebug/BinderDebug.h>
#include <serviceutils/PriorityDumper.h>
@@ -61,20 +62,22 @@
"usage: dumpsys\n"
" To dump all services.\n"
"or:\n"
- " dumpsys [-t TIMEOUT] [--priority LEVEL] [--pid] [--thread] [--help | -l | "
- "--skip SERVICES "
+ " dumpsys [-t TIMEOUT] [--priority LEVEL] [--dump] [--pid] [--thread] [--help | "
+ "-l | --skip SERVICES "
"| SERVICE [ARGS]]\n"
" --help: shows this help\n"
" -l: only list services, do not dump them\n"
" -t TIMEOUT_SEC: TIMEOUT to use in seconds instead of default 10 seconds\n"
" -T TIMEOUT_MS: TIMEOUT to use in milliseconds instead of default 10 seconds\n"
+ " --dump: ask the service to dump itself (this is the default)\n"
" --pid: dump PID instead of usual dump\n"
- " --thread: dump thread usage instead of usual dump\n"
" --proto: filter services that support dumping data in proto format. Dumps\n"
" will be in proto format.\n"
" --priority LEVEL: filter services based on specified priority\n"
" LEVEL must be one of CRITICAL | HIGH | NORMAL\n"
" --skip SERVICES: dumps all services but SERVICES (comma-separated list)\n"
+ " --stability: dump binder stability information instead of usual dump\n"
+ " --thread: dump thread usage instead of usual dump\n"
" SERVICE [ARGS]: dumps only service SERVICE, optionally passing ARGS to it\n");
}
@@ -125,15 +128,17 @@
bool showListOnly = false;
bool skipServices = false;
bool asProto = false;
- Type type = Type::DUMP;
+ int dumpTypeFlags = 0;
int timeoutArgMs = 10000;
int priorityFlags = IServiceManager::DUMP_FLAG_PRIORITY_ALL;
- static struct option longOptions[] = {{"thread", no_argument, 0, 0},
+ static struct option longOptions[] = {{"help", no_argument, 0, 0},
+ {"dump", no_argument, 0, 0},
{"pid", no_argument, 0, 0},
{"priority", required_argument, 0, 0},
{"proto", no_argument, 0, 0},
{"skip", no_argument, 0, 0},
- {"help", no_argument, 0, 0},
+ {"stability", no_argument, 0, 0},
+ {"thread", no_argument, 0, 0},
{0, 0, 0, 0}};
// Must reset optind, otherwise subsequent calls will fail (wouldn't happen on main.cpp, but
@@ -165,10 +170,14 @@
usage();
return -1;
}
+ } else if (!strcmp(longOptions[optionIndex].name, "dump")) {
+ dumpTypeFlags |= TYPE_DUMP;
} else if (!strcmp(longOptions[optionIndex].name, "pid")) {
- type = Type::PID;
+ dumpTypeFlags |= TYPE_PID;
+ } else if (!strcmp(longOptions[optionIndex].name, "stability")) {
+ dumpTypeFlags |= TYPE_STABILITY;
} else if (!strcmp(longOptions[optionIndex].name, "thread")) {
- type = Type::THREAD;
+ dumpTypeFlags |= TYPE_THREAD;
}
break;
@@ -206,6 +215,10 @@
}
}
+ if (dumpTypeFlags == 0) {
+ dumpTypeFlags = TYPE_DUMP;
+ }
+
for (int i = optind; i < argc; i++) {
if (skipServices) {
skippedServices.add(String16(argv[i]));
@@ -258,7 +271,7 @@
const String16& serviceName = services[i];
if (IsSkipped(skippedServices, serviceName)) continue;
- if (startDumpThread(type, serviceName, args) == OK) {
+ if (startDumpThread(dumpTypeFlags, serviceName, args) == OK) {
bool addSeparator = (N > 1);
if (addSeparator) {
writeDumpHeader(STDOUT_FILENO, serviceName, priorityFlags);
@@ -325,16 +338,24 @@
}
}
-static status_t dumpPidToFd(const sp<IBinder>& service, const unique_fd& fd) {
+static status_t dumpPidToFd(const sp<IBinder>& service, const unique_fd& fd, bool exclusive) {
pid_t pid;
status_t status = service->getDebugPid(&pid);
if (status != OK) {
return status;
}
+ if (!exclusive) {
+ WriteStringToFd("Service host process PID: ", fd.get());
+ }
WriteStringToFd(std::to_string(pid) + "\n", fd.get());
return OK;
}
+static status_t dumpStabilityToFd(const sp<IBinder>& service, const unique_fd& fd) {
+ WriteStringToFd("Stability: " + internal::Stability::debugToString(service) + "\n", fd);
+ return OK;
+}
+
static status_t dumpThreadsToFd(const sp<IBinder>& service, const unique_fd& fd) {
pid_t pid;
status_t status = service->getDebugPid(&pid);
@@ -352,7 +373,14 @@
return OK;
}
-status_t Dumpsys::startDumpThread(Type type, const String16& serviceName,
+static void reportDumpError(const String16& serviceName, status_t error, const char* context) {
+ if (error == OK) return;
+
+ std::cerr << "Error with service '" << serviceName << "' while " << context << ": "
+ << statusToString(error) << std::endl;
+}
+
+status_t Dumpsys::startDumpThread(int dumpTypeFlags, const String16& serviceName,
const Vector<String16>& args) {
sp<IBinder> service = sm_->checkService(serviceName);
if (service == nullptr) {
@@ -373,26 +401,23 @@
// dump blocks until completion, so spawn a thread..
activeThread_ = std::thread([=, remote_end{std::move(remote_end)}]() mutable {
- status_t err = 0;
-
- switch (type) {
- case Type::DUMP:
- err = service->dump(remote_end.get(), args);
- break;
- case Type::PID:
- err = dumpPidToFd(service, remote_end);
- break;
- case Type::THREAD:
- err = dumpThreadsToFd(service, remote_end);
- break;
- default:
- std::cerr << "Unknown dump type" << static_cast<int>(type) << std::endl;
- return;
+ if (dumpTypeFlags & TYPE_PID) {
+ status_t err = dumpPidToFd(service, remote_end, dumpTypeFlags == TYPE_PID);
+ reportDumpError(serviceName, err, "dumping PID");
+ }
+ if (dumpTypeFlags & TYPE_STABILITY) {
+ status_t err = dumpStabilityToFd(service, remote_end);
+ reportDumpError(serviceName, err, "dumping stability");
+ }
+ if (dumpTypeFlags & TYPE_THREAD) {
+ status_t err = dumpThreadsToFd(service, remote_end);
+ reportDumpError(serviceName, err, "dumping thread info");
}
- if (err != OK) {
- std::cerr << "Error dumping service info status_t: " << statusToString(err) << " "
- << serviceName << std::endl;
+ // other types always act as a header, this is usually longer
+ if (dumpTypeFlags & TYPE_DUMP) {
+ status_t err = service->dump(remote_end.get(), args);
+ reportDumpError(serviceName, err, "dumping");
}
});
return OK;
diff --git a/cmds/dumpsys/dumpsys.h b/cmds/dumpsys/dumpsys.h
index 349947c..05c5d5e 100644
--- a/cmds/dumpsys/dumpsys.h
+++ b/cmds/dumpsys/dumpsys.h
@@ -51,23 +51,25 @@
*/
static void setServiceArgs(Vector<String16>& args, bool asProto, int priorityFlags);
- enum class Type {
- DUMP, // dump using `dump` function
- PID, // dump pid of server only
- THREAD, // dump thread usage of server only
+ enum Type {
+ TYPE_DUMP = 0x1, // dump using `dump` function
+ TYPE_PID = 0x2, // dump pid of server only
+ TYPE_STABILITY = 0x4, // dump stability information of server
+ TYPE_THREAD = 0x8, // dump thread usage of server only
};
/**
* Starts a thread to connect to a service and get its dump output. The thread redirects
* the output to a pipe. Thread must be stopped by a subsequent call to {@code
* stopDumpThread}.
+ * @param dumpTypeFlags operations to perform
* @param serviceName
* @param args list of arguments to pass to service dump method.
* @return {@code OK} thread is started successfully.
* {@code NAME_NOT_FOUND} service could not be found.
* {@code != OK} error
*/
- status_t startDumpThread(Type type, const String16& serviceName,
+ status_t startDumpThread(int dumpTypeFlags, const String16& serviceName,
const Vector<String16>& args);
/**
diff --git a/cmds/dumpsys/tests/dumpsys_test.cpp b/cmds/dumpsys/tests/dumpsys_test.cpp
index c9d2dbb..312f4d7 100644
--- a/cmds/dumpsys/tests/dumpsys_test.cpp
+++ b/cmds/dumpsys/tests/dumpsys_test.cpp
@@ -200,7 +200,7 @@
CaptureStdout();
CaptureStderr();
dump_.setServiceArgs(args, supportsProto, priorityFlags);
- status_t status = dump_.startDumpThread(Dumpsys::Type::DUMP, serviceName, args);
+ status_t status = dump_.startDumpThread(Dumpsys::TYPE_DUMP, serviceName, args);
EXPECT_THAT(status, Eq(0));
status = dump_.writeDump(STDOUT_FILENO, serviceName, std::chrono::milliseconds(500), false,
elapsedDuration, bytesWritten);
@@ -582,6 +582,27 @@
AssertOutput(std::to_string(getpid()) + "\n");
}
+// Tests 'dumpsys --stability'
+TEST_F(DumpsysTest, ListAllServicesWithStability) {
+ ExpectListServices({"Locksmith", "Valet"});
+ ExpectCheckService("Locksmith");
+ ExpectCheckService("Valet");
+
+ CallMain({"--stability"});
+
+ AssertRunningServices({"Locksmith", "Valet"});
+ AssertOutputContains("stability");
+}
+
+// Tests 'dumpsys --stability service_name'
+TEST_F(DumpsysTest, ListServiceWithStability) {
+ ExpectCheckService("Locksmith");
+
+ CallMain({"--stability", "Locksmith"});
+
+ AssertOutputContains("stability");
+}
+
// Tests 'dumpsys --thread'
TEST_F(DumpsysTest, ListAllServicesWithThread) {
ExpectListServices({"Locksmith", "Valet"});
@@ -606,6 +627,28 @@
AssertOutputFormat(format);
}
+// Tests 'dumpsys --thread --stability'
+TEST_F(DumpsysTest, ListAllServicesWithMultipleOptions) {
+ ExpectListServices({"Locksmith", "Valet"});
+ ExpectCheckService("Locksmith");
+ ExpectCheckService("Valet");
+
+ CallMain({"--pid", "--stability"});
+ AssertRunningServices({"Locksmith", "Valet"});
+
+ AssertOutputContains(std::to_string(getpid()));
+ AssertOutputContains("stability");
+}
+
+// Tests 'dumpsys --pid --stability service_name'
+TEST_F(DumpsysTest, ListServiceWithMultipleOptions) {
+ ExpectCheckService("Locksmith");
+ CallMain({"--pid", "--stability", "Locksmith"});
+
+ AssertOutputContains(std::to_string(getpid()));
+ AssertOutputContains("stability");
+}
+
TEST_F(DumpsysTest, GetBytesWritten) {
const char* serviceName = "service2";
const char* dumpContents = "dump1";
diff --git a/cmds/installd/OWNERS b/cmds/installd/OWNERS
index d6807ff..643b2c2 100644
--- a/cmds/installd/OWNERS
+++ b/cmds/installd/OWNERS
@@ -4,7 +4,6 @@
jsharkey@android.com
maco@google.com
mast@google.com
-mathieuc@google.com
narayan@google.com
ngeoffray@google.com
rpl@google.com
diff --git a/cmds/lshal/ListCommand.cpp b/cmds/lshal/ListCommand.cpp
index 2722e21..ff73c94 100644
--- a/cmds/lshal/ListCommand.cpp
+++ b/cmds/lshal/ListCommand.cpp
@@ -28,6 +28,7 @@
#include <sstream>
#include <android-base/file.h>
+#include <android-base/hex.h>
#include <android-base/logging.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <hidl-hash/Hash.h>
@@ -691,8 +692,7 @@
}
auto&& hashArray = hashChain[hashIndex];
- std::vector<uint8_t> hashVec{hashArray.data(), hashArray.data() + hashArray.size()};
- entry->hash = Hash::hexString(hashVec);
+ entry->hash = android::base::HexString(hashArray.data(), hashArray.size());
});
if (!hashRet.isOk()) {
handleError(TRANSACTION_ERROR, "getHashChain failed: " + hashRet.description());
diff --git a/cmds/lshal/Lshal.cpp b/cmds/lshal/Lshal.cpp
index bc99f4d..a5f98c2 100644
--- a/cmds/lshal/Lshal.cpp
+++ b/cmds/lshal/Lshal.cpp
@@ -142,12 +142,10 @@
}
}
- PipeRelay relay(out, err, interfaceName, instanceName);
-
- if (relay.initCheck() != OK) {
- std::string msg = "PipeRelay::initCheck() FAILED w/ " + std::to_string(relay.initCheck());
- err << msg << std::endl;
- LOG(ERROR) << msg;
+ auto relay = PipeRelay::create(out, err, interfaceName + "/" + instanceName);
+ if (!relay.ok()) {
+ err << "Unable to create PipeRelay: " << relay.error() << std::endl;
+ LOG(ERROR) << "Unable to create PipeRelay: " << relay.error();
return IO_ERROR;
}
@@ -155,7 +153,7 @@
native_handle_create(1 /* numFds */, 0 /* numInts */),
native_handle_delete);
- fdHandle->data[0] = relay.fd();
+ fdHandle->data[0] = relay.value()->fd().get();
hardware::Return<void> ret = base->debug(fdHandle.get(), convert(options));
diff --git a/cmds/lshal/PipeRelay.cpp b/cmds/lshal/PipeRelay.cpp
index 4e97636..0c3fb96 100644
--- a/cmds/lshal/PipeRelay.cpp
+++ b/cmds/lshal/PipeRelay.cpp
@@ -16,143 +16,93 @@
#include "PipeRelay.h"
-#include <sys/select.h>
-#include <sys/time.h>
+#include <sys/poll.h>
#include <sys/types.h>
#include <unistd.h>
-#include <atomic>
+#include <chrono>
+#include <optional>
-#include <utils/Thread.h>
+#include <android-base/unique_fd.h>
+
+using android::base::borrowed_fd;
+using android::base::Result;
+using android::base::unique_fd;
+using std::chrono_literals::operator""ms;
namespace android {
namespace lshal {
-
-static constexpr struct timeval READ_TIMEOUT { .tv_sec = 1, .tv_usec = 0 };
-
-static std::string getThreadName(std::string interfaceName, const std::string &instanceName) {
- auto dot = interfaceName.rfind(".");
- if (dot != std::string::npos) interfaceName = interfaceName.substr(dot + 1);
- return "RelayThread_" + interfaceName + "_" + instanceName;
+Result<std::unique_ptr<PipeRelay>> PipeRelay::create(std::ostream& os,
+ const NullableOStream<std::ostream>& err,
+ const std::string& fqName) {
+ auto pipeRelay = std::unique_ptr<PipeRelay>(new PipeRelay());
+ unique_fd rfd;
+ if (!android::base::Pipe(&rfd, &pipeRelay->mWrite)) {
+ return android::base::ErrnoError() << "pipe()";
+ }
+ // Workaround for b/111997867: need a separate FD trigger because rfd can't receive POLLHUP
+ // when the write end is closed after the write end was sent through hwbinder.
+ unique_fd rfdTrigger;
+ if (!android::base::Pipe(&rfdTrigger, &pipeRelay->mWriteTrigger)) {
+ return android::base::ErrnoError() << "pipe() for trigger";
+ }
+ pipeRelay->mThread =
+ std::make_unique<std::thread>(&PipeRelay::thread, std::move(rfd), std::move(rfdTrigger),
+ &os, &err, fqName);
+ return pipeRelay;
}
-struct PipeRelay::RelayThread : public Thread {
- explicit RelayThread(int fd, std::ostream &os, const NullableOStream<std::ostream> &err,
- const std::string &fqName);
+void PipeRelay::thread(unique_fd rfd, unique_fd rfdTrigger, std::ostream* out,
+ const NullableOStream<std::ostream>* err, std::string fqName) {
+ while (true) {
+ pollfd pfd[2];
+ pfd[0] = {.fd = rfd.get(), .events = POLLIN};
+ pfd[1] = {.fd = rfdTrigger.get(), .events = 0};
- bool threadLoop() override;
- void setFinished();
-
-private:
- int mFd;
- std::ostream &mOutStream;
- NullableOStream<std::ostream> mErrStream;
-
- // If we were to use requestExit() and exitPending() instead, threadLoop()
- // may not run at all by the time ~PipeRelay is called (i.e. debug() has
- // returned from HAL). By using our own flag, we ensure that select() and
- // read() are executed until data are drained.
- std::atomic_bool mFinished;
-
- std::string mFqName;
-
- DISALLOW_COPY_AND_ASSIGN(RelayThread);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-PipeRelay::RelayThread::RelayThread(int fd, std::ostream &os,
- const NullableOStream<std::ostream> &err,
- const std::string &fqName)
- : mFd(fd), mOutStream(os), mErrStream(err), mFinished(false), mFqName(fqName) {}
-
-bool PipeRelay::RelayThread::threadLoop() {
- char buffer[1024];
-
- fd_set set;
- FD_ZERO(&set);
- FD_SET(mFd, &set);
-
- struct timeval timeout = READ_TIMEOUT;
-
- int res = TEMP_FAILURE_RETRY(select(mFd + 1, &set, nullptr, nullptr, &timeout));
- if (res < 0) {
- mErrStream << "debug " << mFqName << ": select() failed";
- return false;
- }
-
- if (res == 0 || !FD_ISSET(mFd, &set)) {
- if (mFinished) {
- mErrStream << "debug " << mFqName
- << ": timeout reading from pipe, output may be truncated.";
- return false;
+ int pollRes = poll(pfd, arraysize(pfd), -1 /* infinite timeout */);
+ if (pollRes < 0) {
+ int savedErrno = errno;
+ (*err) << "debug " << fqName << ": poll() failed: " << strerror(savedErrno)
+ << std::endl;
+ break;
}
- // timeout, but debug() has not returned, so wait for HAL to finish.
- return true;
- }
- // FD_ISSET(mFd, &set) == true. Data available, start reading
- ssize_t n = TEMP_FAILURE_RETRY(read(mFd, buffer, sizeof(buffer)));
-
- if (n < 0) {
- mErrStream << "debug " << mFqName << ": read() failed";
- }
-
- if (n <= 0) {
- return false;
- }
-
- mOutStream.write(buffer, n);
-
- return true;
-}
-
-void PipeRelay::RelayThread::setFinished() {
- mFinished = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-PipeRelay::PipeRelay(std::ostream &os, const NullableOStream<std::ostream> &err,
- const std::string &interfaceName, const std::string &instanceName)
- : mInitCheck(NO_INIT) {
- int res = pipe(mFds);
-
- if (res < 0) {
- mInitCheck = -errno;
- return;
- }
-
- mThread = new RelayThread(mFds[0], os, err, interfaceName + "/" + instanceName);
- mInitCheck = mThread->run(getThreadName(interfaceName, instanceName).c_str());
-}
-
-void PipeRelay::CloseFd(int *fd) {
- if (*fd >= 0) {
- close(*fd);
- *fd = -1;
+ if (pfd[0].revents & POLLIN) {
+ char buffer[1024];
+ ssize_t n = TEMP_FAILURE_RETRY(read(rfd.get(), buffer, sizeof(buffer)));
+ if (n < 0) {
+ int savedErrno = errno;
+ (*err) << "debug " << fqName << ": read() failed: " << strerror(savedErrno)
+ << std::endl;
+ break;
+ }
+ if (n == 0) {
+ (*err) << "Warning: debug " << fqName << ": poll() indicates POLLIN but no data"
+ << std::endl;
+ continue;
+ }
+ out->write(buffer, n);
+ }
+ if (pfd[0].revents & POLLHUP) {
+ break;
+ }
+ if (pfd[1].revents & POLLHUP) {
+ // ~PipeRelay is called on the main thread. |mWrite| has been flushed and closed.
+ // Ensure that our read end of the pipe doesn't have pending data, then exit.
+ if ((pfd[0].revents & POLLIN) == 0) {
+ break;
+ }
+ }
}
}
PipeRelay::~PipeRelay() {
- CloseFd(&mFds[1]);
-
- if (mThread != nullptr) {
- mThread->setFinished();
+ mWrite.reset();
+ mWriteTrigger.reset();
+ if (mThread != nullptr && mThread->joinable()) {
mThread->join();
- mThread.clear();
}
-
- CloseFd(&mFds[0]);
}
-status_t PipeRelay::initCheck() const {
- return mInitCheck;
-}
-
-int PipeRelay::fd() const {
- return mFds[1];
-}
-
-} // namespace lshal
-} // namespace android
+} // namespace lshal
+} // namespace android
diff --git a/cmds/lshal/PipeRelay.h b/cmds/lshal/PipeRelay.h
index bd994b4..45ba982 100644
--- a/cmds/lshal/PipeRelay.h
+++ b/cmds/lshal/PipeRelay.h
@@ -16,42 +16,43 @@
#pragma once
+#include <thread>
+
#include <android-base/macros.h>
-#include <ostream>
+#include <android-base/result.h>
+#include <android-base/unique_fd.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
+#include <ostream>
#include "NullableOStream.h"
namespace android {
namespace lshal {
-/* Creates an AF_UNIX socketpair and spawns a thread that relays any data
+/**
+ * Creates a pipe and spawns a thread that relays any data
* written to the "write"-end of the pair to the specified output stream "os".
*/
struct PipeRelay {
- explicit PipeRelay(std::ostream& os,
- const NullableOStream<std::ostream>& err,
- const std::string& interfaceName,
- const std::string& instanceName);
+ static android::base::Result<std::unique_ptr<PipeRelay>> create(
+ std::ostream& os, const NullableOStream<std::ostream>& err, const std::string& fqName);
~PipeRelay();
- status_t initCheck() const;
-
// Returns the file descriptor corresponding to the "write"-end of the
// connection.
- int fd() const;
+ android::base::borrowed_fd fd() const { return mWrite; }
private:
- struct RelayThread;
-
- status_t mInitCheck;
- int mFds[2];
- sp<RelayThread> mThread;
-
- static void CloseFd(int *fd);
-
+ PipeRelay() = default;
DISALLOW_COPY_AND_ASSIGN(PipeRelay);
+ static void thread(android::base::unique_fd rfd, android::base::unique_fd rfdTrigger,
+ std::ostream* out, const NullableOStream<std::ostream>* err,
+ std::string fqName);
+
+ android::base::unique_fd mWrite;
+ android::base::unique_fd mWriteTrigger;
+ std::unique_ptr<std::thread> mThread;
};
} // namespace lshal
diff --git a/cmds/lshal/TableEntry.cpp b/cmds/lshal/TableEntry.cpp
index 8e21975..1753343 100644
--- a/cmds/lshal/TableEntry.cpp
+++ b/cmds/lshal/TableEntry.cpp
@@ -18,6 +18,7 @@
#include <map>
+#include <android-base/hex.h>
#include <android-base/strings.h>
#include <hidl-hash/Hash.h>
#include <vintf/parse_string.h>
@@ -104,7 +105,8 @@
}
std::string TableEntry::isReleased() const {
- static const std::string unreleased = Hash::hexString(Hash::kEmptyHash);
+ static const std::string unreleased = android::base::HexString(Hash::kEmptyHash.data(),
+ Hash::kEmptyHash.size());
if (hash.empty()) {
return "?";
diff --git a/docs/Doxyfile b/docs/Doxyfile
index a1bd960..ea22337 100644
--- a/docs/Doxyfile
+++ b/docs/Doxyfile
@@ -1638,6 +1638,7 @@
"__attribute__(x)=" \
__ANDROID__ \
__BIONIC__ \
+ "U_IN_DOXYGEN=1" \ # Required by the ICU4C module only
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp
index ec697a0..d7112b5 100644
--- a/libs/binder/Android.bp
+++ b/libs/binder/Android.bp
@@ -64,10 +64,15 @@
"PermissionCache.cpp",
"PermissionController.cpp",
]
+libbinder_no_vendor_interface_sources = [
+ ":packagemanager_aidl",
+]
cc_library {
name: "libbinder",
+ version_script: "libbinder.map",
+
// for vndbinder
vendor_available: true,
vndk: {
@@ -120,9 +125,8 @@
"Status.cpp",
"TextOutput.cpp",
"Utils.cpp",
- ":packagemanager_aidl",
":libbinder_aidl",
- ],
+ ] + libbinder_no_vendor_interface_sources,
target: {
android: {
@@ -133,40 +137,21 @@
enabled: false,
},
},
- android_arm64: {
- // b/189438896 Sampling PGO restricted to arm64, arm32 in sc-dev
- pgo: {
- sampling: true,
- profile_file: "libbinder/libbinder.profdata",
- },
- // b/189438896 Add exported symbols in a map file for ABI stability
- version_script: "libbinder.arm64.map",
- target: {
- vendor: {
- version_script: "libbinder.arm64.vendor.map",
- },
- },
- },
- android_arm: {
- // b/189438896 Sampling PGO restricted to arm64, arm32 in sc-dev
- pgo: {
- sampling: true,
- profile_file: "libbinder/libbinder.profdata",
- },
- // b/189438896 Add exported symbols in a map file for ABI stability
- version_script: "libbinder.arm32.map",
- target: {
- vendor: {
- version_script: "libbinder.arm32.vendor.map",
- },
- },
- },
vendor: {
- exclude_srcs: libbinder_device_interface_sources,
+ exclude_srcs: libbinder_device_interface_sources + libbinder_no_vendor_interface_sources,
},
darwin: {
enabled: false,
},
+ host: {
+ static_libs: [
+ "libbase",
+ ],
+ srcs: [
+ "ServiceManagerHost.cpp",
+ "UtilsHost.cpp",
+ ],
+ },
},
aidl: {
@@ -190,6 +175,10 @@
binder32bit: {
cflags: ["-DBINDER_IPC_32BIT=1"],
},
+
+ debuggable: {
+ cflags: ["-DBINDER_RPC_DEV_SERVERS"],
+ },
},
shared_libs: [
@@ -200,6 +189,7 @@
header_libs: [
"libbinder_headers",
+ "libandroid_runtime_vm_headers",
],
export_header_lib_headers: [
@@ -232,6 +222,11 @@
"performance*",
"portability*",
],
+
+ pgo: {
+ sampling: true,
+ profile_file: "libbinder/libbinder.profdata",
+ },
}
// AIDL interface between libbinder and framework.jar
@@ -269,6 +264,32 @@
},
}
+// TODO(b/184872979): remove once the Rust API is created.
+cc_library {
+ name: "libbinder_rpc_unstable",
+ srcs: ["libbinder_rpc_unstable.cpp"],
+ defaults: ["libbinder_ndk_host_user"],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libbinder_ndk",
+ "libutils",
+ ],
+
+ // enumerate stable entry points, for apex use
+ stubs: {
+ symbol_file: "libbinder_rpc_unstable.map.txt",
+ },
+
+ // This library is intentionally limited to these targets, and it will be removed later.
+ // Do not expand the visibility.
+ visibility: [
+ "//packages/modules/Virtualization/authfs:__subpackages__",
+ "//packages/modules/Virtualization/compos:__subpackages__",
+ "//packages/modules/Virtualization/microdroid",
+ ],
+}
+
// libbinder historically contained additional interfaces that provided specific
// functionality in the platform but have nothing to do with binder itself. These
// are moved out of libbinder in order to avoid the overhead of their vtables.
@@ -321,3 +342,17 @@
export_aidl_headers: true,
},
}
+
+cc_binary {
+ name: "servicedispatcher",
+ host_supported: false,
+ srcs: [
+ "servicedispatcher.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "liblog",
+ "libutils",
+ ],
+}
diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp
index d5bdd1c..628381c 100644
--- a/libs/binder/Binder.cpp
+++ b/libs/binder/Binder.cpp
@@ -17,16 +17,25 @@
#include <binder/Binder.h>
#include <atomic>
-#include <utils/misc.h>
+#include <set>
+
+#include <android-base/unique_fd.h>
#include <binder/BpBinder.h>
#include <binder/IInterface.h>
+#include <binder/IPCThreadState.h>
#include <binder/IResultReceiver.h>
#include <binder/IShellCallback.h>
#include <binder/Parcel.h>
+#include <binder/RpcServer.h>
+#include <private/android_filesystem_config.h>
+#include <utils/misc.h>
+#include <inttypes.h>
#include <linux/sched.h>
#include <stdio.h>
+#include "RpcState.h"
+
namespace android {
// Service implementations inherit from BBinder and IBinder, and this is frozen
@@ -39,6 +48,12 @@
static_assert(sizeof(BBinder) == 20);
#endif
+#ifdef BINDER_RPC_DEV_SERVERS
+constexpr const bool kEnableRpcDevServers = true;
+#else
+constexpr const bool kEnableRpcDevServers = false;
+#endif
+
// ---------------------------------------------------------------------------
IBinder::IBinder()
@@ -136,8 +151,79 @@
return OK;
}
+status_t IBinder::setRpcClientDebug(android::base::unique_fd socketFd,
+ const sp<IBinder>& keepAliveBinder) {
+ if constexpr (!kEnableRpcDevServers) {
+ ALOGW("setRpcClientDebug disallowed because RPC is not enabled");
+ return INVALID_OPERATION;
+ }
+
+ BBinder* local = this->localBinder();
+ if (local != nullptr) {
+ return local->BBinder::setRpcClientDebug(std::move(socketFd), keepAliveBinder);
+ }
+
+ BpBinder* proxy = this->remoteBinder();
+ LOG_ALWAYS_FATAL_IF(proxy == nullptr, "binder object must be either local or remote");
+
+ Parcel data;
+ Parcel reply;
+ status_t status;
+ if (status = data.writeBool(socketFd.ok()); status != OK) return status;
+ if (socketFd.ok()) {
+ // writeUniqueFileDescriptor currently makes an unnecessary dup().
+ status = data.writeFileDescriptor(socketFd.release(), true /* own */);
+ if (status != OK) return status;
+ }
+ if (status = data.writeStrongBinder(keepAliveBinder); status != OK) return status;
+ return transact(SET_RPC_CLIENT_TRANSACTION, data, &reply);
+}
+
+void IBinder::withLock(const std::function<void()>& doWithLock) {
+ BBinder* local = localBinder();
+ if (local) {
+ local->withLock(doWithLock);
+ return;
+ }
+ BpBinder* proxy = this->remoteBinder();
+ LOG_ALWAYS_FATAL_IF(proxy == nullptr, "binder object must be either local or remote");
+ proxy->withLock(doWithLock);
+}
+
// ---------------------------------------------------------------------------
+class BBinder::RpcServerLink : public IBinder::DeathRecipient {
+public:
+ // On binder died, calls RpcServer::shutdown on @a rpcServer, and removes itself from @a binder.
+ RpcServerLink(const sp<RpcServer>& rpcServer, const sp<IBinder>& keepAliveBinder,
+ const wp<BBinder>& binder)
+ : mRpcServer(rpcServer), mKeepAliveBinder(keepAliveBinder), mBinder(binder) {}
+ void binderDied(const wp<IBinder>&) override {
+ LOG_RPC_DETAIL("RpcServerLink: binder died, shutting down RpcServer");
+ if (mRpcServer == nullptr) {
+ ALOGW("RpcServerLink: Unable to shut down RpcServer because it does not exist.");
+ } else {
+ ALOGW_IF(!mRpcServer->shutdown(),
+ "RpcServerLink: RpcServer did not shut down properly. Not started?");
+ }
+ mRpcServer.clear();
+
+ auto promoted = mBinder.promote();
+ if (promoted == nullptr) {
+ ALOGW("RpcServerLink: Unable to remove link from parent binder object because parent "
+ "binder object is gone.");
+ } else {
+ promoted->removeRpcServerLink(sp<RpcServerLink>::fromExisting(this));
+ }
+ mBinder.clear();
+ }
+
+private:
+ sp<RpcServer> mRpcServer;
+ sp<IBinder> mKeepAliveBinder; // hold to avoid automatically unlinking
+ wp<BBinder> mBinder;
+};
+
class BBinder::Extras
{
public:
@@ -150,14 +236,13 @@
// for below objects
Mutex mLock;
+ std::set<sp<RpcServerLink>> mRpcServerLinks;
BpBinder::ObjectManager mObjects;
};
// ---------------------------------------------------------------------------
-BBinder::BBinder() : mExtras(nullptr), mStability(0)
-{
-}
+BBinder::BBinder() : mExtras(nullptr), mStability(0), mParceled(false) {}
bool BBinder::isBinderAlive() const
{
@@ -199,6 +284,10 @@
case DEBUG_PID_TRANSACTION:
err = reply->writeInt32(getDebugPid());
break;
+ case SET_RPC_CLIENT_TRANSACTION: {
+ err = setRpcClientDebug(data);
+ break;
+ }
default:
err = onTransact(code, data, reply, flags);
break;
@@ -233,15 +322,13 @@
return NO_ERROR;
}
-void BBinder::attachObject(
- const void* objectID, void* object, void* cleanupCookie,
- object_cleanup_func func)
-{
+void* BBinder::attachObject(const void* objectID, void* object, void* cleanupCookie,
+ object_cleanup_func func) {
Extras* e = getOrCreateExtras();
- if (!e) return; // out of memory
+ LOG_ALWAYS_FATAL_IF(!e, "no memory");
AutoMutex _l(e->mLock);
- e->mObjects.attach(objectID, object, cleanupCookie, func);
+ return e->mObjects.attach(objectID, object, cleanupCookie, func);
}
void* BBinder::findObject(const void* objectID) const
@@ -253,13 +340,20 @@
return e->mObjects.find(objectID);
}
-void BBinder::detachObject(const void* objectID)
-{
+void* BBinder::detachObject(const void* objectID) {
Extras* e = mExtras.load(std::memory_order_acquire);
- if (!e) return;
+ if (!e) return nullptr;
AutoMutex _l(e->mLock);
- e->mObjects.detach(objectID);
+ return e->mObjects.detach(objectID);
+}
+
+void BBinder::withLock(const std::function<void()>& doWithLock) {
+ Extras* e = getOrCreateExtras();
+ LOG_ALWAYS_FATAL_IF(!e, "no memory");
+
+ AutoMutex _l(e->mLock);
+ doWithLock();
}
BBinder* BBinder::localBinder()
@@ -276,6 +370,10 @@
void BBinder::setRequestingSid(bool requestingSid)
{
+ LOG_ALWAYS_FATAL_IF(mParceled,
+ "setRequestingSid() should not be called after a binder object "
+ "is parceled/sent to another process");
+
Extras* e = mExtras.load(std::memory_order_acquire);
if (!e) {
@@ -298,6 +396,10 @@
}
void BBinder::setMinSchedulerPolicy(int policy, int priority) {
+ LOG_ALWAYS_FATAL_IF(mParceled,
+ "setMinSchedulerPolicy() should not be called after a binder object "
+ "is parceled/sent to another process");
+
switch (policy) {
case SCHED_NORMAL:
LOG_ALWAYS_FATAL_IF(priority < -20 || priority > 19, "Invalid priority for SCHED_NORMAL: %d", priority);
@@ -345,6 +447,10 @@
}
void BBinder::setInheritRt(bool inheritRt) {
+ LOG_ALWAYS_FATAL_IF(mParceled,
+ "setInheritRt() should not be called after a binder object "
+ "is parceled/sent to another process");
+
Extras* e = mExtras.load(std::memory_order_acquire);
if (!e) {
@@ -364,10 +470,106 @@
}
void BBinder::setExtension(const sp<IBinder>& extension) {
+ LOG_ALWAYS_FATAL_IF(mParceled,
+ "setExtension() should not be called after a binder object "
+ "is parceled/sent to another process");
+
Extras* e = getOrCreateExtras();
e->mExtension = extension;
}
+bool BBinder::wasParceled() {
+ return mParceled;
+}
+
+void BBinder::setParceled() {
+ mParceled = true;
+}
+
+status_t BBinder::setRpcClientDebug(const Parcel& data) {
+ if constexpr (!kEnableRpcDevServers) {
+ ALOGW("%s: disallowed because RPC is not enabled", __PRETTY_FUNCTION__);
+ return INVALID_OPERATION;
+ }
+ uid_t uid = IPCThreadState::self()->getCallingUid();
+ if (uid != AID_ROOT) {
+ ALOGE("%s: not allowed because client %" PRIu32 " is not root", __PRETTY_FUNCTION__, uid);
+ return PERMISSION_DENIED;
+ }
+ status_t status;
+ bool hasSocketFd;
+ android::base::unique_fd clientFd;
+
+ if (status = data.readBool(&hasSocketFd); status != OK) return status;
+ if (hasSocketFd) {
+ if (status = data.readUniqueFileDescriptor(&clientFd); status != OK) return status;
+ }
+ sp<IBinder> keepAliveBinder;
+ if (status = data.readNullableStrongBinder(&keepAliveBinder); status != OK) return status;
+
+ return setRpcClientDebug(std::move(clientFd), keepAliveBinder);
+}
+
+status_t BBinder::setRpcClientDebug(android::base::unique_fd socketFd,
+ const sp<IBinder>& keepAliveBinder) {
+ if constexpr (!kEnableRpcDevServers) {
+ ALOGW("%s: disallowed because RPC is not enabled", __PRETTY_FUNCTION__);
+ return INVALID_OPERATION;
+ }
+
+ const int socketFdForPrint = socketFd.get();
+ LOG_RPC_DETAIL("%s(fd=%d)", __PRETTY_FUNCTION__, socketFdForPrint);
+
+ if (!socketFd.ok()) {
+ ALOGE("%s: No socket FD provided.", __PRETTY_FUNCTION__);
+ return BAD_VALUE;
+ }
+
+ if (keepAliveBinder == nullptr) {
+ ALOGE("%s: No keepAliveBinder provided.", __PRETTY_FUNCTION__);
+ return UNEXPECTED_NULL;
+ }
+
+ size_t binderThreadPoolMaxCount = ProcessState::self()->getThreadPoolMaxThreadCount();
+ if (binderThreadPoolMaxCount <= 1) {
+ ALOGE("%s: ProcessState thread pool max count is %zu. RPC is disabled for this service "
+ "because RPC requires the service to support multithreading.",
+ __PRETTY_FUNCTION__, binderThreadPoolMaxCount);
+ return INVALID_OPERATION;
+ }
+
+ // Weak ref to avoid circular dependency:
+ // BBinder -> RpcServerLink ----> RpcServer -X-> BBinder
+ // `-X-> BBinder
+ auto weakThis = wp<BBinder>::fromExisting(this);
+
+ Extras* e = getOrCreateExtras();
+ AutoMutex _l(e->mLock);
+ auto rpcServer = RpcServer::make();
+ LOG_ALWAYS_FATAL_IF(rpcServer == nullptr, "RpcServer::make returns null");
+ rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ auto link = sp<RpcServerLink>::make(rpcServer, keepAliveBinder, weakThis);
+ if (auto status = keepAliveBinder->linkToDeath(link, nullptr, 0); status != OK) {
+ ALOGE("%s: keepAliveBinder->linkToDeath returns %s", __PRETTY_FUNCTION__,
+ statusToString(status).c_str());
+ return status;
+ }
+ rpcServer->setRootObjectWeak(weakThis);
+ rpcServer->setupExternalServer(std::move(socketFd));
+ rpcServer->setMaxThreads(binderThreadPoolMaxCount);
+ rpcServer->start();
+ e->mRpcServerLinks.emplace(link);
+ LOG_RPC_DETAIL("%s(fd=%d) successful", __PRETTY_FUNCTION__, socketFdForPrint);
+ return OK;
+}
+
+void BBinder::removeRpcServerLink(const sp<RpcServerLink>& link) {
+ Extras* e = mExtras.load(std::memory_order_acquire);
+ if (!e) return;
+ AutoMutex _l(e->mLock);
+ (void)e->mRpcServerLinks.erase(link);
+}
+
BBinder::~BBinder()
{
Extras* e = mExtras.load(std::memory_order_relaxed);
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp
index 1dcb94c..765e21c 100644
--- a/libs/binder/BpBinder.cpp
+++ b/libs/binder/BpBinder.cpp
@@ -61,22 +61,22 @@
kill();
}
-void BpBinder::ObjectManager::attach(
- const void* objectID, void* object, void* cleanupCookie,
- IBinder::object_cleanup_func func)
-{
+void* BpBinder::ObjectManager::attach(const void* objectID, void* object, void* cleanupCookie,
+ IBinder::object_cleanup_func func) {
entry_t e;
e.object = object;
e.cleanupCookie = cleanupCookie;
e.func = func;
- if (mObjects.indexOfKey(objectID) >= 0) {
- ALOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use",
- objectID, this, object);
- return;
+ if (ssize_t idx = mObjects.indexOfKey(objectID); idx >= 0) {
+ ALOGI("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object "
+ "ID already in use",
+ objectID, this, object);
+ return mObjects[idx].object;
}
mObjects.add(objectID, e);
+ return nullptr;
}
void* BpBinder::ObjectManager::find(const void* objectID) const
@@ -86,9 +86,12 @@
return mObjects.valueAt(i).object;
}
-void BpBinder::ObjectManager::detach(const void* objectID)
-{
- mObjects.removeItem(objectID);
+void* BpBinder::ObjectManager::detach(const void* objectID) {
+ ssize_t idx = mObjects.indexOfKey(objectID);
+ if (idx < 0) return nullptr;
+ void* value = mObjects[idx].object;
+ mObjects.removeItemsAt(idx, 1);
+ return value;
}
void BpBinder::ObjectManager::kill()
@@ -258,22 +261,23 @@
if (code >= FIRST_CALL_TRANSACTION && code <= LAST_CALL_TRANSACTION) {
using android::internal::Stability;
- auto category = Stability::getCategory(this);
+ int16_t stability = Stability::getRepr(this);
Stability::Level required = privateVendor ? Stability::VENDOR
: Stability::getLocalLevel();
- if (CC_UNLIKELY(!Stability::check(category, required))) {
+ if (CC_UNLIKELY(!Stability::check(stability, required))) {
ALOGE("Cannot do a user transaction on a %s binder (%s) in a %s context.",
- category.debugString().c_str(),
- String8(getInterfaceDescriptor()).c_str(),
- Stability::levelString(required).c_str());
+ Stability::levelString(stability).c_str(),
+ String8(getInterfaceDescriptor()).c_str(),
+ Stability::levelString(required).c_str());
return BAD_TYPE;
}
}
status_t status;
if (CC_UNLIKELY(isRpcBinder())) {
- status = rpcSession()->transact(rpcAddress(), code, data, reply, flags);
+ status = rpcSession()->transact(sp<IBinder>::fromExisting(this), code, data, reply,
+ flags);
} else {
status = IPCThreadState::self()->transact(binderHandle(), code, data, reply, flags);
}
@@ -405,14 +409,11 @@
recipient->binderDied(wp<BpBinder>::fromExisting(this));
}
-
-void BpBinder::attachObject(
- const void* objectID, void* object, void* cleanupCookie,
- object_cleanup_func func)
-{
+void* BpBinder::attachObject(const void* objectID, void* object, void* cleanupCookie,
+ object_cleanup_func func) {
AutoMutex _l(mLock);
ALOGV("Attaching object %p to binder %p (manager=%p)", object, this, &mObjects);
- mObjects.attach(objectID, object, cleanupCookie, func);
+ return mObjects.attach(objectID, object, cleanupCookie, func);
}
void* BpBinder::findObject(const void* objectID) const
@@ -421,10 +422,14 @@
return mObjects.find(objectID);
}
-void BpBinder::detachObject(const void* objectID)
-{
+void* BpBinder::detachObject(const void* objectID) {
AutoMutex _l(mLock);
- mObjects.detach(objectID);
+ return mObjects.detach(objectID);
+}
+
+void BpBinder::withLock(const std::function<void()>& doWithLock) {
+ AutoMutex _l(mLock);
+ doWithLock();
}
BpBinder* BpBinder::remoteBinder()
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index 445df9e..fa9f3a9 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -366,19 +366,46 @@
pid_t IPCThreadState::getCallingPid() const
{
+ checkContextIsBinderForUse(__func__);
return mCallingPid;
}
const char* IPCThreadState::getCallingSid() const
{
+ checkContextIsBinderForUse(__func__);
return mCallingSid;
}
uid_t IPCThreadState::getCallingUid() const
{
+ checkContextIsBinderForUse(__func__);
return mCallingUid;
}
+const IPCThreadState::SpGuard* IPCThreadState::pushGetCallingSpGuard(const SpGuard* guard) {
+ const SpGuard* orig = mServingStackPointerGuard;
+ mServingStackPointerGuard = guard;
+ return orig;
+}
+
+void IPCThreadState::restoreGetCallingSpGuard(const SpGuard* guard) {
+ mServingStackPointerGuard = guard;
+}
+
+void IPCThreadState::checkContextIsBinderForUse(const char* use) const {
+ if (LIKELY(mServingStackPointerGuard == nullptr)) return;
+
+ if (!mServingStackPointer || mServingStackPointerGuard->address < mServingStackPointer) {
+ LOG_ALWAYS_FATAL("In context %s, %s does not make sense (binder sp: %p, guard: %p).",
+ mServingStackPointerGuard->context, use, mServingStackPointer,
+ mServingStackPointerGuard->address);
+ }
+
+ // in the case mServingStackPointer is deeper in the stack than the guard,
+ // we must be serving a binder transaction (maybe nested). This is a binder
+ // context, so we don't abort
+}
+
int64_t IPCThreadState::clearCallingIdentity()
{
// ignore mCallingSid for legacy reasons
@@ -845,6 +872,7 @@
IPCThreadState::IPCThreadState()
: mProcess(ProcessState::self()),
mServingStackPointer(nullptr),
+ mServingStackPointerGuard(nullptr),
mWorkSource(kUnsetWorkSource),
mPropagateWorkSource(false),
mIsLooper(false),
@@ -1226,7 +1254,7 @@
tr.offsets_size/sizeof(binder_size_t), freeBuffer);
const void* origServingStackPointer = mServingStackPointer;
- mServingStackPointer = &origServingStackPointer; // anything on the stack
+ mServingStackPointer = __builtin_frame_address(0);
const pid_t origPid = mCallingPid;
const char* origSid = mCallingSid;
diff --git a/libs/binder/IServiceManager.cpp b/libs/binder/IServiceManager.cpp
index f684cf6..6e318ea 100644
--- a/libs/binder/IServiceManager.cpp
+++ b/libs/binder/IServiceManager.cpp
@@ -35,6 +35,8 @@
#ifdef __ANDROID__
#include <cutils/properties.h>
+#else
+#include "ServiceManagerHost.h"
#endif
#include "Static.h"
@@ -84,8 +86,19 @@
IBinder* onAsBinder() override {
return IInterface::asBinder(mTheRealServiceManager).get();
}
-private:
+
+protected:
sp<AidlServiceManager> mTheRealServiceManager;
+
+ // Directly get the service in a way that, for lazy services, requests the service to be started
+ // if it is not currently started. This way, calls directly to ServiceManagerShim::getService
+ // will still have the 5s delay that is expected by a large amount of Android code.
+ //
+ // When implementing ServiceManagerShim, use realGetService instead of
+ // mTheRealServiceManager->getService so that it can be overridden in ServiceManagerHostShim.
+ virtual Status realGetService(const std::string& name, sp<IBinder>* _aidl_return) {
+ return mTheRealServiceManager->getService(name, _aidl_return);
+ }
};
[[clang::no_destroy]] static std::once_flag gSmOnce;
@@ -129,8 +142,7 @@
return checkCallingPermission(permission, nullptr, nullptr);
}
-static String16 _permission("permission");
-
+static StaticString16 _permission(u"permission");
bool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid)
{
@@ -142,8 +154,7 @@
return checkPermission(permission, pid, uid);
}
-bool checkPermission(const String16& permission, pid_t pid, uid_t uid)
-{
+bool checkPermission(const String16& permission, pid_t pid, uid_t uid, bool logPermissionFailure) {
static Mutex gPermissionControllerLock;
static sp<IPermissionController> gPermissionController;
@@ -168,8 +179,10 @@
// Is this a permission failure, or did the controller go away?
if (IInterface::asBinder(pc)->isBinderAlive()) {
- ALOGW("Permission failure: %s from uid=%d pid=%d",
- String8(permission).string(), uid, pid);
+ if (logPermissionFailure) {
+ ALOGW("Permission failure: %s from uid=%d pid=%d", String8(permission).string(),
+ uid, pid);
+ }
return false;
}
@@ -320,14 +333,18 @@
const std::string name = String8(name16).c_str();
sp<IBinder> out;
- if (!mTheRealServiceManager->getService(name, &out).isOk()) {
+ if (Status status = realGetService(name, &out); !status.isOk()) {
+ ALOGW("Failed to getService in waitForService for %s: %s", name.c_str(),
+ status.toString8().c_str());
return nullptr;
}
if (out != nullptr) return out;
sp<Waiter> waiter = sp<Waiter>::make();
- if (!mTheRealServiceManager->registerForNotifications(
- name, waiter).isOk()) {
+ if (Status status = mTheRealServiceManager->registerForNotifications(name, waiter);
+ !status.isOk()) {
+ ALOGW("Failed to registerForNotifications in waitForService for %s: %s", name.c_str(),
+ status.toString8().c_str());
return nullptr;
}
Defer unregister ([&] {
@@ -360,7 +377,9 @@
// - init gets death signal, but doesn't know it needs to restart
// the service
// - we need to request service again to get it to start
- if (!mTheRealServiceManager->getService(name, &out).isOk()) {
+ if (Status status = realGetService(name, &out); !status.isOk()) {
+ ALOGW("Failed to getService in waitForService on later try for %s: %s", name.c_str(),
+ status.toString8().c_str());
return nullptr;
}
if (out != nullptr) return out;
@@ -369,7 +388,10 @@
bool ServiceManagerShim::isDeclared(const String16& name) {
bool declared;
- if (!mTheRealServiceManager->isDeclared(String8(name).c_str(), &declared).isOk()) {
+ if (Status status = mTheRealServiceManager->isDeclared(String8(name).c_str(), &declared);
+ !status.isOk()) {
+ ALOGW("Failed to get isDeclard for %s: %s", String8(name).c_str(),
+ status.toString8().c_str());
return false;
}
return declared;
@@ -377,7 +399,11 @@
Vector<String16> ServiceManagerShim::getDeclaredInstances(const String16& interface) {
std::vector<std::string> out;
- if (!mTheRealServiceManager->getDeclaredInstances(String8(interface).c_str(), &out).isOk()) {
+ if (Status status =
+ mTheRealServiceManager->getDeclaredInstances(String8(interface).c_str(), &out);
+ !status.isOk()) {
+ ALOGW("Failed to getDeclaredInstances for %s: %s", String8(interface).c_str(),
+ status.toString8().c_str());
return {};
}
@@ -391,10 +417,47 @@
std::optional<String16> ServiceManagerShim::updatableViaApex(const String16& name) {
std::optional<std::string> declared;
- if (!mTheRealServiceManager->updatableViaApex(String8(name).c_str(), &declared).isOk()) {
+ if (Status status = mTheRealServiceManager->updatableViaApex(String8(name).c_str(), &declared);
+ !status.isOk()) {
+ ALOGW("Failed to get updatableViaApex for %s: %s", String8(name).c_str(),
+ status.toString8().c_str());
return std::nullopt;
}
return declared ? std::optional<String16>(String16(declared.value().c_str())) : std::nullopt;
}
+#ifndef __ANDROID__
+// ServiceManagerShim for host. Implements the old libbinder android::IServiceManager API.
+// The internal implementation of the AIDL interface android::os::IServiceManager calls into
+// on-device service manager.
+class ServiceManagerHostShim : public ServiceManagerShim {
+public:
+ using ServiceManagerShim::ServiceManagerShim;
+ // ServiceManagerShim::getService is based on checkService, so no need to override it.
+ sp<IBinder> checkService(const String16& name) const override {
+ return getDeviceService({String8(name).c_str()});
+ }
+
+protected:
+ // Override realGetService for ServiceManagerShim::waitForService.
+ Status realGetService(const std::string& name, sp<IBinder>* _aidl_return) {
+ *_aidl_return = getDeviceService({"-g", name});
+ return Status::ok();
+ }
+};
+sp<IServiceManager> createRpcDelegateServiceManager() {
+ auto binder = getDeviceService({"manager"});
+ if (binder == nullptr) {
+ ALOGE("getDeviceService(\"manager\") returns null");
+ return nullptr;
+ }
+ auto interface = AidlServiceManager::asInterface(binder);
+ if (interface == nullptr) {
+ ALOGE("getDeviceService(\"manager\") returns non service manager");
+ return nullptr;
+ }
+ return sp<ServiceManagerHostShim>::make(interface);
+}
+#endif
+
} // namespace android
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index ee834ea..e623874 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -173,8 +173,8 @@
status_t Parcel::finishFlattenBinder(const sp<IBinder>& binder)
{
internal::Stability::tryMarkCompilationUnit(binder.get());
- auto category = internal::Stability::getCategory(binder.get());
- return writeInt32(category.repr());
+ int16_t rep = internal::Stability::getRepr(binder.get());
+ return writeInt32(rep);
}
status_t Parcel::finishUnflattenBinder(
@@ -184,7 +184,8 @@
status_t status = readInt32(&stability);
if (status != OK) return status;
- status = internal::Stability::setRepr(binder.get(), stability, true /*log*/);
+ status = internal::Stability::setRepr(binder.get(), static_cast<int16_t>(stability),
+ true /*log*/);
if (status != OK) return status;
*out = binder;
@@ -195,13 +196,17 @@
return (priority & FLAT_BINDER_FLAG_PRIORITY_MASK) | ((policy & 3) << FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT);
}
-status_t Parcel::flattenBinder(const sp<IBinder>& binder)
-{
+status_t Parcel::flattenBinder(const sp<IBinder>& binder) {
+ BBinder* local = nullptr;
+ if (binder) local = binder->localBinder();
+ if (local) local->setParceled();
+
if (isForRpc()) {
if (binder) {
status_t status = writeInt32(1); // non-null
if (status != OK) return status;
RpcAddress address = RpcAddress::zero();
+ // TODO(b/167966510): need to undo this if the Parcel is not sent
status = mSession->state()->onBinderLeaving(mSession, binder, &address);
if (status != OK) return status;
status = address.writeToParcel(this);
@@ -222,7 +227,6 @@
}
if (binder != nullptr) {
- BBinder *local = binder->localBinder();
if (!local) {
BpBinder *proxy = binder->remoteBinder();
if (proxy == nullptr) {
@@ -283,9 +287,10 @@
if (isNull & 1) {
auto addr = RpcAddress::zero();
- status_t status = addr.readFromParcel(*this);
- if (status != OK) return status;
- binder = mSession->state()->onBinderEntering(mSession, addr);
+ if (status_t status = addr.readFromParcel(*this); status != OK) return status;
+ if (status_t status = mSession->state()->onBinderEntering(mSession, addr, &binder);
+ status != OK)
+ return status;
}
return finishUnflattenBinder(binder, out);
@@ -1466,6 +1471,29 @@
return nullptr;
}
+status_t Parcel::readOutVectorSizeWithCheck(size_t elmSize, int32_t* size) const {
+ if (status_t status = readInt32(size); status != OK) return status;
+ if (*size < 0) return OK; // may be null, client to handle
+
+ LOG_ALWAYS_FATAL_IF(elmSize > INT32_MAX, "Cannot have element as big as %zu", elmSize);
+
+ // approximation, can't know max element size (e.g. if it makes heap
+ // allocations)
+ static_assert(sizeof(int) == sizeof(int32_t), "Android is LP64");
+ int32_t allocationSize;
+ if (__builtin_smul_overflow(elmSize, *size, &allocationSize)) return NO_MEMORY;
+
+ // High limit of 1MB since something this big could never be returned. Could
+ // probably scope this down, but might impact very specific usecases.
+ constexpr int32_t kMaxAllocationSize = 1 * 1000 * 1000;
+
+ if (allocationSize >= kMaxAllocationSize) {
+ return NO_MEMORY;
+ }
+
+ return OK;
+}
+
template<class T>
status_t Parcel::readAligned(T *pArg) const {
static_assert(PAD_SIZE_UNSAFE(sizeof(T)) == sizeof(T));
diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp
index bade918..650a108 100644
--- a/libs/binder/ProcessState.cpp
+++ b/libs/binder/ProcessState.cpp
@@ -359,6 +359,14 @@
return result;
}
+size_t ProcessState::getThreadPoolMaxThreadCount() const {
+ // may actually be one more than this, if join is called
+ if (mThreadPoolStarted) return mMaxThreads;
+ // must not be initialized or maybe has poll thread setup, we
+ // currently don't track this in libbinder
+ return 0;
+}
+
status_t ProcessState::enableOnewaySpamDetection(bool enable) {
uint32_t enableDetection = enable ? 1 : 0;
if (ioctl(mDriverFD, BINDER_ENABLE_ONEWAY_SPAM_DETECTION, &enableDetection) == -1) {
diff --git a/libs/binder/RpcAddress.cpp b/libs/binder/RpcAddress.cpp
index 5c32320..98dee9a 100644
--- a/libs/binder/RpcAddress.cpp
+++ b/libs/binder/RpcAddress.cpp
@@ -29,7 +29,7 @@
}
bool RpcAddress::isZero() const {
- RpcWireAddress ZERO{0};
+ RpcWireAddress ZERO{.options = 0};
return memcmp(mRawAddr.get(), &ZERO, sizeof(RpcWireAddress)) == 0;
}
@@ -51,13 +51,34 @@
close(fd);
}
-RpcAddress RpcAddress::unique() {
+RpcAddress RpcAddress::random(bool forServer) {
+ // The remainder of this header acts as reserved space for different kinds
+ // of binder objects.
+ uint64_t options = RPC_WIRE_ADDRESS_OPTION_CREATED;
+
+ // servers and clients allocate addresses independently, so this bit can
+ // tell you where an address originates
+ if (forServer) options |= RPC_WIRE_ADDRESS_OPTION_FOR_SERVER;
+
RpcAddress ret;
- ReadRandomBytes((uint8_t*)ret.mRawAddr.get(), sizeof(RpcWireAddress));
+ RpcWireAddress* raw = ret.mRawAddr.get();
+
+ raw->options = options;
+ ReadRandomBytes(raw->address, sizeof(raw->address));
+
LOG_RPC_DETAIL("Creating new address: %s", ret.toString().c_str());
return ret;
}
+bool RpcAddress::isForServer() const {
+ return mRawAddr.get()->options & RPC_WIRE_ADDRESS_OPTION_FOR_SERVER;
+}
+
+bool RpcAddress::isRecognizedType() const {
+ uint64_t allKnownOptions = RPC_WIRE_ADDRESS_OPTION_CREATED | RPC_WIRE_ADDRESS_OPTION_FOR_SERVER;
+ return (mRawAddr.get()->options & ~allKnownOptions) == 0;
+}
+
RpcAddress RpcAddress::fromRawEmbedded(const RpcWireAddress* raw) {
RpcAddress addr;
memcpy(addr.mRawAddr.get(), raw, sizeof(RpcWireAddress));
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp
index 9cc6e7f..62ea187 100644
--- a/libs/binder/RpcServer.cpp
+++ b/libs/binder/RpcServer.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "RpcServer"
+#include <poll.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -26,9 +27,9 @@
#include <binder/Parcel.h>
#include <binder/RpcServer.h>
#include <log/log.h>
-#include "RpcState.h"
#include "RpcSocketAddress.h"
+#include "RpcState.h"
#include "RpcWireFormat.h"
namespace android {
@@ -37,7 +38,9 @@
using base::unique_fd;
RpcServer::RpcServer() {}
-RpcServer::~RpcServer() {}
+RpcServer::~RpcServer() {
+ (void)shutdown();
+}
sp<RpcServer> RpcServer::make() {
return sp<RpcServer>::make();
@@ -99,7 +102,7 @@
void RpcServer::setMaxThreads(size_t threads) {
LOG_ALWAYS_FATAL_IF(threads <= 0, "RpcServer is useless without threads");
- LOG_ALWAYS_FATAL_IF(mStarted, "must be called before started");
+ LOG_ALWAYS_FATAL_IF(mJoinThreadRunning, "Cannot set max threads while running");
mMaxThreads = threads;
}
@@ -107,6 +110,10 @@
return mMaxThreads;
}
+void RpcServer::setProtocolVersion(uint32_t version) {
+ mProtocolVersion = version;
+}
+
void RpcServer::setRootObject(const sp<IBinder>& binder) {
std::lock_guard<std::mutex> _l(mLock);
mRootObjectWeak = mRootObject = binder;
@@ -126,33 +133,93 @@
return ret;
}
-void RpcServer::join() {
- while (true) {
- (void)acceptOne();
- }
+static void joinRpcServer(sp<RpcServer>&& thiz) {
+ thiz->join();
}
-bool RpcServer::acceptOne() {
+void RpcServer::start() {
LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");
- LOG_ALWAYS_FATAL_IF(!hasServer(), "RpcServer must be setup to join.");
+ std::lock_guard<std::mutex> _l(mLock);
+ LOG_ALWAYS_FATAL_IF(mJoinThread.get(), "Already started!");
+ mJoinThread = std::make_unique<std::thread>(&joinRpcServer, sp<RpcServer>::fromExisting(this));
+}
- unique_fd clientFd(
- TEMP_FAILURE_RETRY(accept4(mServer.get(), nullptr, nullptr /*length*/, SOCK_CLOEXEC)));
-
- if (clientFd < 0) {
- ALOGE("Could not accept4 socket: %s", strerror(errno));
- return false;
- }
- LOG_RPC_DETAIL("accept4 on fd %d yields fd %d", mServer.get(), clientFd.get());
+void RpcServer::join() {
+ LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");
{
std::lock_guard<std::mutex> _l(mLock);
- std::thread thread =
- std::thread(&RpcServer::establishConnection, this,
- std::move(sp<RpcServer>::fromExisting(this)), std::move(clientFd));
- mConnectingThreads[thread.get_id()] = std::move(thread);
+ LOG_ALWAYS_FATAL_IF(!mServer.ok(), "RpcServer must be setup to join.");
+ LOG_ALWAYS_FATAL_IF(mShutdownTrigger != nullptr, "Already joined");
+ mJoinThreadRunning = true;
+ mShutdownTrigger = RpcSession::FdTrigger::make();
+ LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler");
}
+ status_t status;
+ while ((status = mShutdownTrigger->triggerablePoll(mServer, POLLIN)) == OK) {
+ unique_fd clientFd(TEMP_FAILURE_RETRY(
+ accept4(mServer.get(), nullptr, nullptr /*length*/, SOCK_CLOEXEC)));
+
+ if (clientFd < 0) {
+ ALOGE("Could not accept4 socket: %s", strerror(errno));
+ continue;
+ }
+ LOG_RPC_DETAIL("accept4 on fd %d yields fd %d", mServer.get(), clientFd.get());
+
+ {
+ std::lock_guard<std::mutex> _l(mLock);
+ std::thread thread =
+ std::thread(&RpcServer::establishConnection, sp<RpcServer>::fromExisting(this),
+ std::move(clientFd));
+ mConnectingThreads[thread.get_id()] = std::move(thread);
+ }
+ }
+ LOG_RPC_DETAIL("RpcServer::join exiting with %s", statusToString(status).c_str());
+
+ {
+ std::lock_guard<std::mutex> _l(mLock);
+ mJoinThreadRunning = false;
+ }
+ mShutdownCv.notify_all();
+}
+
+bool RpcServer::shutdown() {
+ std::unique_lock<std::mutex> _l(mLock);
+ if (mShutdownTrigger == nullptr) {
+ LOG_RPC_DETAIL("Cannot shutdown. No shutdown trigger installed (already shutdown?)");
+ return false;
+ }
+
+ mShutdownTrigger->trigger();
+ for (auto& [id, session] : mSessions) {
+ (void)id;
+ session->mShutdownTrigger->trigger();
+ }
+
+ while (mJoinThreadRunning || !mConnectingThreads.empty() || !mSessions.empty()) {
+ if (std::cv_status::timeout == mShutdownCv.wait_for(_l, std::chrono::seconds(1))) {
+ ALOGE("Waiting for RpcServer to shut down (1s w/o progress). Join thread running: %d, "
+ "Connecting threads: "
+ "%zu, Sessions: %zu. Is your server deadlocked?",
+ mJoinThreadRunning, mConnectingThreads.size(), mSessions.size());
+ }
+ }
+
+ // At this point, we know join() is about to exit, but the thread that calls
+ // join() may not have exited yet.
+ // If RpcServer owns the join thread (aka start() is called), make sure the thread exits;
+ // otherwise ~thread() may call std::terminate(), which may crash the process.
+ // If RpcServer does not own the join thread (aka join() is called directly),
+ // then the owner of RpcServer is responsible for cleaning up that thread.
+ if (mJoinThread.get()) {
+ mJoinThread->join();
+ mJoinThread.reset();
+ }
+
+ LOG_RPC_DETAIL("Finished waiting on shutdown.");
+
+ mShutdownTrigger = nullptr;
return true;
}
@@ -172,62 +239,124 @@
}
void RpcServer::establishConnection(sp<RpcServer>&& server, base::unique_fd clientFd) {
- LOG_ALWAYS_FATAL_IF(this != server.get(), "Must pass same ownership object");
-
// TODO(b/183988761): cannot trust this simple ID
- LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");
- bool idValid = true;
- int32_t id;
- if (sizeof(id) != read(clientFd.get(), &id, sizeof(id))) {
- ALOGE("Could not read ID from fd %d", clientFd.get());
- idValid = false;
+ LOG_ALWAYS_FATAL_IF(!server->mAgreedExperimental, "no!");
+
+ // mShutdownTrigger can only be cleared once connection threads have joined.
+ // It must be set before this thread is started
+ LOG_ALWAYS_FATAL_IF(server->mShutdownTrigger == nullptr);
+
+ RpcConnectionHeader header;
+ status_t status = server->mShutdownTrigger->interruptableReadFully(clientFd.get(), &header,
+ sizeof(header));
+ if (status != OK) {
+ ALOGE("Failed to read ID for client connecting to RPC server: %s",
+ statusToString(status).c_str());
+ // still need to cleanup before we can return
+ }
+
+ bool incoming = false;
+ uint32_t protocolVersion = 0;
+ RpcAddress sessionId = RpcAddress::zero();
+ bool requestingNewSession = false;
+
+ if (status == OK) {
+ incoming = header.options & RPC_CONNECTION_OPTION_INCOMING;
+ protocolVersion = std::min(header.version,
+ server->mProtocolVersion.value_or(RPC_WIRE_PROTOCOL_VERSION));
+ sessionId = RpcAddress::fromRawEmbedded(&header.sessionId);
+ requestingNewSession = sessionId.isZero();
+
+ if (requestingNewSession) {
+ RpcNewSessionResponse response{
+ .version = protocolVersion,
+ };
+
+ status = server->mShutdownTrigger->interruptableWriteFully(clientFd.get(), &response,
+ sizeof(response));
+ if (status != OK) {
+ ALOGE("Failed to send new session response: %s", statusToString(status).c_str());
+ // still need to cleanup before we can return
+ }
+ }
}
std::thread thisThread;
sp<RpcSession> session;
{
- std::lock_guard<std::mutex> _l(mLock);
+ std::unique_lock<std::mutex> _l(server->mLock);
- auto threadId = mConnectingThreads.find(std::this_thread::get_id());
- LOG_ALWAYS_FATAL_IF(threadId == mConnectingThreads.end(),
+ auto threadId = server->mConnectingThreads.find(std::this_thread::get_id());
+ LOG_ALWAYS_FATAL_IF(threadId == server->mConnectingThreads.end(),
"Must establish connection on owned thread");
thisThread = std::move(threadId->second);
- ScopeGuard detachGuard = [&]() { thisThread.detach(); };
- mConnectingThreads.erase(threadId);
+ ScopeGuard detachGuard = [&]() {
+ thisThread.detach();
+ _l.unlock();
+ server->mShutdownCv.notify_all();
+ };
+ server->mConnectingThreads.erase(threadId);
- if (!idValid) {
+ if (status != OK || server->mShutdownTrigger->isTriggered()) {
return;
}
- if (id == RPC_SESSION_ID_NEW) {
- LOG_ALWAYS_FATAL_IF(mSessionIdCounter >= INT32_MAX, "Out of session IDs");
- mSessionIdCounter++;
+ if (requestingNewSession) {
+ if (incoming) {
+ ALOGE("Cannot create a new session with an incoming connection, would leak");
+ return;
+ }
+
+ size_t tries = 0;
+ do {
+ // don't block if there is some entropy issue
+ if (tries++ > 5) {
+ ALOGE("Cannot find new address: %s", sessionId.toString().c_str());
+ return;
+ }
+
+ sessionId = RpcAddress::random(true /*forServer*/);
+ } while (server->mSessions.end() != server->mSessions.find(sessionId));
session = RpcSession::make();
- session->setForServer(wp<RpcServer>::fromExisting(this), mSessionIdCounter);
+ session->setMaxThreads(server->mMaxThreads);
+ if (!session->setProtocolVersion(protocolVersion)) return;
+ if (!session->setForServer(server,
+ sp<RpcServer::EventListener>::fromExisting(
+ static_cast<RpcServer::EventListener*>(
+ server.get())),
+ sessionId)) {
+ ALOGE("Failed to attach server to session");
+ return;
+ }
- mSessions[mSessionIdCounter] = session;
+ server->mSessions[sessionId] = session;
} else {
- auto it = mSessions.find(id);
- if (it == mSessions.end()) {
- ALOGE("Cannot add thread, no record of session with ID %d", id);
+ auto it = server->mSessions.find(sessionId);
+ if (it == server->mSessions.end()) {
+ ALOGE("Cannot add thread, no record of session with ID %s",
+ sessionId.toString().c_str());
return;
}
session = it->second;
}
+ if (incoming) {
+ LOG_ALWAYS_FATAL_IF(!session->addOutgoingConnection(std::move(clientFd), true),
+ "server state must already be initialized");
+ return;
+ }
+
detachGuard.Disable();
- session->preJoin(std::move(thisThread));
+ session->preJoinThreadOwnership(std::move(thisThread));
}
+ auto setupResult = session->preJoinSetup(std::move(clientFd));
+
// avoid strong cycle
server = nullptr;
- //
- //
- // DO NOT ACCESS MEMBER VARIABLES BELOW
- //
- session->join(std::move(clientFd));
+ RpcSession::join(std::move(session), std::move(setupResult));
}
bool RpcServer::setupSocketServer(const RpcSocketAddress& addr) {
@@ -247,7 +376,11 @@
return false;
}
- if (0 != TEMP_FAILURE_RETRY(listen(serverFd.get(), 1 /*backlog*/))) {
+ // Right now, we create all threads at once, making accept4 slow. To avoid hanging the client,
+ // the backlog is increased to a large number.
+ // TODO(b/189955605): Once we create threads dynamically & lazily, the backlog can be reduced
+ // to 1.
+ if (0 != TEMP_FAILURE_RETRY(listen(serverFd.get(), 50 /*backlog*/))) {
int savedErrno = errno;
ALOGE("Could not listen socket at %s: %s", addr.toString().c_str(), strerror(savedErrno));
return false;
@@ -255,22 +388,31 @@
LOG_RPC_DETAIL("Successfully setup socket server %s", addr.toString().c_str());
- mServer = std::move(serverFd);
+ if (!setupExternalServer(std::move(serverFd))) {
+ ALOGE("Another thread has set up server while calling setupSocketServer. Race?");
+ return false;
+ }
return true;
}
-void RpcServer::onSessionTerminating(const sp<RpcSession>& session) {
+void RpcServer::onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) {
auto id = session->mId;
LOG_ALWAYS_FATAL_IF(id == std::nullopt, "Server sessions must be initialized with ID");
- LOG_RPC_DETAIL("Dropping session %d", *id);
+ LOG_RPC_DETAIL("Dropping session with address %s", id->toString().c_str());
std::lock_guard<std::mutex> _l(mLock);
auto it = mSessions.find(*id);
- LOG_ALWAYS_FATAL_IF(it == mSessions.end(), "Bad state, unknown session id %d", *id);
- LOG_ALWAYS_FATAL_IF(it->second != session, "Bad state, session has id mismatch %d", *id);
+ LOG_ALWAYS_FATAL_IF(it == mSessions.end(), "Bad state, unknown session id %s",
+ id->toString().c_str());
+ LOG_ALWAYS_FATAL_IF(it->second != session, "Bad state, session has id mismatch %s",
+ id->toString().c_str());
(void)mSessions.erase(it);
}
+void RpcServer::onSessionIncomingThreadEnded() {
+ mShutdownCv.notify_all();
+}
+
bool RpcServer::hasServer() {
LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");
std::lock_guard<std::mutex> _l(mLock);
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp
index 05fa49e..254b99c 100644
--- a/libs/binder/RpcSession.cpp
+++ b/libs/binder/RpcSession.cpp
@@ -18,14 +18,20 @@
#include <binder/RpcSession.h>
+#include <dlfcn.h>
#include <inttypes.h>
+#include <poll.h>
+#include <pthread.h>
#include <unistd.h>
#include <string_view>
+#include <android-base/macros.h>
+#include <android_runtime/vm.h>
#include <binder/Parcel.h>
#include <binder/RpcServer.h>
#include <binder/Stability.h>
+#include <jni.h>
#include <utils/String8.h>
#include "RpcSocketAddress.h"
@@ -49,7 +55,7 @@
LOG_RPC_DETAIL("RpcSession destroyed %p", this);
std::lock_guard<std::mutex> _l(mMutex);
- LOG_ALWAYS_FATAL_IF(mServerConnections.size() != 0,
+ LOG_ALWAYS_FATAL_IF(mIncomingConnections.size() != 0,
"Should not be able to destroy a session with servers in use.");
}
@@ -57,6 +63,45 @@
return sp<RpcSession>::make();
}
+void RpcSession::setMaxThreads(size_t threads) {
+ std::lock_guard<std::mutex> _l(mMutex);
+ LOG_ALWAYS_FATAL_IF(!mOutgoingConnections.empty() || !mIncomingConnections.empty(),
+ "Must set max threads before setting up connections, but has %zu client(s) "
+ "and %zu server(s)",
+ mOutgoingConnections.size(), mIncomingConnections.size());
+ mMaxThreads = threads;
+}
+
+size_t RpcSession::getMaxThreads() {
+ std::lock_guard<std::mutex> _l(mMutex);
+ return mMaxThreads;
+}
+
+bool RpcSession::setProtocolVersion(uint32_t version) {
+ if (version >= RPC_WIRE_PROTOCOL_VERSION_NEXT &&
+ version != RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL) {
+ ALOGE("Cannot start RPC session with version %u which is unknown (current protocol version "
+ "is %u).",
+ version, RPC_WIRE_PROTOCOL_VERSION);
+ return false;
+ }
+
+ std::lock_guard<std::mutex> _l(mMutex);
+ if (mProtocolVersion && version > *mProtocolVersion) {
+ ALOGE("Cannot upgrade explicitly capped protocol version %u to newer version %u",
+ *mProtocolVersion, version);
+ return false;
+ }
+
+ mProtocolVersion = version;
+ return true;
+}
+
+std::optional<uint32_t> RpcSession::getProtocolVersion() {
+ std::lock_guard<std::mutex> _l(mMutex);
+ return mProtocolVersion;
+}
+
bool RpcSession::setupUnixDomainClient(const char* path) {
return setupSocketClient(UnixSocketAddress(path));
}
@@ -84,33 +129,140 @@
return false;
}
- addClientConnection(std::move(serverFd));
- return true;
+ return addOutgoingConnection(std::move(serverFd), false);
}
sp<IBinder> RpcSession::getRootObject() {
- ExclusiveConnection connection(sp<RpcSession>::fromExisting(this), ConnectionUse::CLIENT);
- return state()->getRootObject(connection.fd(), sp<RpcSession>::fromExisting(this));
+ ExclusiveConnection connection;
+ status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ ConnectionUse::CLIENT, &connection);
+ if (status != OK) return nullptr;
+ return state()->getRootObject(connection.get(), sp<RpcSession>::fromExisting(this));
}
status_t RpcSession::getRemoteMaxThreads(size_t* maxThreads) {
- ExclusiveConnection connection(sp<RpcSession>::fromExisting(this), ConnectionUse::CLIENT);
- return state()->getMaxThreads(connection.fd(), sp<RpcSession>::fromExisting(this), maxThreads);
+ ExclusiveConnection connection;
+ status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ ConnectionUse::CLIENT, &connection);
+ if (status != OK) return status;
+ return state()->getMaxThreads(connection.get(), sp<RpcSession>::fromExisting(this), maxThreads);
}
-status_t RpcSession::transact(const RpcAddress& address, uint32_t code, const Parcel& data,
+bool RpcSession::shutdownAndWait(bool wait) {
+ std::unique_lock<std::mutex> _l(mMutex);
+ LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Shutdown trigger not installed");
+
+ mShutdownTrigger->trigger();
+
+ if (wait) {
+ LOG_ALWAYS_FATAL_IF(mShutdownListener == nullptr, "Shutdown listener not installed");
+ mShutdownListener->waitForShutdown(_l);
+
+ LOG_ALWAYS_FATAL_IF(!mThreads.empty(), "Shutdown failed");
+ }
+
+ _l.unlock();
+ mState->clear();
+
+ return true;
+}
+
+status_t RpcSession::transact(const sp<IBinder>& binder, uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags) {
- ExclusiveConnection connection(sp<RpcSession>::fromExisting(this),
- (flags & IBinder::FLAG_ONEWAY) ? ConnectionUse::CLIENT_ASYNC
- : ConnectionUse::CLIENT);
- return state()->transact(connection.fd(), address, code, data,
+ ExclusiveConnection connection;
+ status_t status =
+ ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ (flags & IBinder::FLAG_ONEWAY) ? ConnectionUse::CLIENT_ASYNC
+ : ConnectionUse::CLIENT,
+ &connection);
+ if (status != OK) return status;
+ return state()->transact(connection.get(), binder, code, data,
sp<RpcSession>::fromExisting(this), reply, flags);
}
status_t RpcSession::sendDecStrong(const RpcAddress& address) {
- ExclusiveConnection connection(sp<RpcSession>::fromExisting(this),
- ConnectionUse::CLIENT_REFCOUNT);
- return state()->sendDecStrong(connection.fd(), address);
+ ExclusiveConnection connection;
+ status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ ConnectionUse::CLIENT_REFCOUNT, &connection);
+ if (status != OK) return status;
+ return state()->sendDecStrong(connection.get(), sp<RpcSession>::fromExisting(this), address);
+}
+
+std::unique_ptr<RpcSession::FdTrigger> RpcSession::FdTrigger::make() {
+ auto ret = std::make_unique<RpcSession::FdTrigger>();
+ if (!android::base::Pipe(&ret->mRead, &ret->mWrite)) {
+ ALOGE("Could not create pipe %s", strerror(errno));
+ return nullptr;
+ }
+ return ret;
+}
+
+void RpcSession::FdTrigger::trigger() {
+ mWrite.reset();
+}
+
+bool RpcSession::FdTrigger::isTriggered() {
+ return mWrite == -1;
+}
+
+status_t RpcSession::FdTrigger::triggerablePoll(base::borrowed_fd fd, int16_t event) {
+ while (true) {
+ pollfd pfd[]{{.fd = fd.get(), .events = static_cast<int16_t>(event), .revents = 0},
+ {.fd = mRead.get(), .events = POLLHUP, .revents = 0}};
+ int ret = TEMP_FAILURE_RETRY(poll(pfd, arraysize(pfd), -1));
+ if (ret < 0) {
+ return -errno;
+ }
+ if (ret == 0) {
+ continue;
+ }
+ if (pfd[1].revents & POLLHUP) {
+ return -ECANCELED;
+ }
+ return pfd[0].revents & event ? OK : DEAD_OBJECT;
+ }
+}
+
+status_t RpcSession::FdTrigger::interruptableWriteFully(base::borrowed_fd fd, const void* data,
+ size_t size) {
+ const uint8_t* buffer = reinterpret_cast<const uint8_t*>(data);
+ const uint8_t* end = buffer + size;
+
+ MAYBE_WAIT_IN_FLAKE_MODE;
+
+ status_t status;
+ while ((status = triggerablePoll(fd, POLLOUT)) == OK) {
+ ssize_t writeSize = TEMP_FAILURE_RETRY(send(fd.get(), buffer, end - buffer, MSG_NOSIGNAL));
+ if (writeSize == 0) return DEAD_OBJECT;
+
+ if (writeSize < 0) {
+ return -errno;
+ }
+ buffer += writeSize;
+ if (buffer == end) return OK;
+ }
+ return status;
+}
+
+status_t RpcSession::FdTrigger::interruptableReadFully(base::borrowed_fd fd, void* data,
+ size_t size) {
+ uint8_t* buffer = reinterpret_cast<uint8_t*>(data);
+ uint8_t* end = buffer + size;
+
+ MAYBE_WAIT_IN_FLAKE_MODE;
+
+ status_t status;
+ while ((status = triggerablePoll(fd, POLLIN)) == OK) {
+ ssize_t readSize = TEMP_FAILURE_RETRY(recv(fd.get(), buffer, end - buffer, MSG_NOSIGNAL));
+ if (readSize == 0) return DEAD_OBJECT; // EOF
+
+ if (readSize < 0) {
+ return -errno;
+ }
+ buffer += readSize;
+ if (buffer == end) return OK;
+ }
+ return status;
}
status_t RpcSession::readId() {
@@ -119,19 +271,39 @@
LOG_ALWAYS_FATAL_IF(mForServer != nullptr, "Can only update ID for client.");
}
- int32_t id;
-
- ExclusiveConnection connection(sp<RpcSession>::fromExisting(this), ConnectionUse::CLIENT);
- status_t status =
- state()->getSessionId(connection.fd(), sp<RpcSession>::fromExisting(this), &id);
+ ExclusiveConnection connection;
+ status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ ConnectionUse::CLIENT, &connection);
if (status != OK) return status;
- LOG_RPC_DETAIL("RpcSession %p has id %d", this, id);
- mId = id;
+ mId = RpcAddress::zero();
+ status = state()->getSessionId(connection.get(), sp<RpcSession>::fromExisting(this),
+ &mId.value());
+ if (status != OK) return status;
+
+ LOG_RPC_DETAIL("RpcSession %p has id %s", this, mId->toString().c_str());
return OK;
}
-void RpcSession::preJoin(std::thread thread) {
+void RpcSession::WaitForShutdownListener::onSessionAllIncomingThreadsEnded(
+ const sp<RpcSession>& session) {
+ (void)session;
+ mShutdown = true;
+}
+
+void RpcSession::WaitForShutdownListener::onSessionIncomingThreadEnded() {
+ mCv.notify_all();
+}
+
+void RpcSession::WaitForShutdownListener::waitForShutdown(std::unique_lock<std::mutex>& lock) {
+ while (!mShutdown) {
+ if (std::cv_status::timeout == mCv.wait_for(lock, std::chrono::seconds(1))) {
+ ALOGE("Waiting for RpcSession to shut down (1s w/o progress).");
+ }
+ }
+}
+
+void RpcSession::preJoinThreadOwnership(std::thread thread) {
LOG_ALWAYS_FATAL_IF(thread.get_id() != std::this_thread::get_id(), "Must own this thread");
{
@@ -140,64 +312,156 @@
}
}
-void RpcSession::join(unique_fd client) {
+RpcSession::PreJoinSetupResult RpcSession::preJoinSetup(base::unique_fd fd) {
// must be registered to allow arbitrary client code executing commands to
// be able to do nested calls (we can't only read from it)
- sp<RpcConnection> connection = assignServerToThisThread(std::move(client));
+ sp<RpcConnection> connection = assignIncomingConnectionToThisThread(std::move(fd));
- while (true) {
- status_t error =
- state()->getAndExecuteCommand(connection->fd, sp<RpcSession>::fromExisting(this));
+ status_t status;
- if (error != OK) {
- ALOGI("Binder connection thread closing w/ status %s", statusToString(error).c_str());
- break;
+ if (connection == nullptr) {
+ status = DEAD_OBJECT;
+ } else {
+ status = mState->readConnectionInit(connection, sp<RpcSession>::fromExisting(this));
+ }
+
+ return PreJoinSetupResult{
+ .connection = std::move(connection),
+ .status = status,
+ };
+}
+
+namespace {
+// RAII object for attaching / detaching current thread to JVM if Android Runtime exists. If
+// Android Runtime doesn't exist, no-op.
+class JavaThreadAttacher {
+public:
+ JavaThreadAttacher() {
+ // Use dlsym to find androidJavaAttachThread because libandroid_runtime is loaded after
+ // libbinder.
+ auto vm = getJavaVM();
+ if (vm == nullptr) return;
+
+ char threadName[16];
+ if (0 != pthread_getname_np(pthread_self(), threadName, sizeof(threadName))) {
+ constexpr const char* defaultThreadName = "UnknownRpcSessionThread";
+ memcpy(threadName, defaultThreadName,
+ std::min<size_t>(sizeof(threadName), strlen(defaultThreadName) + 1));
+ }
+ LOG_RPC_DETAIL("Attaching current thread %s to JVM", threadName);
+ JavaVMAttachArgs args;
+ args.version = JNI_VERSION_1_2;
+ args.name = threadName;
+ args.group = nullptr;
+ JNIEnv* env;
+
+ LOG_ALWAYS_FATAL_IF(vm->AttachCurrentThread(&env, &args) != JNI_OK,
+ "Cannot attach thread %s to JVM", threadName);
+ mAttached = true;
+ }
+ ~JavaThreadAttacher() {
+ if (!mAttached) return;
+ auto vm = getJavaVM();
+ LOG_ALWAYS_FATAL_IF(vm == nullptr,
+ "Unable to detach thread. No JavaVM, but it was present before!");
+
+ LOG_RPC_DETAIL("Detaching current thread from JVM");
+ if (vm->DetachCurrentThread() != JNI_OK) {
+ mAttached = false;
+ } else {
+ ALOGW("Unable to detach current thread from JVM");
}
}
- LOG_ALWAYS_FATAL_IF(!removeServerConnection(connection),
- "bad state: connection object guaranteed to be in list");
+private:
+ DISALLOW_COPY_AND_ASSIGN(JavaThreadAttacher);
+ bool mAttached = false;
+ static JavaVM* getJavaVM() {
+ static auto fn = reinterpret_cast<decltype(&AndroidRuntimeGetJavaVM)>(
+ dlsym(RTLD_DEFAULT, "AndroidRuntimeGetJavaVM"));
+ if (fn == nullptr) return nullptr;
+ return fn();
+ }
+};
+} // namespace
+
+void RpcSession::join(sp<RpcSession>&& session, PreJoinSetupResult&& setupResult) {
+ sp<RpcConnection>& connection = setupResult.connection;
+
+ if (setupResult.status == OK) {
+ LOG_ALWAYS_FATAL_IF(!connection, "must have connection if setup succeeded");
+ JavaThreadAttacher javaThreadAttacher;
+ while (true) {
+ status_t status = session->state()->getAndExecuteCommand(connection, session,
+ RpcState::CommandType::ANY);
+ if (status != OK) {
+ LOG_RPC_DETAIL("Binder connection thread closing w/ status %s",
+ statusToString(status).c_str());
+ break;
+ }
+ }
+ } else {
+ ALOGE("Connection failed to init, closing with status %s",
+ statusToString(setupResult.status).c_str());
+ }
+
+ sp<RpcSession::EventListener> listener;
{
- std::lock_guard<std::mutex> _l(mMutex);
- auto it = mThreads.find(std::this_thread::get_id());
- LOG_ALWAYS_FATAL_IF(it == mThreads.end());
+ std::lock_guard<std::mutex> _l(session->mMutex);
+ auto it = session->mThreads.find(std::this_thread::get_id());
+ LOG_ALWAYS_FATAL_IF(it == session->mThreads.end());
it->second.detach();
- mThreads.erase(it);
+ session->mThreads.erase(it);
+
+ listener = session->mEventListener.promote();
+ }
+
+ // done after all cleanup, since session shutdown progresses via callbacks here
+ if (connection != nullptr) {
+ LOG_ALWAYS_FATAL_IF(!session->removeIncomingConnection(connection),
+ "bad state: connection object guaranteed to be in list");
+ }
+
+ session = nullptr;
+
+ if (listener != nullptr) {
+ listener->onSessionIncomingThreadEnded();
}
}
-void RpcSession::terminateLocked() {
- // TODO(b/185167543):
- // - kindly notify other side of the connection of termination (can't be
- // locked)
- // - prevent new client/servers from being added
- // - stop all threads which are currently reading/writing
- // - terminate RpcState?
-
- if (mTerminated) return;
-
+sp<RpcServer> RpcSession::server() {
+ RpcServer* unsafeServer = mForServer.unsafe_get();
sp<RpcServer> server = mForServer.promote();
- if (server) {
- server->onSessionTerminating(sp<RpcSession>::fromExisting(this));
- }
-}
-wp<RpcServer> RpcSession::server() {
- return mForServer;
+ LOG_ALWAYS_FATAL_IF((unsafeServer == nullptr) != (server == nullptr),
+ "wp<> is to avoid strong cycle only");
+ return server;
}
bool RpcSession::setupSocketClient(const RpcSocketAddress& addr) {
{
std::lock_guard<std::mutex> _l(mMutex);
- LOG_ALWAYS_FATAL_IF(mClientConnections.size() != 0,
+ LOG_ALWAYS_FATAL_IF(mOutgoingConnections.size() != 0,
"Must only setup session once, but already has %zu clients",
- mClientConnections.size());
+ mOutgoingConnections.size());
}
- if (!setupOneSocketClient(addr, RPC_SESSION_ID_NEW)) return false;
+ if (!setupOneSocketConnection(addr, RpcAddress::zero(), false /*incoming*/)) return false;
- // TODO(b/185167543): we should add additional sessions dynamically
+ {
+ ExclusiveConnection connection;
+ status_t status = ExclusiveConnection::find(sp<RpcSession>::fromExisting(this),
+ ConnectionUse::CLIENT, &connection);
+ if (status != OK) return false;
+
+ uint32_t version;
+ status = state()->readNewSessionResponse(connection.get(),
+ sp<RpcSession>::fromExisting(this), &version);
+ if (!setProtocolVersion(version)) return false;
+ }
+
+ // TODO(b/189955605): we should add additional sessions dynamically
// instead of all at once.
// TODO(b/186470974): first risk of blocking
size_t numThreadsAvailable;
@@ -215,14 +479,25 @@
// we've already setup one client
for (size_t i = 0; i + 1 < numThreadsAvailable; i++) {
- // TODO(b/185167543): shutdown existing connections?
- if (!setupOneSocketClient(addr, mId.value())) return false;
+ // TODO(b/189955605): shutdown existing connections?
+ if (!setupOneSocketConnection(addr, mId.value(), false /*incoming*/)) return false;
+ }
+
+ // TODO(b/189955605): we should add additional sessions dynamically
+ // instead of all at once - the other side should be responsible for setting
+ // up additional connections. We need to create at least one (unless 0 are
+ // requested to be set) in order to allow the other side to reliably make
+ // any requests at all.
+
+ for (size_t i = 0; i < mMaxThreads; i++) {
+ if (!setupOneSocketConnection(addr, mId.value(), true /*incoming*/)) return false;
}
return true;
}
-bool RpcSession::setupOneSocketClient(const RpcSocketAddress& addr, int32_t id) {
+bool RpcSession::setupOneSocketConnection(const RpcSocketAddress& addr, const RpcAddress& id,
+ bool incoming) {
for (size_t tries = 0; tries < 5; tries++) {
if (tries > 0) usleep(10000);
@@ -246,77 +521,171 @@
return false;
}
- if (sizeof(id) != TEMP_FAILURE_RETRY(write(serverFd.get(), &id, sizeof(id)))) {
+ RpcConnectionHeader header{
+ .version = mProtocolVersion.value_or(RPC_WIRE_PROTOCOL_VERSION),
+ .options = 0,
+ };
+ memcpy(&header.sessionId, &id.viewRawEmbedded(), sizeof(RpcWireAddress));
+
+ if (incoming) header.options |= RPC_CONNECTION_OPTION_INCOMING;
+
+ if (sizeof(header) != TEMP_FAILURE_RETRY(write(serverFd.get(), &header, sizeof(header)))) {
int savedErrno = errno;
- ALOGE("Could not write id to socket at %s: %s", addr.toString().c_str(),
+ ALOGE("Could not write connection header to socket at %s: %s", addr.toString().c_str(),
strerror(savedErrno));
return false;
}
LOG_RPC_DETAIL("Socket at %s client with fd %d", addr.toString().c_str(), serverFd.get());
- addClientConnection(std::move(serverFd));
- return true;
+ if (incoming) {
+ return addIncomingConnection(std::move(serverFd));
+ } else {
+ return addOutgoingConnection(std::move(serverFd), true);
+ }
}
ALOGE("Ran out of retries to connect to %s", addr.toString().c_str());
return false;
}
-void RpcSession::addClientConnection(unique_fd fd) {
- std::lock_guard<std::mutex> _l(mMutex);
- sp<RpcConnection> session = sp<RpcConnection>::make();
- session->fd = std::move(fd);
- mClientConnections.push_back(session);
+bool RpcSession::addIncomingConnection(unique_fd fd) {
+ std::mutex mutex;
+ std::condition_variable joinCv;
+ std::unique_lock<std::mutex> lock(mutex);
+ std::thread thread;
+ sp<RpcSession> thiz = sp<RpcSession>::fromExisting(this);
+ bool ownershipTransferred = false;
+ thread = std::thread([&]() {
+ std::unique_lock<std::mutex> threadLock(mutex);
+ unique_fd movedFd = std::move(fd);
+ // NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
+ sp<RpcSession> session = thiz;
+ session->preJoinThreadOwnership(std::move(thread));
+
+ // only continue once we have a response or the connection fails
+ auto setupResult = session->preJoinSetup(std::move(movedFd));
+
+ ownershipTransferred = true;
+ threadLock.unlock();
+ joinCv.notify_one();
+ // do not use & vars below
+
+ RpcSession::join(std::move(session), std::move(setupResult));
+ });
+ joinCv.wait(lock, [&] { return ownershipTransferred; });
+ LOG_ALWAYS_FATAL_IF(!ownershipTransferred);
+ return true;
}
-void RpcSession::setForServer(const wp<RpcServer>& server, int32_t sessionId) {
+bool RpcSession::addOutgoingConnection(unique_fd fd, bool init) {
+ sp<RpcConnection> connection = sp<RpcConnection>::make();
+ {
+ std::lock_guard<std::mutex> _l(mMutex);
+
+ // first client connection added, but setForServer not called, so
+ // initializaing for a client.
+ if (mShutdownTrigger == nullptr) {
+ mShutdownTrigger = FdTrigger::make();
+ mEventListener = mShutdownListener = sp<WaitForShutdownListener>::make();
+ if (mShutdownTrigger == nullptr) return false;
+ }
+
+ connection->fd = std::move(fd);
+ connection->exclusiveTid = gettid();
+ mOutgoingConnections.push_back(connection);
+ }
+
+ status_t status = OK;
+ if (init) {
+ mState->sendConnectionInit(connection, sp<RpcSession>::fromExisting(this));
+ }
+
+ {
+ std::lock_guard<std::mutex> _l(mMutex);
+ connection->exclusiveTid = std::nullopt;
+ }
+
+ return status == OK;
+}
+
+bool RpcSession::setForServer(const wp<RpcServer>& server, const wp<EventListener>& eventListener,
+ const RpcAddress& sessionId) {
+ LOG_ALWAYS_FATAL_IF(mForServer != nullptr);
+ LOG_ALWAYS_FATAL_IF(server == nullptr);
+ LOG_ALWAYS_FATAL_IF(mEventListener != nullptr);
+ LOG_ALWAYS_FATAL_IF(eventListener == nullptr);
+ LOG_ALWAYS_FATAL_IF(mShutdownTrigger != nullptr);
+
+ mShutdownTrigger = FdTrigger::make();
+ if (mShutdownTrigger == nullptr) return false;
+
mId = sessionId;
mForServer = server;
+ mEventListener = eventListener;
+ return true;
}
-sp<RpcSession::RpcConnection> RpcSession::assignServerToThisThread(unique_fd fd) {
+sp<RpcSession::RpcConnection> RpcSession::assignIncomingConnectionToThisThread(unique_fd fd) {
std::lock_guard<std::mutex> _l(mMutex);
+
+ // Don't accept any more connections, some have shutdown. Usually this
+ // happens when new connections are still being established as part of a
+ // very short-lived session which shuts down after it already started
+ // accepting new connections.
+ if (mIncomingConnections.size() < mMaxIncomingConnections) {
+ return nullptr;
+ }
+
sp<RpcConnection> session = sp<RpcConnection>::make();
session->fd = std::move(fd);
session->exclusiveTid = gettid();
- mServerConnections.push_back(session);
+
+ mIncomingConnections.push_back(session);
+ mMaxIncomingConnections = mIncomingConnections.size();
return session;
}
-bool RpcSession::removeServerConnection(const sp<RpcConnection>& connection) {
- std::lock_guard<std::mutex> _l(mMutex);
- if (auto it = std::find(mServerConnections.begin(), mServerConnections.end(), connection);
- it != mServerConnections.end()) {
- mServerConnections.erase(it);
- if (mServerConnections.size() == 0) {
- terminateLocked();
+bool RpcSession::removeIncomingConnection(const sp<RpcConnection>& connection) {
+ std::unique_lock<std::mutex> _l(mMutex);
+ if (auto it = std::find(mIncomingConnections.begin(), mIncomingConnections.end(), connection);
+ it != mIncomingConnections.end()) {
+ mIncomingConnections.erase(it);
+ if (mIncomingConnections.size() == 0) {
+ sp<EventListener> listener = mEventListener.promote();
+ if (listener) {
+ _l.unlock();
+ listener->onSessionAllIncomingThreadsEnded(sp<RpcSession>::fromExisting(this));
+ }
}
return true;
}
return false;
}
-RpcSession::ExclusiveConnection::ExclusiveConnection(const sp<RpcSession>& session,
- ConnectionUse use)
- : mSession(session) {
- pid_t tid = gettid();
- std::unique_lock<std::mutex> _l(mSession->mMutex);
+status_t RpcSession::ExclusiveConnection::find(const sp<RpcSession>& session, ConnectionUse use,
+ ExclusiveConnection* connection) {
+ connection->mSession = session;
+ connection->mConnection = nullptr;
+ connection->mReentrant = false;
- mSession->mWaitingThreads++;
+ pid_t tid = gettid();
+ std::unique_lock<std::mutex> _l(session->mMutex);
+
+ session->mWaitingThreads++;
while (true) {
sp<RpcConnection> exclusive;
sp<RpcConnection> available;
// CHECK FOR DEDICATED CLIENT SOCKET
//
- // A server/looper should always use a dedicated session if available
- findConnection(tid, &exclusive, &available, mSession->mClientConnections,
- mSession->mClientConnectionsOffset);
+ // A server/looper should always use a dedicated connection if available
+ findConnection(tid, &exclusive, &available, session->mOutgoingConnections,
+ session->mOutgoingConnectionsOffset);
// WARNING: this assumes a server cannot request its client to send
- // a transaction, as mServerConnections is excluded below.
+ // a transaction, as mIncomingConnections is excluded below.
//
// Imagine we have more than one thread in play, and a single thread
// sends a synchronous, then an asynchronous command. Imagine the
@@ -326,41 +695,59 @@
// command. So, we move to considering the second available thread
// for subsequent calls.
if (use == ConnectionUse::CLIENT_ASYNC && (exclusive != nullptr || available != nullptr)) {
- mSession->mClientConnectionsOffset =
- (mSession->mClientConnectionsOffset + 1) % mSession->mClientConnections.size();
+ session->mOutgoingConnectionsOffset = (session->mOutgoingConnectionsOffset + 1) %
+ session->mOutgoingConnections.size();
}
- // USE SERVING SOCKET (for nested transaction)
- //
- // asynchronous calls cannot be nested
+ // USE SERVING SOCKET (e.g. nested transaction)
if (use != ConnectionUse::CLIENT_ASYNC) {
+ sp<RpcConnection> exclusiveIncoming;
// server connections are always assigned to a thread
- findConnection(tid, &exclusive, nullptr /*available*/, mSession->mServerConnections,
- 0 /* index hint */);
+ findConnection(tid, &exclusiveIncoming, nullptr /*available*/,
+ session->mIncomingConnections, 0 /* index hint */);
+
+ // asynchronous calls cannot be nested, we currently allow ref count
+ // calls to be nested (so that you can use this without having extra
+ // threads). Note 'drainCommands' is used so that these ref counts can't
+ // build up.
+ if (exclusiveIncoming != nullptr) {
+ if (exclusiveIncoming->allowNested) {
+ // guaranteed to be processed as nested command
+ exclusive = exclusiveIncoming;
+ } else if (use == ConnectionUse::CLIENT_REFCOUNT && available == nullptr) {
+ // prefer available socket, but if we don't have one, don't
+ // wait for one
+ exclusive = exclusiveIncoming;
+ }
+ }
}
- // if our thread is already using a session, prioritize using that
+ // if our thread is already using a connection, prioritize using that
if (exclusive != nullptr) {
- mConnection = exclusive;
- mReentrant = true;
+ connection->mConnection = exclusive;
+ connection->mReentrant = true;
break;
} else if (available != nullptr) {
- mConnection = available;
- mConnection->exclusiveTid = tid;
+ connection->mConnection = available;
+ connection->mConnection->exclusiveTid = tid;
break;
}
- // in regular binder, this would usually be a deadlock :)
- LOG_ALWAYS_FATAL_IF(mSession->mClientConnections.size() == 0,
- "Not a client of any session. You must create a session to an "
- "RPC server to make any non-nested (e.g. oneway or on another thread) "
- "calls.");
+ if (session->mOutgoingConnections.size() == 0) {
+ ALOGE("Session has no client connections. This is required for an RPC server to make "
+ "any non-nested (e.g. oneway or on another thread) calls. Use: %d. Server "
+ "connections: %zu",
+ static_cast<int>(use), session->mIncomingConnections.size());
+ return WOULD_BLOCK;
+ }
- LOG_RPC_DETAIL("No available session (have %zu clients and %zu servers). Waiting...",
- mSession->mClientConnections.size(), mSession->mServerConnections.size());
- mSession->mAvailableConnectionCv.wait(_l);
+ LOG_RPC_DETAIL("No available connections (have %zu clients and %zu servers). Waiting...",
+ session->mOutgoingConnections.size(), session->mIncomingConnections.size());
+ session->mAvailableConnectionCv.wait(_l);
}
- mSession->mWaitingThreads--;
+ session->mWaitingThreads--;
+
+ return OK;
}
void RpcSession::ExclusiveConnection::findConnection(pid_t tid, sp<RpcConnection>* exclusive,
@@ -375,13 +762,13 @@
for (size_t i = 0; i < sockets.size(); i++) {
sp<RpcConnection>& socket = sockets[(i + socketsIndexHint) % sockets.size()];
- // take first available session (intuition = caching)
+ // take first available connection (intuition = caching)
if (available && *available == nullptr && socket->exclusiveTid == std::nullopt) {
*available = socket;
continue;
}
- // though, prefer to take session which is already inuse by this thread
+ // though, prefer to take connection which is already inuse by this thread
// (nested transactions)
if (exclusive && socket->exclusiveTid == tid) {
*exclusive = socket;
@@ -391,10 +778,10 @@
}
RpcSession::ExclusiveConnection::~ExclusiveConnection() {
- // reentrant use of a session means something less deep in the call stack
+ // reentrant use of a connection means something less deep in the call stack
// is using this fd, and it retains the right to it. So, we don't give up
// exclusive ownership, and no thread is freed.
- if (!mReentrant) {
+ if (!mReentrant && mConnection != nullptr) {
std::unique_lock<std::mutex> _l(mSession->mMutex);
mConnection->exclusiveTid = std::nullopt;
if (mSession->mWaitingThreads > 0) {
diff --git a/libs/binder/RpcState.cpp b/libs/binder/RpcState.cpp
index 2ba9fa2..f3406bb 100644
--- a/libs/binder/RpcState.cpp
+++ b/libs/binder/RpcState.cpp
@@ -18,16 +18,35 @@
#include "RpcState.h"
+#include <android-base/scopeguard.h>
#include <binder/BpBinder.h>
+#include <binder/IPCThreadState.h>
#include <binder/RpcServer.h>
#include "Debug.h"
#include "RpcWireFormat.h"
+#include <random>
+
#include <inttypes.h>
namespace android {
+using base::ScopeGuard;
+
+#if RPC_FLAKE_PRONE
+void rpcMaybeWaitToFlake() {
+ [[clang::no_destroy]] static std::random_device r;
+ [[clang::no_destroy]] static std::mutex m;
+ unsigned num;
+ {
+ std::lock_guard<std::mutex> lock(m);
+ num = r();
+ }
+ if (num % 10 == 0) usleep(num % 1000);
+}
+#endif
+
RpcState::RpcState() {}
RpcState::~RpcState() {}
@@ -57,6 +76,7 @@
}
std::lock_guard<std::mutex> _l(mNodeMutex);
+ if (mTerminated) return DEAD_OBJECT;
// TODO(b/182939933): maybe move address out of BpBinder, and keep binder->address map
// in RpcState
@@ -78,24 +98,50 @@
}
LOG_ALWAYS_FATAL_IF(isRpc, "RPC binder must have known address at this point");
- auto&& [it, inserted] = mNodeForAddress.insert({RpcAddress::unique(),
- BinderNode{
- .binder = binder,
- .timesSent = 1,
- .sentRef = binder,
- }});
- // TODO(b/182939933): better organization could avoid needing this log
- LOG_ALWAYS_FATAL_IF(!inserted);
+ bool forServer = session->server() != nullptr;
- *outAddress = it->first;
- return OK;
+ for (size_t tries = 0; tries < 5; tries++) {
+ auto&& [it, inserted] = mNodeForAddress.insert({RpcAddress::random(forServer),
+ BinderNode{
+ .binder = binder,
+ .timesSent = 1,
+ .sentRef = binder,
+ }});
+ if (inserted) {
+ *outAddress = it->first;
+ return OK;
+ }
+
+ // well, we don't have visibility into the header here, but still
+ static_assert(sizeof(RpcWireAddress) == 40, "this log needs updating");
+ ALOGW("2**256 is 1e77. If you see this log, you probably have some entropy issue, or maybe "
+ "you witness something incredible!");
+ }
+
+ ALOGE("Unable to create an address in order to send out %p", binder.get());
+ return WOULD_BLOCK;
}
-sp<IBinder> RpcState::onBinderEntering(const sp<RpcSession>& session, const RpcAddress& address) {
+status_t RpcState::onBinderEntering(const sp<RpcSession>& session, const RpcAddress& address,
+ sp<IBinder>* out) {
+ // ensure that: if we want to use addresses for something else in the future (for
+ // instance, allowing transitive binder sends), that we don't accidentally
+ // send those addresses to old server. Accidentally ignoring this in that
+ // case and considering the binder to be recognized could cause this
+ // process to accidentally proxy transactions for that binder. Of course,
+ // if we communicate with a binder, it could always be proxying
+ // information. However, we want to make sure that isn't done on accident
+ // by a client.
+ if (!address.isRecognizedType()) {
+ ALOGE("Address is of an unknown type, rejecting: %s", address.toString().c_str());
+ return BAD_VALUE;
+ }
+
std::unique_lock<std::mutex> _l(mNodeMutex);
+ if (mTerminated) return DEAD_OBJECT;
if (auto it = mNodeForAddress.find(address); it != mNodeForAddress.end()) {
- sp<IBinder> binder = it->second.binder.promote();
+ *out = it->second.binder.promote();
// implicitly have strong RPC refcount, since we received this binder
it->second.timesRecd++;
@@ -107,7 +153,15 @@
// immediately, we wait to send the last one in BpBinder::onLastDecStrong.
(void)session->sendDecStrong(address);
- return binder;
+ return OK;
+ }
+
+ // we don't know about this binder, so the other side of the connection
+ // should have created it.
+ if (address.isForServer() == !!session->server()) {
+ ALOGE("Server received unrecognized address which we should own the creation of %s.",
+ address.toString().c_str());
+ return BAD_VALUE;
}
auto&& [it, inserted] = mNodeForAddress.insert({address, BinderNode{}});
@@ -115,10 +169,9 @@
// Currently, all binders are assumed to be part of the same session (no
// device global binders in the RPC world).
- sp<IBinder> binder = BpBinder::create(session, it->first);
- it->second.binder = binder;
+ it->second.binder = *out = BpBinder::create(session, it->first);
it->second.timesRecd = 1;
- return binder;
+ return OK;
}
size_t RpcState::countBinders() {
@@ -128,6 +181,45 @@
void RpcState::dump() {
std::lock_guard<std::mutex> _l(mNodeMutex);
+ dumpLocked();
+}
+
+void RpcState::clear() {
+ std::unique_lock<std::mutex> _l(mNodeMutex);
+
+ if (mTerminated) {
+ LOG_ALWAYS_FATAL_IF(!mNodeForAddress.empty(),
+ "New state should be impossible after terminating!");
+ return;
+ }
+
+ if (SHOULD_LOG_RPC_DETAIL) {
+ ALOGE("RpcState::clear()");
+ dumpLocked();
+ }
+
+ // if the destructor of a binder object makes another RPC call, then calling
+ // decStrong could deadlock. So, we must hold onto these binders until
+ // mNodeMutex is no longer taken.
+ std::vector<sp<IBinder>> tempHoldBinder;
+
+ mTerminated = true;
+ for (auto& [address, node] : mNodeForAddress) {
+ sp<IBinder> binder = node.binder.promote();
+ LOG_ALWAYS_FATAL_IF(binder == nullptr, "Binder %p expected to be owned.", binder.get());
+
+ if (node.sentRef != nullptr) {
+ tempHoldBinder.push_back(node.sentRef);
+ }
+ }
+
+ mNodeForAddress.clear();
+
+ _l.unlock();
+ tempHoldBinder.clear(); // explicit
+}
+
+void RpcState::dumpLocked() {
ALOGE("DUMP OF RpcState %p", this);
ALOGE("DUMP OF RpcState (%zu nodes)", mNodeForAddress.size());
for (const auto& [address, node] : mNodeForAddress) {
@@ -155,32 +247,6 @@
ALOGE("END DUMP OF RpcState");
}
-void RpcState::terminate() {
- if (SHOULD_LOG_RPC_DETAIL) {
- ALOGE("RpcState::terminate()");
- dump();
- }
-
- // if the destructor of a binder object makes another RPC call, then calling
- // decStrong could deadlock. So, we must hold onto these binders until
- // mNodeMutex is no longer taken.
- std::vector<sp<IBinder>> tempHoldBinder;
-
- {
- std::lock_guard<std::mutex> _l(mNodeMutex);
- mTerminated = true;
- for (auto& [address, node] : mNodeForAddress) {
- sp<IBinder> binder = node.binder.promote();
- LOG_ALWAYS_FATAL_IF(binder == nullptr, "Binder %p expected to be owned.", binder.get());
-
- if (node.sentRef != nullptr) {
- tempHoldBinder.push_back(node.sentRef);
- }
- }
-
- mNodeForAddress.clear();
- }
-}
RpcState::CommandData::CommandData(size_t size) : mSize(size) {
// The maximum size for regular binder is 1MB for all concurrent
@@ -203,62 +269,96 @@
mData.reset(new (std::nothrow) uint8_t[size]);
}
-bool RpcState::rpcSend(const base::unique_fd& fd, const char* what, const void* data, size_t size) {
- LOG_RPC_DETAIL("Sending %s on fd %d: %s", what, fd.get(), hexString(data, size).c_str());
+status_t RpcState::rpcSend(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const char* what, const void* data,
+ size_t size) {
+ LOG_RPC_DETAIL("Sending %s on fd %d: %s", what, connection->fd.get(),
+ hexString(data, size).c_str());
if (size > std::numeric_limits<ssize_t>::max()) {
ALOGE("Cannot send %s at size %zu (too big)", what, size);
- terminate();
- return false;
+ (void)session->shutdownAndWait(false);
+ return BAD_VALUE;
}
- ssize_t sent = TEMP_FAILURE_RETRY(send(fd.get(), data, size, MSG_NOSIGNAL));
-
- if (sent < 0 || sent != static_cast<ssize_t>(size)) {
- ALOGE("Failed to send %s (sent %zd of %zu bytes) on fd %d, error: %s", what, sent, size,
- fd.get(), strerror(errno));
-
- terminate();
- return false;
+ if (status_t status = session->mShutdownTrigger->interruptableWriteFully(connection->fd.get(),
+ data, size);
+ status != OK) {
+ LOG_RPC_DETAIL("Failed to write %s (%zu bytes) on fd %d, error: %s", what, size,
+ connection->fd.get(), statusToString(status).c_str());
+ (void)session->shutdownAndWait(false);
+ return status;
}
- return true;
+ return OK;
}
-bool RpcState::rpcRec(const base::unique_fd& fd, const char* what, void* data, size_t size) {
+status_t RpcState::rpcRec(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const char* what, void* data,
+ size_t size) {
if (size > std::numeric_limits<ssize_t>::max()) {
ALOGE("Cannot rec %s at size %zu (too big)", what, size);
- terminate();
- return false;
+ (void)session->shutdownAndWait(false);
+ return BAD_VALUE;
}
- ssize_t recd = TEMP_FAILURE_RETRY(recv(fd.get(), data, size, MSG_WAITALL | MSG_NOSIGNAL));
-
- if (recd < 0 || recd != static_cast<ssize_t>(size)) {
- terminate();
-
- if (recd == 0 && errno == 0) {
- LOG_RPC_DETAIL("No more data when trying to read %s on fd %d", what, fd.get());
- return false;
- }
-
- ALOGE("Failed to read %s (received %zd of %zu bytes) on fd %d, error: %s", what, recd, size,
- fd.get(), strerror(errno));
- return false;
- } else {
- LOG_RPC_DETAIL("Received %s on fd %d: %s", what, fd.get(), hexString(data, size).c_str());
+ if (status_t status =
+ session->mShutdownTrigger->interruptableReadFully(connection->fd.get(), data, size);
+ status != OK) {
+ LOG_RPC_DETAIL("Failed to read %s (%zu bytes) on fd %d, error: %s", what, size,
+ connection->fd.get(), statusToString(status).c_str());
+ return status;
}
- return true;
+ LOG_RPC_DETAIL("Received %s on fd %d: %s", what, connection->fd.get(),
+ hexString(data, size).c_str());
+ return OK;
}
-sp<IBinder> RpcState::getRootObject(const base::unique_fd& fd, const sp<RpcSession>& session) {
+status_t RpcState::readNewSessionResponse(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, uint32_t* version) {
+ RpcNewSessionResponse response;
+ if (status_t status =
+ rpcRec(connection, session, "new session response", &response, sizeof(response));
+ status != OK) {
+ return status;
+ }
+ *version = response.version;
+ return OK;
+}
+
+status_t RpcState::sendConnectionInit(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session) {
+ RpcOutgoingConnectionInit init{
+ .msg = RPC_CONNECTION_INIT_OKAY,
+ };
+ return rpcSend(connection, session, "connection init", &init, sizeof(init));
+}
+
+status_t RpcState::readConnectionInit(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session) {
+ RpcOutgoingConnectionInit init;
+ if (status_t status = rpcRec(connection, session, "connection init", &init, sizeof(init));
+ status != OK)
+ return status;
+
+ static_assert(sizeof(init.msg) == sizeof(RPC_CONNECTION_INIT_OKAY));
+ if (0 != strncmp(init.msg, RPC_CONNECTION_INIT_OKAY, sizeof(init.msg))) {
+ ALOGE("Connection init message unrecognized %.*s", static_cast<int>(sizeof(init.msg)),
+ init.msg);
+ return BAD_VALUE;
+ }
+ return OK;
+}
+
+sp<IBinder> RpcState::getRootObject(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session) {
Parcel data;
data.markForRpc(session);
Parcel reply;
- status_t status = transact(fd, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_ROOT, data, session,
- &reply, 0);
+ status_t status = transactAddress(connection, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_ROOT,
+ data, session, &reply, 0);
if (status != OK) {
ALOGE("Error getting root object: %s", statusToString(status).c_str());
return nullptr;
@@ -267,14 +367,15 @@
return reply.readStrongBinder();
}
-status_t RpcState::getMaxThreads(const base::unique_fd& fd, const sp<RpcSession>& session,
- size_t* maxThreadsOut) {
+status_t RpcState::getMaxThreads(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, size_t* maxThreadsOut) {
Parcel data;
data.markForRpc(session);
Parcel reply;
- status_t status = transact(fd, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_MAX_THREADS, data,
- session, &reply, 0);
+ status_t status =
+ transactAddress(connection, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_MAX_THREADS,
+ data, session, &reply, 0);
if (status != OK) {
ALOGE("Error getting max threads: %s", statusToString(status).c_str());
return status;
@@ -292,44 +393,26 @@
return OK;
}
-status_t RpcState::getSessionId(const base::unique_fd& fd, const sp<RpcSession>& session,
- int32_t* sessionIdOut) {
+status_t RpcState::getSessionId(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, RpcAddress* sessionIdOut) {
Parcel data;
data.markForRpc(session);
Parcel reply;
- status_t status = transact(fd, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_SESSION_ID, data,
- session, &reply, 0);
+ status_t status =
+ transactAddress(connection, RpcAddress::zero(), RPC_SPECIAL_TRANSACT_GET_SESSION_ID,
+ data, session, &reply, 0);
if (status != OK) {
ALOGE("Error getting session ID: %s", statusToString(status).c_str());
return status;
}
- int32_t sessionId;
- status = reply.readInt32(&sessionId);
- if (status != OK) return status;
-
- *sessionIdOut = sessionId;
- return OK;
+ return sessionIdOut->readFromParcel(reply);
}
-status_t RpcState::transact(const base::unique_fd& fd, const RpcAddress& address, uint32_t code,
- const Parcel& data, const sp<RpcSession>& session, Parcel* reply,
- uint32_t flags) {
- uint64_t asyncNumber = 0;
-
- if (!address.isZero()) {
- std::lock_guard<std::mutex> _l(mNodeMutex);
- if (mTerminated) return DEAD_OBJECT; // avoid fatal only, otherwise races
- auto it = mNodeForAddress.find(address);
- LOG_ALWAYS_FATAL_IF(it == mNodeForAddress.end(), "Sending transact on unknown address %s",
- address.toString().c_str());
-
- if (flags & IBinder::FLAG_ONEWAY) {
- asyncNumber = it->second.asyncNumber++;
- }
- }
-
+status_t RpcState::transact(const sp<RpcSession::RpcConnection>& connection,
+ const sp<IBinder>& binder, uint32_t code, const Parcel& data,
+ const sp<RpcSession>& session, Parcel* reply, uint32_t flags) {
if (!data.isForRpc()) {
ALOGE("Refusing to send RPC with parcel not crafted for RPC");
return BAD_TYPE;
@@ -340,45 +423,83 @@
return BAD_TYPE;
}
+ RpcAddress address = RpcAddress::zero();
+ if (status_t status = onBinderLeaving(session, binder, &address); status != OK) return status;
+
+ return transactAddress(connection, address, code, data, session, reply, flags);
+}
+
+status_t RpcState::transactAddress(const sp<RpcSession::RpcConnection>& connection,
+ const RpcAddress& address, uint32_t code, const Parcel& data,
+ const sp<RpcSession>& session, Parcel* reply, uint32_t flags) {
+ LOG_ALWAYS_FATAL_IF(!data.isForRpc());
+ LOG_ALWAYS_FATAL_IF(data.objectsCount() != 0);
+
+ uint64_t asyncNumber = 0;
+
+ if (!address.isZero()) {
+ std::unique_lock<std::mutex> _l(mNodeMutex);
+ if (mTerminated) return DEAD_OBJECT; // avoid fatal only, otherwise races
+ auto it = mNodeForAddress.find(address);
+ LOG_ALWAYS_FATAL_IF(it == mNodeForAddress.end(), "Sending transact on unknown address %s",
+ address.toString().c_str());
+
+ if (flags & IBinder::FLAG_ONEWAY) {
+ asyncNumber = it->second.asyncNumber;
+ if (!nodeProgressAsyncNumber(&it->second)) {
+ _l.unlock();
+ (void)session->shutdownAndWait(false);
+ return DEAD_OBJECT;
+ }
+ }
+ }
+
+ LOG_ALWAYS_FATAL_IF(std::numeric_limits<int32_t>::max() - sizeof(RpcWireHeader) -
+ sizeof(RpcWireTransaction) <
+ data.dataSize(),
+ "Too much data %zu", data.dataSize());
+
+ RpcWireHeader command{
+ .command = RPC_COMMAND_TRANSACT,
+ .bodySize = static_cast<uint32_t>(sizeof(RpcWireTransaction) + data.dataSize()),
+ };
RpcWireTransaction transaction{
.address = address.viewRawEmbedded(),
.code = code,
.flags = flags,
.asyncNumber = asyncNumber,
};
-
- CommandData transactionData(sizeof(RpcWireTransaction) + data.dataSize());
+ CommandData transactionData(sizeof(RpcWireHeader) + sizeof(RpcWireTransaction) +
+ data.dataSize());
if (!transactionData.valid()) {
return NO_MEMORY;
}
- memcpy(transactionData.data() + 0, &transaction, sizeof(RpcWireTransaction));
- memcpy(transactionData.data() + sizeof(RpcWireTransaction), data.data(), data.dataSize());
+ memcpy(transactionData.data() + 0, &command, sizeof(RpcWireHeader));
+ memcpy(transactionData.data() + sizeof(RpcWireHeader), &transaction,
+ sizeof(RpcWireTransaction));
+ memcpy(transactionData.data() + sizeof(RpcWireHeader) + sizeof(RpcWireTransaction), data.data(),
+ data.dataSize());
- if (transactionData.size() > std::numeric_limits<uint32_t>::max()) {
- ALOGE("Transaction size too big %zu", transactionData.size());
- return BAD_VALUE;
- }
-
- RpcWireHeader command{
- .command = RPC_COMMAND_TRANSACT,
- .bodySize = static_cast<uint32_t>(transactionData.size()),
- };
-
- if (!rpcSend(fd, "transact header", &command, sizeof(command))) {
- return DEAD_OBJECT;
- }
- if (!rpcSend(fd, "command body", transactionData.data(), transactionData.size())) {
- return DEAD_OBJECT;
- }
+ if (status_t status = rpcSend(connection, session, "transaction", transactionData.data(),
+ transactionData.size());
+ status != OK)
+ // TODO(b/167966510): need to undo onBinderLeaving - we know the
+ // refcount isn't successfully transferred.
+ return status;
if (flags & IBinder::FLAG_ONEWAY) {
- return OK; // do not wait for result
+ LOG_RPC_DETAIL("Oneway command, so no longer waiting on %d", connection->fd.get());
+
+ // Do not wait on result.
+ // However, too many oneway calls may cause refcounts to build up and fill up the socket,
+ // so process those.
+ return drainCommands(connection, session, CommandType::CONTROL_ONLY);
}
LOG_ALWAYS_FATAL_IF(reply == nullptr, "Reply parcel must be used for synchronous transaction.");
- return waitForReply(fd, session, reply);
+ return waitForReply(connection, session, reply);
}
static void cleanup_reply_data(Parcel* p, const uint8_t* data, size_t dataSize,
@@ -387,36 +508,36 @@
delete[] const_cast<uint8_t*>(data - offsetof(RpcWireReply, data));
(void)dataSize;
LOG_ALWAYS_FATAL_IF(objects != nullptr);
- LOG_ALWAYS_FATAL_IF(objectsCount, 0);
+ LOG_ALWAYS_FATAL_IF(objectsCount != 0, "%zu objects remaining", objectsCount);
}
-status_t RpcState::waitForReply(const base::unique_fd& fd, const sp<RpcSession>& session,
- Parcel* reply) {
+status_t RpcState::waitForReply(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, Parcel* reply) {
RpcWireHeader command;
while (true) {
- if (!rpcRec(fd, "command header", &command, sizeof(command))) {
- return DEAD_OBJECT;
- }
+ if (status_t status =
+ rpcRec(connection, session, "command header", &command, sizeof(command));
+ status != OK)
+ return status;
if (command.command == RPC_COMMAND_REPLY) break;
- status_t status = processServerCommand(fd, session, command);
- if (status != OK) return status;
+ if (status_t status = processCommand(connection, session, command, CommandType::ANY);
+ status != OK)
+ return status;
}
CommandData data(command.bodySize);
- if (!data.valid()) {
- return NO_MEMORY;
- }
+ if (!data.valid()) return NO_MEMORY;
- if (!rpcRec(fd, "reply body", data.data(), command.bodySize)) {
- return DEAD_OBJECT;
- }
+ if (status_t status = rpcRec(connection, session, "reply body", data.data(), command.bodySize);
+ status != OK)
+ return status;
if (command.bodySize < sizeof(RpcWireReply)) {
ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcWireReply. Terminating!",
sizeof(RpcWireReply), command.bodySize);
- terminate();
+ (void)session->shutdownAndWait(false);
return BAD_VALUE;
}
RpcWireReply* rpcReply = reinterpret_cast<RpcWireReply*>(data.data());
@@ -431,7 +552,8 @@
return OK;
}
-status_t RpcState::sendDecStrong(const base::unique_fd& fd, const RpcAddress& addr) {
+status_t RpcState::sendDecStrong(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const RpcAddress& addr) {
{
std::lock_guard<std::mutex> _l(mNodeMutex);
if (mTerminated) return DEAD_OBJECT; // avoid fatal only, otherwise races
@@ -442,39 +564,71 @@
addr.toString().c_str());
it->second.timesRecd--;
- if (it->second.timesRecd == 0 && it->second.timesSent == 0) {
- mNodeForAddress.erase(it);
- }
+ LOG_ALWAYS_FATAL_IF(nullptr != tryEraseNode(it),
+ "Bad state. RpcState shouldn't own received binder");
}
RpcWireHeader cmd = {
.command = RPC_COMMAND_DEC_STRONG,
.bodySize = sizeof(RpcWireAddress),
};
- if (!rpcSend(fd, "dec ref header", &cmd, sizeof(cmd))) return DEAD_OBJECT;
- if (!rpcSend(fd, "dec ref body", &addr.viewRawEmbedded(), sizeof(RpcWireAddress)))
- return DEAD_OBJECT;
+ if (status_t status = rpcSend(connection, session, "dec ref header", &cmd, sizeof(cmd));
+ status != OK)
+ return status;
+ if (status_t status = rpcSend(connection, session, "dec ref body", &addr.viewRawEmbedded(),
+ sizeof(RpcWireAddress));
+ status != OK)
+ return status;
return OK;
}
-status_t RpcState::getAndExecuteCommand(const base::unique_fd& fd, const sp<RpcSession>& session) {
- LOG_RPC_DETAIL("getAndExecuteCommand on fd %d", fd.get());
+status_t RpcState::getAndExecuteCommand(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, CommandType type) {
+ LOG_RPC_DETAIL("getAndExecuteCommand on fd %d", connection->fd.get());
RpcWireHeader command;
- if (!rpcRec(fd, "command header", &command, sizeof(command))) {
- return DEAD_OBJECT;
- }
+ if (status_t status = rpcRec(connection, session, "command header", &command, sizeof(command));
+ status != OK)
+ return status;
- return processServerCommand(fd, session, command);
+ return processCommand(connection, session, command, type);
}
-status_t RpcState::processServerCommand(const base::unique_fd& fd, const sp<RpcSession>& session,
- const RpcWireHeader& command) {
+status_t RpcState::drainCommands(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, CommandType type) {
+ uint8_t buf;
+ while (0 < TEMP_FAILURE_RETRY(
+ recv(connection->fd.get(), &buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT))) {
+ status_t status = getAndExecuteCommand(connection, session, type);
+ if (status != OK) return status;
+ }
+ return OK;
+}
+
+status_t RpcState::processCommand(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const RpcWireHeader& command,
+ CommandType type) {
+ IPCThreadState* kernelBinderState = IPCThreadState::selfOrNull();
+ IPCThreadState::SpGuard spGuard{
+ .address = __builtin_frame_address(0),
+ .context = "processing binder RPC command",
+ };
+ const IPCThreadState::SpGuard* origGuard;
+ if (kernelBinderState != nullptr) {
+ origGuard = kernelBinderState->pushGetCallingSpGuard(&spGuard);
+ }
+ ScopeGuard guardUnguard = [&]() {
+ if (kernelBinderState != nullptr) {
+ kernelBinderState->restoreGetCallingSpGuard(origGuard);
+ }
+ };
+
switch (command.command) {
case RPC_COMMAND_TRANSACT:
- return processTransact(fd, session, command);
+ if (type != CommandType::ANY) return BAD_TYPE;
+ return processTransact(connection, session, command);
case RPC_COMMAND_DEC_STRONG:
- return processDecStrong(fd, command);
+ return processDecStrong(connection, session, command);
}
// We should always know the version of the opposing side, and since the
@@ -483,22 +637,23 @@
// also can't consider it a fatal error because this would allow any client
// to kill us, so ending the session for misbehaving client.
ALOGE("Unknown RPC command %d - terminating session", command.command);
- terminate();
+ (void)session->shutdownAndWait(false);
return DEAD_OBJECT;
}
-status_t RpcState::processTransact(const base::unique_fd& fd, const sp<RpcSession>& session,
- const RpcWireHeader& command) {
+status_t RpcState::processTransact(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const RpcWireHeader& command) {
LOG_ALWAYS_FATAL_IF(command.command != RPC_COMMAND_TRANSACT, "command: %d", command.command);
CommandData transactionData(command.bodySize);
if (!transactionData.valid()) {
return NO_MEMORY;
}
- if (!rpcRec(fd, "transaction body", transactionData.data(), transactionData.size())) {
- return DEAD_OBJECT;
- }
+ if (status_t status = rpcRec(connection, session, "transaction body", transactionData.data(),
+ transactionData.size());
+ status != OK)
+ return status;
- return processTransactInternal(fd, session, std::move(transactionData));
+ return processTransactInternal(connection, session, std::move(transactionData));
}
static void do_nothing_to_transact_data(Parcel* p, const uint8_t* data, size_t dataSize,
@@ -510,12 +665,19 @@
(void)objectsCount;
}
-status_t RpcState::processTransactInternal(const base::unique_fd& fd, const sp<RpcSession>& session,
+status_t RpcState::processTransactInternal(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session,
CommandData transactionData) {
+ // for 'recursive' calls to this, we have already read and processed the
+ // binder from the transaction data and taken reference counts into account,
+ // so it is cached here.
+ sp<IBinder> targetRef;
+processTransactInternalTailCall:
+
if (transactionData.size() < sizeof(RpcWireTransaction)) {
ALOGE("Expecting %zu but got %zu bytes for RpcWireTransaction. Terminating!",
sizeof(RpcWireTransaction), transactionData.size());
- terminate();
+ (void)session->shutdownAndWait(false);
return BAD_VALUE;
}
RpcWireTransaction* transaction = reinterpret_cast<RpcWireTransaction*>(transactionData.data());
@@ -523,49 +685,73 @@
// TODO(b/182939933): heap allocation just for lookup in mNodeForAddress,
// maybe add an RpcAddress 'view' if the type remains 'heavy'
auto addr = RpcAddress::fromRawEmbedded(&transaction->address);
+ bool oneway = transaction->flags & IBinder::FLAG_ONEWAY;
status_t replyStatus = OK;
sp<IBinder> target;
if (!addr.isZero()) {
- std::lock_guard<std::mutex> _l(mNodeMutex);
-
- auto it = mNodeForAddress.find(addr);
- if (it == mNodeForAddress.end()) {
- ALOGE("Unknown binder address %s.", addr.toString().c_str());
- replyStatus = BAD_VALUE;
+ if (!targetRef) {
+ replyStatus = onBinderEntering(session, addr, &target);
} else {
- target = it->second.binder.promote();
- if (target == nullptr) {
- // This can happen if the binder is remote in this process, and
- // another thread has called the last decStrong on this binder.
- // However, for local binders, it indicates a misbehaving client
- // (any binder which is being transacted on should be holding a
- // strong ref count), so in either case, terminating the
- // session.
- ALOGE("While transacting, binder has been deleted at address %s. Terminating!",
+ target = targetRef;
+ }
+
+ if (replyStatus != OK) {
+ // do nothing
+ } else if (target == nullptr) {
+ // This can happen if the binder is remote in this process, and
+ // another thread has called the last decStrong on this binder.
+ // However, for local binders, it indicates a misbehaving client
+ // (any binder which is being transacted on should be holding a
+ // strong ref count), so in either case, terminating the
+ // session.
+ ALOGE("While transacting, binder has been deleted at address %s. Terminating!",
+ addr.toString().c_str());
+ (void)session->shutdownAndWait(false);
+ replyStatus = BAD_VALUE;
+ } else if (target->localBinder() == nullptr) {
+ ALOGE("Unknown binder address or non-local binder, not address %s. Terminating!",
+ addr.toString().c_str());
+ (void)session->shutdownAndWait(false);
+ replyStatus = BAD_VALUE;
+ } else if (oneway) {
+ std::unique_lock<std::mutex> _l(mNodeMutex);
+ auto it = mNodeForAddress.find(addr);
+ if (it->second.binder.promote() != target) {
+ ALOGE("Binder became invalid during transaction. Bad client? %s",
addr.toString().c_str());
- terminate();
replyStatus = BAD_VALUE;
- } else if (target->localBinder() == nullptr) {
- ALOGE("Transactions can only go to local binders, not address %s. Terminating!",
- addr.toString().c_str());
- terminate();
- replyStatus = BAD_VALUE;
- } else if (transaction->flags & IBinder::FLAG_ONEWAY) {
- if (transaction->asyncNumber != it->second.asyncNumber) {
- // we need to process some other asynchronous transaction
- // first
- // TODO(b/183140903): limit enqueues/detect overfill for bad client
- // TODO(b/183140903): detect when an object is deleted when it still has
- // pending async transactions
- it->second.asyncTodo.push(BinderNode::AsyncTodo{
- .data = std::move(transactionData),
- .asyncNumber = transaction->asyncNumber,
- });
- LOG_RPC_DETAIL("Enqueuing %" PRId64 " on %s", transaction->asyncNumber,
- addr.toString().c_str());
- return OK;
+ } else if (transaction->asyncNumber != it->second.asyncNumber) {
+ // we need to process some other asynchronous transaction
+ // first
+ it->second.asyncTodo.push(BinderNode::AsyncTodo{
+ .ref = target,
+ .data = std::move(transactionData),
+ .asyncNumber = transaction->asyncNumber,
+ });
+
+ size_t numPending = it->second.asyncTodo.size();
+ LOG_RPC_DETAIL("Enqueuing %" PRId64 " on %s (%zu pending)",
+ transaction->asyncNumber, addr.toString().c_str(), numPending);
+
+ constexpr size_t kArbitraryOnewayCallTerminateLevel = 10000;
+ constexpr size_t kArbitraryOnewayCallWarnLevel = 1000;
+ constexpr size_t kArbitraryOnewayCallWarnPer = 1000;
+
+ if (numPending >= kArbitraryOnewayCallWarnLevel) {
+ if (numPending >= kArbitraryOnewayCallTerminateLevel) {
+ ALOGE("WARNING: %zu pending oneway transactions. Terminating!", numPending);
+ _l.unlock();
+ (void)session->shutdownAndWait(false);
+ return FAILED_TRANSACTION;
+ }
+
+ if (numPending % kArbitraryOnewayCallWarnPer == 0) {
+ ALOGW("Warning: many oneway transactions built up on %p (%zu)",
+ target.get(), numPending);
+ }
}
+ return OK;
}
}
}
@@ -585,43 +771,48 @@
data.markForRpc(session);
if (target) {
+ bool origAllowNested = connection->allowNested;
+ connection->allowNested = !oneway;
+
replyStatus = target->transact(transaction->code, data, &reply, transaction->flags);
+
+ connection->allowNested = origAllowNested;
} else {
LOG_RPC_DETAIL("Got special transaction %u", transaction->code);
- sp<RpcServer> server = session->server().promote();
- if (server) {
- // special case for 'zero' address (special server commands)
- switch (transaction->code) {
- case RPC_SPECIAL_TRANSACT_GET_ROOT: {
- replyStatus = reply.writeStrongBinder(server->getRootObject());
- break;
- }
- case RPC_SPECIAL_TRANSACT_GET_MAX_THREADS: {
- replyStatus = reply.writeInt32(server->getMaxThreads());
- break;
- }
- case RPC_SPECIAL_TRANSACT_GET_SESSION_ID: {
- // only sessions w/ services can be the source of a
- // session ID (so still guarded by non-null server)
- //
- // sessions associated with servers must have an ID
- // (hence abort)
- int32_t id = session->getPrivateAccessorForId().get().value();
- replyStatus = reply.writeInt32(id);
- break;
- }
- default: {
- replyStatus = UNKNOWN_TRANSACTION;
+ switch (transaction->code) {
+ case RPC_SPECIAL_TRANSACT_GET_MAX_THREADS: {
+ replyStatus = reply.writeInt32(session->getMaxThreads());
+ break;
+ }
+ case RPC_SPECIAL_TRANSACT_GET_SESSION_ID: {
+ // for client connections, this should always report the value
+ // originally returned from the server, so this is asserting
+ // that it exists
+ replyStatus = session->mId.value().writeToParcel(&reply);
+ break;
+ }
+ default: {
+ sp<RpcServer> server = session->server();
+ if (server) {
+ switch (transaction->code) {
+ case RPC_SPECIAL_TRANSACT_GET_ROOT: {
+ replyStatus = reply.writeStrongBinder(server->getRootObject());
+ break;
+ }
+ default: {
+ replyStatus = UNKNOWN_TRANSACTION;
+ }
+ }
+ } else {
+ ALOGE("Special command sent, but no server object attached.");
}
}
- } else {
- ALOGE("Special command sent, but no server object attached.");
}
}
}
- if (transaction->flags & IBinder::FLAG_ONEWAY) {
+ if (oneway) {
if (replyStatus != OK) {
ALOGW("Oneway call failed with error: %d", replyStatus);
}
@@ -645,13 +836,11 @@
// last refcount dropped after this transaction happened
if (it == mNodeForAddress.end()) return OK;
- // note - only updated now, instead of later, so that other threads
- // will queue any later transactions
-
- // TODO(b/183140903): support > 2**64 async transactions
- // (we can do this by allowing asyncNumber to wrap, since we
- // don't expect more than 2**64 simultaneous transactions)
- it->second.asyncNumber++;
+ if (!nodeProgressAsyncNumber(&it->second)) {
+ _l.unlock();
+ (void)session->shutdownAndWait(false);
+ return DEAD_OBJECT;
+ }
if (it->second.asyncTodo.size() == 0) return OK;
if (it->second.asyncTodo.top().asyncNumber == it->second.asyncNumber) {
@@ -659,64 +848,63 @@
it->second.asyncNumber, addr.toString().c_str());
// justification for const_cast (consider avoiding priority_queue):
- // - AsyncTodo operator< doesn't depend on 'data' object
+ // - AsyncTodo operator< doesn't depend on 'data' or 'ref' objects
// - gotta go fast
- CommandData data = std::move(
- const_cast<BinderNode::AsyncTodo&>(it->second.asyncTodo.top()).data);
+ auto& todo = const_cast<BinderNode::AsyncTodo&>(it->second.asyncTodo.top());
+
+ // reset up arguments
+ transactionData = std::move(todo.data);
+ targetRef = std::move(todo.ref);
+
it->second.asyncTodo.pop();
- _l.unlock();
- return processTransactInternal(fd, session, std::move(data));
+ goto processTransactInternalTailCall;
}
}
return OK;
}
+ LOG_ALWAYS_FATAL_IF(std::numeric_limits<int32_t>::max() - sizeof(RpcWireHeader) -
+ sizeof(RpcWireReply) <
+ reply.dataSize(),
+ "Too much data for reply %zu", reply.dataSize());
+
+ RpcWireHeader cmdReply{
+ .command = RPC_COMMAND_REPLY,
+ .bodySize = static_cast<uint32_t>(sizeof(RpcWireReply) + reply.dataSize()),
+ };
RpcWireReply rpcReply{
.status = replyStatus,
};
- CommandData replyData(sizeof(RpcWireReply) + reply.dataSize());
+ CommandData replyData(sizeof(RpcWireHeader) + sizeof(RpcWireReply) + reply.dataSize());
if (!replyData.valid()) {
return NO_MEMORY;
}
- memcpy(replyData.data() + 0, &rpcReply, sizeof(RpcWireReply));
- memcpy(replyData.data() + sizeof(RpcWireReply), reply.data(), reply.dataSize());
+ memcpy(replyData.data() + 0, &cmdReply, sizeof(RpcWireHeader));
+ memcpy(replyData.data() + sizeof(RpcWireHeader), &rpcReply, sizeof(RpcWireReply));
+ memcpy(replyData.data() + sizeof(RpcWireHeader) + sizeof(RpcWireReply), reply.data(),
+ reply.dataSize());
- if (replyData.size() > std::numeric_limits<uint32_t>::max()) {
- ALOGE("Reply size too big %zu", transactionData.size());
- terminate();
- return BAD_VALUE;
- }
-
- RpcWireHeader cmdReply{
- .command = RPC_COMMAND_REPLY,
- .bodySize = static_cast<uint32_t>(replyData.size()),
- };
-
- if (!rpcSend(fd, "reply header", &cmdReply, sizeof(RpcWireHeader))) {
- return DEAD_OBJECT;
- }
- if (!rpcSend(fd, "reply body", replyData.data(), replyData.size())) {
- return DEAD_OBJECT;
- }
- return OK;
+ return rpcSend(connection, session, "reply", replyData.data(), replyData.size());
}
-status_t RpcState::processDecStrong(const base::unique_fd& fd, const RpcWireHeader& command) {
+status_t RpcState::processDecStrong(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const RpcWireHeader& command) {
LOG_ALWAYS_FATAL_IF(command.command != RPC_COMMAND_DEC_STRONG, "command: %d", command.command);
CommandData commandData(command.bodySize);
if (!commandData.valid()) {
return NO_MEMORY;
}
- if (!rpcRec(fd, "dec ref body", commandData.data(), commandData.size())) {
- return DEAD_OBJECT;
- }
+ if (status_t status =
+ rpcRec(connection, session, "dec ref body", commandData.data(), commandData.size());
+ status != OK)
+ return status;
if (command.bodySize < sizeof(RpcWireAddress)) {
ALOGE("Expecting %zu but got %" PRId32 " bytes for RpcWireAddress. Terminating!",
sizeof(RpcWireAddress), command.bodySize);
- terminate();
+ (void)session->shutdownAndWait(false);
return BAD_VALUE;
}
RpcWireAddress* address = reinterpret_cast<RpcWireAddress*>(commandData.data());
@@ -734,7 +922,8 @@
if (target == nullptr) {
ALOGE("While requesting dec strong, binder has been deleted at address %s. Terminating!",
addr.toString().c_str());
- terminate();
+ _l.unlock();
+ (void)session->shutdownAndWait(false);
return BAD_VALUE;
}
@@ -746,22 +935,39 @@
LOG_ALWAYS_FATAL_IF(it->second.sentRef == nullptr, "Inconsistent state, lost ref for %s",
addr.toString().c_str());
- sp<IBinder> tempHold;
-
it->second.timesSent--;
- if (it->second.timesSent == 0) {
- tempHold = it->second.sentRef;
- it->second.sentRef = nullptr;
-
- if (it->second.timesRecd == 0) {
- mNodeForAddress.erase(it);
- }
- }
-
+ sp<IBinder> tempHold = tryEraseNode(it);
_l.unlock();
tempHold = nullptr; // destructor may make binder calls on this session
return OK;
}
+sp<IBinder> RpcState::tryEraseNode(std::map<RpcAddress, BinderNode>::iterator& it) {
+ sp<IBinder> ref;
+
+ if (it->second.timesSent == 0) {
+ ref = std::move(it->second.sentRef);
+
+ if (it->second.timesRecd == 0) {
+ LOG_ALWAYS_FATAL_IF(!it->second.asyncTodo.empty(),
+ "Can't delete binder w/ pending async transactions");
+ mNodeForAddress.erase(it);
+ }
+ }
+
+ return ref;
+}
+
+bool RpcState::nodeProgressAsyncNumber(BinderNode* node) {
+ // 2**64 =~ 10**19 =~ 1000 transactions per second for 585 million years to
+ // a single binder
+ if (node->asyncNumber >= std::numeric_limits<decltype(node->asyncNumber)>::max()) {
+ ALOGE("Out of async transaction IDs. Terminating");
+ return false;
+ }
+ node->asyncNumber++;
+ return true;
+}
+
} // namespace android
diff --git a/libs/binder/RpcState.h b/libs/binder/RpcState.h
index 31f8a22..1446eec 100644
--- a/libs/binder/RpcState.h
+++ b/libs/binder/RpcState.h
@@ -42,6 +42,15 @@
#define LOG_RPC_DETAIL(...) ALOGV(__VA_ARGS__) // for type checking
#endif
+#define RPC_FLAKE_PRONE false
+
+#if RPC_FLAKE_PRONE
+void rpcMaybeWaitToFlake();
+#define MAYBE_WAIT_IN_FLAKE_MODE rpcMaybeWaitToFlake()
+#else
+#define MAYBE_WAIT_IN_FLAKE_MODE do {} while (false)
+#endif
+
/**
* Abstracts away management of ref counts and the wire format from
* RpcSession
@@ -51,19 +60,39 @@
RpcState();
~RpcState();
- // TODO(b/182940634): combine some special transactions into one "getServerInfo" call?
- sp<IBinder> getRootObject(const base::unique_fd& fd, const sp<RpcSession>& session);
- status_t getMaxThreads(const base::unique_fd& fd, const sp<RpcSession>& session,
- size_t* maxThreadsOut);
- status_t getSessionId(const base::unique_fd& fd, const sp<RpcSession>& session,
- int32_t* sessionIdOut);
+ status_t readNewSessionResponse(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, uint32_t* version);
+ status_t sendConnectionInit(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session);
+ status_t readConnectionInit(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session);
- [[nodiscard]] status_t transact(const base::unique_fd& fd, const RpcAddress& address,
- uint32_t code, const Parcel& data,
+ // TODO(b/182940634): combine some special transactions into one "getServerInfo" call?
+ sp<IBinder> getRootObject(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session);
+ status_t getMaxThreads(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, size_t* maxThreadsOut);
+ status_t getSessionId(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, RpcAddress* sessionIdOut);
+
+ [[nodiscard]] status_t transact(const sp<RpcSession::RpcConnection>& connection,
+ const sp<IBinder>& address, uint32_t code, const Parcel& data,
const sp<RpcSession>& session, Parcel* reply, uint32_t flags);
- [[nodiscard]] status_t sendDecStrong(const base::unique_fd& fd, const RpcAddress& address);
- [[nodiscard]] status_t getAndExecuteCommand(const base::unique_fd& fd,
- const sp<RpcSession>& session);
+ [[nodiscard]] status_t transactAddress(const sp<RpcSession::RpcConnection>& connection,
+ const RpcAddress& address, uint32_t code,
+ const Parcel& data, const sp<RpcSession>& session,
+ Parcel* reply, uint32_t flags);
+ [[nodiscard]] status_t sendDecStrong(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const RpcAddress& address);
+
+ enum class CommandType {
+ ANY,
+ CONTROL_ONLY,
+ };
+ [[nodiscard]] status_t getAndExecuteCommand(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, CommandType type);
+ [[nodiscard]] status_t drainCommands(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, CommandType type);
/**
* Called by Parcel for outgoing binders. This implies one refcount of
@@ -77,12 +106,12 @@
* to the process, if this process already has one, or it takes ownership of
* that refcount
*/
- sp<IBinder> onBinderEntering(const sp<RpcSession>& session, const RpcAddress& address);
+ [[nodiscard]] status_t onBinderEntering(const sp<RpcSession>& session,
+ const RpcAddress& address, sp<IBinder>* out);
size_t countBinders();
void dump();
-private:
/**
* Called when reading or writing data to a session fails to clean up
* data associated with the session in order to cleanup binders.
@@ -99,7 +128,10 @@
* WARNING: RpcState is responsible for calling this when the session is
* no longer recoverable.
*/
- void terminate();
+ void clear();
+
+private:
+ void dumpLocked();
// Alternative to std::vector<uint8_t> that doesn't abort on allocation failure and caps
// large allocations to avoid being requested from allocating too much data.
@@ -115,21 +147,26 @@
size_t mSize;
};
- [[nodiscard]] bool rpcSend(const base::unique_fd& fd, const char* what, const void* data,
- size_t size);
- [[nodiscard]] bool rpcRec(const base::unique_fd& fd, const char* what, void* data, size_t size);
+ [[nodiscard]] status_t rpcSend(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const char* what,
+ const void* data, size_t size);
+ [[nodiscard]] status_t rpcRec(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, const char* what, void* data,
+ size_t size);
- [[nodiscard]] status_t waitForReply(const base::unique_fd& fd, const sp<RpcSession>& session,
- Parcel* reply);
- [[nodiscard]] status_t processServerCommand(const base::unique_fd& fd,
- const sp<RpcSession>& session,
- const RpcWireHeader& command);
- [[nodiscard]] status_t processTransact(const base::unique_fd& fd, const sp<RpcSession>& session,
+ [[nodiscard]] status_t waitForReply(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session, Parcel* reply);
+ [[nodiscard]] status_t processCommand(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session,
+ const RpcWireHeader& command, CommandType type);
+ [[nodiscard]] status_t processTransact(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session,
const RpcWireHeader& command);
- [[nodiscard]] status_t processTransactInternal(const base::unique_fd& fd,
+ [[nodiscard]] status_t processTransactInternal(const sp<RpcSession::RpcConnection>& connection,
const sp<RpcSession>& session,
CommandData transactionData);
- [[nodiscard]] status_t processDecStrong(const base::unique_fd& fd,
+ [[nodiscard]] status_t processDecStrong(const sp<RpcSession::RpcConnection>& connection,
+ const sp<RpcSession>& session,
const RpcWireHeader& command);
struct BinderNode {
@@ -163,6 +200,7 @@
// async transaction queue, _only_ for local binder
struct AsyncTodo {
+ sp<IBinder> ref;
CommandData data;
uint64_t asyncNumber = 0;
@@ -179,6 +217,15 @@
// (no additional data specific to remote binders)
};
+ // checks if there is any reference left to a node and erases it. If erase
+ // happens, and there is a strong reference to the binder kept by
+ // binderNode, this returns that strong reference, so that it can be
+ // dropped after any locks are removed.
+ sp<IBinder> tryEraseNode(std::map<RpcAddress, BinderNode>::iterator& it);
+ // true - success
+ // false - session shutdown, halt
+ [[nodiscard]] bool nodeProgressAsyncNumber(BinderNode* node);
+
std::mutex mNodeMutex;
bool mTerminated = false;
// binders known by both sides of a session
diff --git a/libs/binder/RpcWireFormat.h b/libs/binder/RpcWireFormat.h
index c5fa008..0f8efd2 100644
--- a/libs/binder/RpcWireFormat.h
+++ b/libs/binder/RpcWireFormat.h
@@ -20,6 +20,51 @@
#pragma clang diagnostic push
#pragma clang diagnostic error "-Wpadded"
+enum : uint8_t {
+ RPC_CONNECTION_OPTION_INCOMING = 0x1, // default is outgoing
+};
+
+constexpr uint64_t RPC_WIRE_ADDRESS_OPTION_CREATED = 1 << 0; // distinguish from '0' address
+constexpr uint64_t RPC_WIRE_ADDRESS_OPTION_FOR_SERVER = 1 << 1;
+
+struct RpcWireAddress {
+ uint64_t options;
+ uint8_t address[32];
+};
+
+/**
+ * This is sent to an RpcServer in order to request a new connection is created,
+ * either as part of a new session or an existing session
+ */
+struct RpcConnectionHeader {
+ uint32_t version; // maximum supported by caller
+ uint8_t reserver0[4];
+ RpcWireAddress sessionId;
+ uint8_t options;
+ uint8_t reserved1[7];
+};
+
+/**
+ * In response to an RpcConnectionHeader which corresponds to a new session,
+ * this returns information to the server.
+ */
+struct RpcNewSessionResponse {
+ uint32_t version; // maximum supported by callee <= maximum supported by caller
+ uint8_t reserved[4];
+};
+
+#define RPC_CONNECTION_INIT_OKAY "cci"
+
+/**
+ * Whenever a client connection is setup, this is sent as the initial
+ * transaction. The main use of this is in order to control the timing for when
+ * an incoming connection is setup.
+ */
+struct RpcOutgoingConnectionInit {
+ char msg[4];
+ uint8_t reserved[4];
+};
+
enum : uint32_t {
/**
* follows is RpcWireTransaction, if flags != oneway, reply w/ RPC_COMMAND_REPLY expected
@@ -51,8 +96,6 @@
RPC_SPECIAL_TRANSACT_GET_SESSION_ID = 2,
};
-constexpr int32_t RPC_SESSION_ID_NEW = -1;
-
// serialization is like:
// |RpcWireHeader|struct desginated by 'command'| (over and over again)
@@ -63,10 +106,6 @@
uint32_t reserved[2];
};
-struct RpcWireAddress {
- uint8_t address[32];
-};
-
struct RpcWireTransaction {
RpcWireAddress address;
uint32_t code;
diff --git a/libs/binder/ServiceManagerHost.cpp b/libs/binder/ServiceManagerHost.cpp
new file mode 100644
index 0000000..1c2f9b4
--- /dev/null
+++ b/libs/binder/ServiceManagerHost.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ServiceManagerHost.h"
+
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+#include <binder/IServiceManager.h>
+#include <binder/RpcSession.h>
+
+#include "UtilsHost.h"
+
+namespace android {
+
+namespace {
+
+const void* kDeviceServiceExtraId = "DeviceServiceExtra";
+
+// Parse stdout of program execution to string. If any error, return 0.
+unsigned int parsePortNumber(const std::string& out, const std::string& what) {
+ auto trimmed = android::base::Trim(out);
+ unsigned int port = 0;
+ if (!android::base::ParseUint(trimmed, &port)) {
+ int savedErrno = errno;
+ ALOGE("%s is not a valid %s: %s", trimmed.c_str(), what.c_str(), strerror(savedErrno));
+ return 0;
+ }
+ if (port == 0) {
+ ALOGE("0 is not a valid %s", what.c_str());
+ return 0; // explicitly
+ }
+ return port;
+}
+
+// RAII object for adb forwarding
+class AdbForwarder {
+public:
+ AdbForwarder() = default;
+ static std::optional<AdbForwarder> forward(unsigned int devicePort);
+ AdbForwarder(AdbForwarder&& other) noexcept { (*this) = std::move(other); }
+ AdbForwarder& operator=(AdbForwarder&&) noexcept;
+ ~AdbForwarder();
+ [[nodiscard]] const std::optional<unsigned int>& hostPort() const { return mPort; }
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(AdbForwarder);
+ explicit AdbForwarder(unsigned int port) : mPort(port) {}
+ std::optional<unsigned int> mPort;
+};
+std::optional<AdbForwarder> AdbForwarder::forward(unsigned int devicePort) {
+ auto result =
+ execute({"adb", "forward", "tcp:0", "tcp:" + std::to_string(devicePort)}, nullptr);
+ if (!result.ok()) {
+ ALOGE("Unable to run `adb forward tcp:0 tcp:%d`: %s", devicePort,
+ result.error().message().c_str());
+ return std::nullopt;
+ }
+ // Must end with exit code 0 (`has_value() && value() == 0`)
+ if (result->exitCode.value_or(1) != 0) {
+ ALOGE("Unable to run `adb forward tcp:0 tcp:%d`, command exits with %s", devicePort,
+ result->toString().c_str());
+ return std::nullopt;
+ }
+ if (!result->stderr.empty()) {
+ LOG_HOST("`adb forward tcp:0 tcp:%d` writes to stderr: %s", devicePort,
+ result->stderr.c_str());
+ }
+
+ unsigned int hostPort = parsePortNumber(result->stdout, "host port");
+ if (hostPort == 0) return std::nullopt;
+
+ return AdbForwarder(hostPort);
+}
+
+AdbForwarder& AdbForwarder::operator=(AdbForwarder&& other) noexcept {
+ std::swap(mPort, other.mPort);
+ return *this;
+}
+
+AdbForwarder::~AdbForwarder() {
+ if (!mPort.has_value()) return;
+
+ auto result = execute({"adb", "forward", "--remove", "tcp:" + std::to_string(*mPort)}, nullptr);
+ if (!result.ok()) {
+ ALOGE("Unable to run `adb forward --remove tcp:%d`: %s", *mPort,
+ result.error().message().c_str());
+ return;
+ }
+ // Must end with exit code 0 (`has_value() && value() == 0`)
+ if (result->exitCode.value_or(1) != 0) {
+ ALOGE("Unable to run `adb forward --remove tcp:%d`, command exits with %s", *mPort,
+ result->toString().c_str());
+ return;
+ }
+ if (!result->stderr.empty()) {
+ LOG_HOST("`adb forward --remove tcp:%d` writes to stderr: %s", *mPort,
+ result->stderr.c_str());
+ }
+
+ LOG_HOST("Successfully run `adb forward --remove tcp:%d`", *mPort);
+}
+
+void cleanupCommandResult(const void* id, void* obj, void* /* cookie */) {
+ LOG_ALWAYS_FATAL_IF(id != kDeviceServiceExtraId,
+ "cleanupCommandResult invoked with mismatched ID %p, "
+ "expected %p",
+ id, kDeviceServiceExtraId);
+ auto ptr = static_cast<CommandResult*>(obj);
+ delete ptr;
+}
+
+} // namespace
+
+sp<IBinder> getDeviceService(std::vector<std::string>&& serviceDispatcherArgs) {
+ std::vector<std::string> prefix{"adb", "shell", "servicedispatcher"};
+ serviceDispatcherArgs.insert(serviceDispatcherArgs.begin(), prefix.begin(), prefix.end());
+
+ auto result = execute(std::move(serviceDispatcherArgs), &CommandResult::stdoutEndsWithNewLine);
+ if (!result.ok()) {
+ ALOGE("%s", result.error().message().c_str());
+ return nullptr;
+ }
+
+ // `servicedispatcher` process must be alive to keep the port open.
+ if (result->exitCode.has_value()) {
+ ALOGE("Command exits with: %s", result->toString().c_str());
+ return nullptr;
+ }
+ if (!result->stderr.empty()) {
+ LOG_HOST("servicedispatcher writes to stderr: %s", result->stderr.c_str());
+ }
+
+ if (!result->stdoutEndsWithNewLine()) {
+ ALOGE("Unexpected command result: %s", result->toString().c_str());
+ return nullptr;
+ }
+
+ unsigned int devicePort = parsePortNumber(result->stdout, "device port");
+ if (devicePort == 0) return nullptr;
+
+ auto forwardResult = AdbForwarder::forward(devicePort);
+ if (!forwardResult.has_value()) {
+ return nullptr;
+ }
+ LOG_ALWAYS_FATAL_IF(!forwardResult->hostPort().has_value());
+
+ auto rpcSession = RpcSession::make();
+ if (!rpcSession->setupInetClient("127.0.0.1", *forwardResult->hostPort())) {
+ ALOGE("Unable to set up inet client on host port %u", *forwardResult->hostPort());
+ return nullptr;
+ }
+ auto binder = rpcSession->getRootObject();
+ if (binder == nullptr) {
+ ALOGE("RpcSession::getRootObject returns nullptr");
+ return nullptr;
+ }
+
+ LOG_ALWAYS_FATAL_IF(
+ nullptr !=
+ binder->attachObject(kDeviceServiceExtraId,
+ static_cast<void*>(new CommandResult(std::move(*result))), nullptr,
+ &cleanupCommandResult));
+ return binder;
+}
+
+} // namespace android
diff --git a/libs/binder/ServiceManagerHost.h b/libs/binder/ServiceManagerHost.h
new file mode 100644
index 0000000..e59724c
--- /dev/null
+++ b/libs/binder/ServiceManagerHost.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android-base/macros.h>
+#include <android/os/IServiceManager.h>
+
+namespace android {
+
+// Get a service on device by running servicedispatcher with the given args, e.g.
+// getDeviceService({"foo"});
+// Return nullptr on any error.
+// When the returned binder object is destroyed, remove adb forwarding and kills
+// the long-running servicedispatcher process.
+sp<IBinder> getDeviceService(std::vector<std::string>&& serviceDispatcherArgs);
+
+} // namespace android
diff --git a/libs/binder/Stability.cpp b/libs/binder/Stability.cpp
index f12ef4e..2d05fb2 100644
--- a/libs/binder/Stability.cpp
+++ b/libs/binder/Stability.cpp
@@ -23,21 +23,6 @@
namespace android {
namespace internal {
-// the libbinder parcel format is currently unstable
-
-// oldest version which is supported
-constexpr uint8_t kBinderWireFormatOldest = 1;
-// current version
-constexpr uint8_t kBinderWireFormatVersion = 1;
-
-Stability::Category Stability::Category::currentFromLevel(Level level) {
- return {
- .version = kBinderWireFormatVersion,
- .reserved = {0},
- .level = level,
- };
-}
-
void Stability::forceDowngradeToStability(const sp<IBinder>& binder, Level level) {
// Downgrading a remote binder would require also copying the version from
// the binder sent here. In practice though, we don't need to downgrade the
@@ -45,8 +30,7 @@
// what we can do to it.
LOG_ALWAYS_FATAL_IF(!binder || !binder->localBinder(), "Can only downgrade local binder");
- auto stability = Category::currentFromLevel(level);
- status_t result = setRepr(binder.get(), stability.repr(), REPR_LOG | REPR_ALLOW_DOWNGRADE);
+ status_t result = setRepr(binder.get(), level, REPR_LOG | REPR_ALLOW_DOWNGRADE);
LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
}
@@ -62,41 +46,31 @@
forceDowngradeToStability(binder, Level::VENDOR);
}
-std::string Stability::Category::debugString() {
- return levelString(level) + " wire protocol version "
- + std::to_string(version);
-}
-
void Stability::markCompilationUnit(IBinder* binder) {
- auto stability = Category::currentFromLevel(getLocalLevel());
- status_t result = setRepr(binder, stability.repr(), REPR_LOG);
+ status_t result = setRepr(binder, getLocalLevel(), REPR_LOG);
LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
}
void Stability::markVintf(IBinder* binder) {
- auto stability = Category::currentFromLevel(Level::VINTF);
- status_t result = setRepr(binder, stability.repr(), REPR_LOG);
+ status_t result = setRepr(binder, Level::VINTF, REPR_LOG);
LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
}
-void Stability::debugLogStability(const std::string& tag, const sp<IBinder>& binder) {
- auto stability = getCategory(binder.get());
- ALOGE("%s: stability is %s", tag.c_str(), stability.debugString().c_str());
+std::string Stability::debugToString(const sp<IBinder>& binder) {
+ return levelString(getRepr(binder.get()));
}
void Stability::markVndk(IBinder* binder) {
- auto stability = Category::currentFromLevel(Level::VENDOR);
- status_t result = setRepr(binder, stability.repr(), REPR_LOG);
+ status_t result = setRepr(binder, Level::VENDOR, REPR_LOG);
LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
}
bool Stability::requiresVintfDeclaration(const sp<IBinder>& binder) {
- return check(getCategory(binder.get()), Level::VINTF);
+ return check(getRepr(binder.get()), Level::VINTF);
}
void Stability::tryMarkCompilationUnit(IBinder* binder) {
- auto stability = Category::currentFromLevel(getLocalLevel());
- (void) setRepr(binder, stability.repr(), REPR_NONE);
+ (void)setRepr(binder, getLocalLevel(), REPR_NONE);
}
Stability::Level Stability::getLocalLevel() {
@@ -112,92 +86,77 @@
#endif
}
-status_t Stability::setRepr(IBinder* binder, int32_t representation, uint32_t flags) {
+status_t Stability::setRepr(IBinder* binder, int32_t setting, uint32_t flags) {
bool log = flags & REPR_LOG;
bool allowDowngrade = flags & REPR_ALLOW_DOWNGRADE;
- auto current = getCategory(binder);
- auto setting = Category::fromRepr(representation);
-
- // If we have ahold of a binder with a newer declared version, then it
- // should support older versions, and we will simply write our parcels with
- // the current wire parcel format.
- if (setting.version < kBinderWireFormatOldest) {
- // always log, because this shouldn't happen
- ALOGE("Cannot accept binder with older binder wire protocol version "
- "%u. Versions less than %u are unsupported.", setting.version,
- kBinderWireFormatOldest);
- return BAD_TYPE;
- }
+ int16_t current = getRepr(binder);
// null binder is always written w/ 'UNDECLARED' stability
if (binder == nullptr) {
- if (setting.level == UNDECLARED) {
+ if (setting == UNDECLARED) {
return OK;
} else {
if (log) {
- ALOGE("Null binder written with stability %s.",
- levelString(setting.level).c_str());
+ ALOGE("Null binder written with stability %s.", levelString(setting).c_str());
}
return BAD_TYPE;
}
}
- if (!isDeclaredLevel(setting.level)) {
+ if (!isDeclaredLevel(setting)) {
if (log) {
- ALOGE("Can only set known stability, not %u.", setting.level);
+ ALOGE("Can only set known stability, not %d.", setting);
}
return BAD_TYPE;
}
+ Level levelSetting = static_cast<Level>(setting);
if (current == setting) return OK;
- bool hasAlreadyBeenSet = current.repr() != 0;
- bool isAllowedDowngrade = allowDowngrade && check(current, setting.level);
+ bool hasAlreadyBeenSet = current != Level::UNDECLARED;
+ bool isAllowedDowngrade = allowDowngrade && check(current, levelSetting);
if (hasAlreadyBeenSet && !isAllowedDowngrade) {
if (log) {
ALOGE("Interface being set with %s but it is already marked as %s",
- setting.debugString().c_str(),
- current.debugString().c_str());
+ levelString(setting).c_str(), levelString(current).c_str());
}
return BAD_TYPE;
}
if (isAllowedDowngrade) {
- ALOGI("Interface set with %s downgraded to %s stability",
- current.debugString().c_str(),
- setting.debugString().c_str());
+ ALOGI("Interface set with %s downgraded to %s stability", levelString(current).c_str(),
+ levelString(setting).c_str());
}
BBinder* local = binder->localBinder();
if (local != nullptr) {
- local->mStability = setting.repr();
+ local->mStability = setting;
} else {
- binder->remoteBinder()->mStability = setting.repr();
+ binder->remoteBinder()->mStability = setting;
}
return OK;
}
-Stability::Category Stability::getCategory(IBinder* binder) {
+int16_t Stability::getRepr(IBinder* binder) {
if (binder == nullptr) {
- return Category::currentFromLevel(Level::UNDECLARED);
+ return Level::UNDECLARED;
}
BBinder* local = binder->localBinder();
if (local != nullptr) {
- return Category::fromRepr(local->mStability);
+ return local->mStability;
}
- return Category::fromRepr(binder->remoteBinder()->mStability);
+ return binder->remoteBinder()->mStability;
}
-bool Stability::check(Category provided, Level required) {
- bool stable = (provided.level & required) == required;
+bool Stability::check(int16_t provided, Level required) {
+ bool stable = (provided & required) == required;
- if (provided.level != UNDECLARED && !isDeclaredLevel(provided.level)) {
- ALOGE("Unknown stability when checking interface stability %d.",
- provided.level);
+ if (provided != UNDECLARED && !isDeclaredLevel(provided)) {
+ ALOGE("Unknown stability when checking interface stability %d.", provided);
stable = false;
}
@@ -205,11 +164,11 @@
return stable;
}
-bool Stability::isDeclaredLevel(Level stability) {
+bool Stability::isDeclaredLevel(int32_t stability) {
return stability == VENDOR || stability == SYSTEM || stability == VINTF;
}
-std::string Stability::levelString(Level level) {
+std::string Stability::levelString(int32_t level) {
switch (level) {
case Level::UNDECLARED: return "undeclared stability";
case Level::VENDOR: return "vendor stability";
diff --git a/libs/binder/Status.cpp b/libs/binder/Status.cpp
index b5a078c..a44c578 100644
--- a/libs/binder/Status.cpp
+++ b/libs/binder/Status.cpp
@@ -130,13 +130,13 @@
}
// The remote threw an exception. Get the message back.
- String16 message;
+ std::optional<String16> message;
status = parcel.readString16(&message);
if (status != OK) {
setFromStatusT(status);
return status;
}
- mMessage = String8(message);
+ mMessage = String8(message.value_or(String16()));
// Skip over the remote stack trace data
int32_t remote_stack_trace_header_size;
diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING
index 1010a2d..9c5ce67 100644
--- a/libs/binder/TEST_MAPPING
+++ b/libs/binder/TEST_MAPPING
@@ -16,10 +16,13 @@
"name": "binderDriverInterfaceTest"
},
{
+ "name": "binderHostDeviceTest"
+ },
+ {
"name": "binderTextOutputTest"
},
{
- "name": "binderParcelTest"
+ "name": "binderUnitTest"
},
{
"name": "binderLibTest"
@@ -31,6 +34,9 @@
"name": "binderStabilityTest"
},
{
+ "name": "binderUtilsHostTest"
+ },
+ {
"name": "libbinder_ndk_unit_test"
},
{
diff --git a/libs/binder/UtilsHost.cpp b/libs/binder/UtilsHost.cpp
new file mode 100644
index 0000000..d121ce2
--- /dev/null
+++ b/libs/binder/UtilsHost.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "UtilsHost.h"
+
+#include <poll.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <sstream>
+
+#include <log/log.h>
+
+namespace android {
+
+CommandResult::~CommandResult() {
+ if (!pid.has_value()) return;
+ if (*pid == 0) {
+ ALOGW("%s: PID is unexpectedly 0, won't kill it", __PRETTY_FUNCTION__);
+ return;
+ }
+
+ ALOGE_IF(kill(*pid, SIGKILL) != 0, "kill(%d): %s", *pid, strerror(errno));
+
+ while (pid.has_value()) {
+ int status;
+ LOG_HOST("%s: Waiting for PID %d to exit.", __PRETTY_FUNCTION__, *pid);
+ int waitres = waitpid(*pid, &status, 0);
+ if (waitres == -1) {
+ ALOGE("%s: waitpid(%d): %s", __PRETTY_FUNCTION__, *pid, strerror(errno));
+ break;
+ }
+ if (WIFEXITED(status)) {
+ LOG_HOST("%s: PID %d exited.", __PRETTY_FUNCTION__, *pid);
+ pid.reset();
+ } else if (WIFSIGNALED(status)) {
+ LOG_HOST("%s: PID %d terminated by signal %d.", __PRETTY_FUNCTION__, *pid,
+ WTERMSIG(status));
+ pid.reset();
+ } else if (WIFSTOPPED(status)) {
+ ALOGW("%s: pid %d stopped", __PRETTY_FUNCTION__, *pid);
+ } else if (WIFCONTINUED(status)) {
+ ALOGW("%s: pid %d continued", __PRETTY_FUNCTION__, *pid);
+ }
+ }
+}
+
+std::ostream& operator<<(std::ostream& os, const CommandResult& res) {
+ if (res.exitCode) os << "code=" << *res.exitCode;
+ if (res.signal) os << "signal=" << *res.signal;
+ if (res.pid) os << ", pid=" << *res.pid;
+ return os << ", stdout=" << res.stdout << ", stderr=" << res.stderr;
+}
+
+std::string CommandResult::toString() const {
+ std::stringstream ss;
+ ss << (*this);
+ return ss.str();
+}
+
+android::base::Result<CommandResult> execute(std::vector<std::string> argStringVec,
+ const std::function<bool(const CommandResult&)>& end) {
+ // turn vector<string> into null-terminated char* vector.
+ std::vector<char*> argv;
+ argv.reserve(argStringVec.size() + 1);
+ for (auto& arg : argStringVec) argv.push_back(arg.data());
+ argv.push_back(nullptr);
+
+ CommandResult ret;
+ android::base::unique_fd outWrite;
+ if (!android::base::Pipe(&ret.outPipe, &outWrite))
+ return android::base::ErrnoError() << "pipe() for outPipe";
+ android::base::unique_fd errWrite;
+ if (!android::base::Pipe(&ret.errPipe, &errWrite))
+ return android::base::ErrnoError() << "pipe() for errPipe";
+
+ int pid = fork();
+ if (pid == -1) return android::base::ErrnoError() << "fork()";
+ if (pid == 0) {
+ // child
+ ret.outPipe.reset();
+ ret.errPipe.reset();
+
+ int res = TEMP_FAILURE_RETRY(dup2(outWrite.get(), STDOUT_FILENO));
+ LOG_ALWAYS_FATAL_IF(-1 == res, "dup2(outPipe): %s", strerror(errno));
+ outWrite.reset();
+
+ res = TEMP_FAILURE_RETRY(dup2(errWrite.get(), STDERR_FILENO));
+ LOG_ALWAYS_FATAL_IF(-1 == res, "dup2(errPipe): %s", strerror(errno));
+ errWrite.reset();
+
+ execvp(argv[0], argv.data());
+ LOG_ALWAYS_FATAL("execvp() returns");
+ }
+ // parent
+ outWrite.reset();
+ errWrite.reset();
+ ret.pid = pid;
+
+ auto handlePoll = [](android::base::unique_fd* fd, const pollfd* pfd, std::string* s) {
+ if (!fd->ok()) return true;
+ if (pfd->revents & POLLIN) {
+ char buf[1024];
+ ssize_t n = TEMP_FAILURE_RETRY(read(fd->get(), buf, sizeof(buf)));
+ if (n < 0) return false;
+ if (n > 0) *s += std::string_view(buf, n);
+ }
+ if (pfd->revents & POLLHUP) {
+ fd->reset();
+ }
+ return true;
+ };
+
+ // Drain both stdout and stderr. Check end() regularly until both are closed.
+ while (ret.outPipe.ok() || ret.errPipe.ok()) {
+ pollfd fds[2];
+ pollfd *outPollFd = nullptr, *errPollFd = nullptr;
+ memset(fds, 0, sizeof(fds));
+ nfds_t nfds = 0;
+ if (ret.outPipe.ok()) {
+ outPollFd = &fds[nfds++];
+ *outPollFd = {.fd = ret.outPipe.get(), .events = POLLIN};
+ }
+ if (ret.errPipe.ok()) {
+ errPollFd = &fds[nfds++];
+ *errPollFd = {.fd = ret.errPipe.get(), .events = POLLIN};
+ }
+ int pollRet = poll(fds, nfds, 1000 /* ms timeout */);
+ if (pollRet == -1) return android::base::ErrnoError() << "poll()";
+
+ if (!handlePoll(&ret.outPipe, outPollFd, &ret.stdout))
+ return android::base::ErrnoError() << "read(stdout)";
+ if (!handlePoll(&ret.errPipe, errPollFd, &ret.stderr))
+ return android::base::ErrnoError() << "read(stderr)";
+
+ if (end && end(ret)) return ret;
+ }
+
+ // If both stdout and stderr are closed by the subprocess, it may or may not be terminated.
+ while (ret.pid.has_value()) {
+ int status;
+ auto exitPid = waitpid(pid, &status, 0);
+ if (exitPid == -1) return android::base::ErrnoError() << "waitpid(" << pid << ")";
+ if (exitPid == pid) {
+ if (WIFEXITED(status)) {
+ ret.pid = std::nullopt;
+ ret.exitCode = WEXITSTATUS(status);
+ } else if (WIFSIGNALED(status)) {
+ ret.pid = std::nullopt;
+ ret.signal = WTERMSIG(status);
+ } else if (WIFSTOPPED(status)) {
+ ALOGW("%s: pid %d stopped", __PRETTY_FUNCTION__, *ret.pid);
+ } else if (WIFCONTINUED(status)) {
+ ALOGW("%s: pid %d continued", __PRETTY_FUNCTION__, *ret.pid);
+ }
+ }
+ // ret is not changed unless the process is terminated (where pid == nullopt). Hence there
+ // is no need to check the predicate `end(ret)`.
+ }
+
+ return ret;
+}
+} // namespace android
diff --git a/libs/binder/UtilsHost.h b/libs/binder/UtilsHost.h
new file mode 100644
index 0000000..0f29f60
--- /dev/null
+++ b/libs/binder/UtilsHost.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <optional>
+#include <ostream>
+#include <string>
+#include <variant>
+#include <vector>
+
+#include <android-base/macros.h>
+#include <android-base/result.h>
+#include <android-base/unique_fd.h>
+
+/**
+ * Log a lot more information about host-device binder communication, when debugging issues.
+ */
+#define SHOULD_LOG_HOST false
+
+#if SHOULD_LOG_HOST
+#define LOG_HOST(...) ALOGI(__VA_ARGS__)
+#else
+#define LOG_HOST(...) ALOGV(__VA_ARGS__) // for type checking
+#endif
+
+namespace android {
+
+struct CommandResult {
+ std::optional<int32_t> exitCode;
+ std::optional<int32_t> signal;
+ std::optional<pid_t> pid;
+ std::string stdout;
+ std::string stderr;
+
+ android::base::unique_fd outPipe;
+ android::base::unique_fd errPipe;
+
+ CommandResult() = default;
+ CommandResult(CommandResult&& other) noexcept { (*this) = std::move(other); }
+ CommandResult& operator=(CommandResult&& other) noexcept {
+ std::swap(exitCode, other.exitCode);
+ std::swap(signal, other.signal);
+ std::swap(pid, other.pid);
+ std::swap(stdout, other.stdout);
+ std::swap(stderr, other.stderr);
+ return *this;
+ }
+ ~CommandResult();
+ [[nodiscard]] std::string toString() const;
+
+ [[nodiscard]] bool stdoutEndsWithNewLine() const {
+ return !stdout.empty() && stdout.back() == '\n';
+ }
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(CommandResult);
+};
+
+std::ostream& operator<<(std::ostream& os, const CommandResult& res);
+
+// Execute a command using tokens specified in @a argStringVec.
+//
+// @a end is a predicate checked periodically when the command emits any output to stdout or
+// stderr. When it is evaluated to true, the function returns immediately even though
+// the child process has not been terminated. The function also assumes that, after @a end
+// is evaluated to true, the child process does not emit any other messages.
+// If this is not the case, caller to execute() must handle these I/O in the pipes in the returned
+// CommandResult object. Otherwise the child program may hang on I/O.
+//
+// If @a end is nullptr, it is equivalent to a predicate that always returns false. In this
+// case, execute() returns after the child process is terminated.
+//
+// If @a end is evaluated to true, and execute() returns with the child process running,
+// the returned CommandResult has pid, outPipe, and errPipe set. In this case, the caller is
+// responsible for holding the returned CommandResult. When the CommandResult object is destroyed,
+// the child process is killed.
+//
+// On the other hand, execute() returns with the child process terminated, either exitCode or signal
+// is set.
+//
+// If the parent process has encountered any errors for system calls, return ExecuteError with
+// the proper errno set.
+android::base::Result<CommandResult> execute(std::vector<std::string> argStringVec,
+ const std::function<bool(const CommandResult&)>& end);
+} // namespace android
diff --git a/libs/binder/include/binder/Binder.h b/libs/binder/include/binder/Binder.h
index 7e9be41..46223bb 100644
--- a/libs/binder/include/binder/Binder.h
+++ b/libs/binder/include/binder/Binder.h
@@ -54,12 +54,11 @@
uint32_t flags = 0,
wp<DeathRecipient>* outRecipient = nullptr);
- virtual void attachObject( const void* objectID,
- void* object,
- void* cleanupCookie,
- object_cleanup_func func) final;
+ virtual void* attachObject(const void* objectID, void* object, void* cleanupCookie,
+ object_cleanup_func func) final;
virtual void* findObject(const void* objectID) const final;
- virtual void detachObject(const void* objectID) final;
+ virtual void* detachObject(const void* objectID) final;
+ void withLock(const std::function<void()>& doWithLock);
virtual BBinder* localBinder();
@@ -94,6 +93,16 @@
pid_t getDebugPid();
+ // Whether this binder has been sent to another process.
+ bool wasParceled();
+ // Consider this binder as parceled (setup/init-related calls should no
+ // longer by called. This is automatically set by when this binder is sent
+ // to another process.
+ void setParceled();
+
+ [[nodiscard]] status_t setRpcClientDebug(android::base::unique_fd clientFd,
+ const sp<IBinder>& keepAliveBinder);
+
protected:
virtual ~BBinder();
@@ -107,17 +116,24 @@
BBinder(const BBinder& o);
BBinder& operator=(const BBinder& o);
+ class RpcServerLink;
class Extras;
Extras* getOrCreateExtras();
+ [[nodiscard]] status_t setRpcClientDebug(const Parcel& data);
+ void removeRpcServerLink(const sp<RpcServerLink>& link);
+
std::atomic<Extras*> mExtras;
friend ::android::internal::Stability;
- union {
- int32_t mStability;
- void* mReserved0;
- };
+ int16_t mStability;
+ bool mParceled;
+ uint8_t mReserved0;
+
+#ifdef __LP64__
+ int32_t mReserved1;
+#endif
};
// ---------------------------------------------------------------------------
diff --git a/libs/binder/include/binder/BinderService.h b/libs/binder/include/binder/BinderService.h
index 5776f3c..e58d489 100644
--- a/libs/binder/include/binder/BinderService.h
+++ b/libs/binder/include/binder/BinderService.h
@@ -26,6 +26,24 @@
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
+// WARNING: deprecated - DO NOT USE - prefer to setup service directly.
+//
+// This class embellishes a class with a few static methods which can be used in
+// limited circumstances (when one service needs to be registered and
+// published). However, this is an anti-pattern:
+// - these methods are aliases of existing methods, and as such, represent an
+// incremental amount of information required to understand the system but
+// which does not actually save in terms of lines of code. For instance, users
+// of this class should be surprised to know that this will start up to 16
+// threads in the binder threadpool.
+// - the template instantiation costs need to be paid, even though everything
+// done here is generic.
+// - the getServiceName API here is undocumented and non-local (for instance,
+// this unnecessarily assumes a single service type will only be instantiated
+// once with no arguments).
+//
+// So, DO NOT USE.
+
// ---------------------------------------------------------------------------
namespace android {
diff --git a/libs/binder/include/binder/BpBinder.h b/libs/binder/include/binder/BpBinder.h
index 61bf018..c69bb9e 100644
--- a/libs/binder/include/binder/BpBinder.h
+++ b/libs/binder/include/binder/BpBinder.h
@@ -72,12 +72,11 @@
uint32_t flags = 0,
wp<DeathRecipient>* outRecipient = nullptr);
- virtual void attachObject( const void* objectID,
- void* object,
- void* cleanupCookie,
- object_cleanup_func func) final;
+ virtual void* attachObject(const void* objectID, void* object, void* cleanupCookie,
+ object_cleanup_func func) final;
virtual void* findObject(const void* objectID) const final;
- virtual void detachObject(const void* objectID) final;
+ virtual void* detachObject(const void* objectID) final;
+ void withLock(const std::function<void()>& doWithLock);
virtual BpBinder* remoteBinder();
@@ -91,27 +90,23 @@
static void setLimitCallback(binder_proxy_limit_callback cb);
static void setBinderProxyCountWatermarks(int high, int low);
- class ObjectManager
- {
+ class ObjectManager {
public:
- ObjectManager();
- ~ObjectManager();
+ ObjectManager();
+ ~ObjectManager();
- void attach( const void* objectID,
- void* object,
- void* cleanupCookie,
- IBinder::object_cleanup_func func);
- void* find(const void* objectID) const;
- void detach(const void* objectID);
+ void* attach(const void* objectID, void* object, void* cleanupCookie,
+ IBinder::object_cleanup_func func);
+ void* find(const void* objectID) const;
+ void* detach(const void* objectID);
- void kill();
+ void kill();
private:
- ObjectManager(const ObjectManager&);
+ ObjectManager(const ObjectManager&);
ObjectManager& operator=(const ObjectManager&);
- struct entry_t
- {
+ struct entry_t {
void* object;
void* cleanupCookie;
IBinder::object_cleanup_func func;
diff --git a/libs/binder/include/binder/IBinder.h b/libs/binder/include/binder/IBinder.h
index 97c826c..43fc5ff 100644
--- a/libs/binder/include/binder/IBinder.h
+++ b/libs/binder/include/binder/IBinder.h
@@ -22,6 +22,8 @@
#include <utils/String16.h>
#include <utils/Vector.h>
+#include <functional>
+
// linux/binder.h defines this, but we don't want to include it here in order to
// avoid exporting the kernel headers
#ifndef B_PACK_CHARS
@@ -60,6 +62,7 @@
SYSPROPS_TRANSACTION = B_PACK_CHARS('_', 'S', 'P', 'R'),
EXTENSION_TRANSACTION = B_PACK_CHARS('_', 'E', 'X', 'T'),
DEBUG_PID_TRANSACTION = B_PACK_CHARS('_', 'P', 'I', 'D'),
+ SET_RPC_CLIENT_TRANSACTION = B_PACK_CHARS('_', 'R', 'P', 'C'),
// See android.os.IBinder.TWEET_TRANSACTION
// Most importantly, messages can be anything not exceeding 130 UTF-8
@@ -152,6 +155,27 @@
*/
status_t getDebugPid(pid_t* outPid);
+ /**
+ * Set the RPC client fd to this binder service, for debugging. This is only available on
+ * debuggable builds.
+ *
+ * When this is called on a binder service, the service:
+ * 1. sets up RPC server
+ * 2. spawns 1 new thread that calls RpcServer::join()
+ * - join() spawns some number of threads that accept() connections; see RpcServer
+ *
+ * setRpcClientDebug() may be called multiple times. Each call will add a new RpcServer
+ * and opens up a TCP port.
+ *
+ * Note: A thread is spawned for each accept()'ed fd, which may call into functions of the
+ * interface freely. See RpcServer::join(). To avoid such race conditions, implement the service
+ * functions with multithreading support.
+ *
+ * On death of @a keepAliveBinder, the RpcServer shuts down.
+ */
+ [[nodiscard]] status_t setRpcClientDebug(android::base::unique_fd socketFd,
+ const sp<IBinder>& keepAliveBinder);
+
// NOLINTNEXTLINE(google-default-arguments)
virtual status_t transact( uint32_t code,
const Parcel& data,
@@ -233,26 +257,30 @@
* objects are invoked with their respective objectID, object, and
* cleanupCookie. Access to these APIs can be made from multiple threads,
* but calls from different threads are allowed to be interleaved.
+ *
+ * This returns the object which is already attached. If this returns a
+ * non-null value, it means that attachObject failed (a given objectID can
+ * only be used once).
*/
- virtual void attachObject( const void* objectID,
- void* object,
- void* cleanupCookie,
- object_cleanup_func func) = 0;
+ [[nodiscard]] virtual void* attachObject(const void* objectID, void* object,
+ void* cleanupCookie, object_cleanup_func func) = 0;
/**
* Returns object attached with attachObject.
*/
- virtual void* findObject(const void* objectID) const = 0;
+ [[nodiscard]] virtual void* findObject(const void* objectID) const = 0;
/**
- * WARNING: this API does not call the cleanup function for legacy reasons.
- * It also does not return void* for legacy reasons. If you need to detach
- * an object and destroy it, there are two options:
- * - if you can, don't call detachObject and instead wait for the destructor
- * to clean it up.
- * - manually retrieve and destruct the object (if multiple of your threads
- * are accessing these APIs, you must guarantee that attachObject isn't
- * called after findObject and before detachObject is called).
+ * Returns object attached with attachObject, and detaches it. This does not
+ * delete the object.
*/
- virtual void detachObject(const void* objectID) = 0;
+ [[nodiscard]] virtual void* detachObject(const void* objectID) = 0;
+
+ /**
+ * Use the lock that this binder contains internally. For instance, this can
+ * be used to modify an attached object without needing to add an additional
+ * lock (though, that attached object must be retrieved before calling this
+ * method). Calling (most) IBinder methods inside this will deadlock.
+ */
+ void withLock(const std::function<void()>& doWithLock);
virtual BBinder* localBinder();
virtual BpBinder* remoteBinder();
diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h
index 196a41b..20a9f36 100644
--- a/libs/binder/include/binder/IPCThreadState.h
+++ b/libs/binder/include/binder/IPCThreadState.h
@@ -62,7 +62,7 @@
* call. If not in a binder call, this will return getpid. If the
* call is oneway, this will return 0.
*/
- pid_t getCallingPid() const;
+ [[nodiscard]] pid_t getCallingPid() const;
/**
* Returns the SELinux security identifier of the process which has
@@ -73,13 +73,43 @@
* This can't be restored once it's cleared, and it does not return the
* context of the current process when not in a binder call.
*/
- const char* getCallingSid() const;
+ [[nodiscard]] const char* getCallingSid() const;
/**
* Returns the UID of the process which has made the current binder
* call. If not in a binder call, this will return 0.
*/
- uid_t getCallingUid() const;
+ [[nodiscard]] uid_t getCallingUid() const;
+
+ /**
+ * Make it an abort to rely on getCalling* for a section of
+ * execution.
+ *
+ * Usage:
+ * IPCThreadState::SpGuard guard {
+ * .address = __builtin_frame_address(0),
+ * .context = "...",
+ * };
+ * const auto* orig = pushGetCallingSpGuard(&guard);
+ * {
+ * // will abort if you call getCalling*, unless you are
+ * // serving a nested binder transaction
+ * }
+ * restoreCallingSpGuard(orig);
+ */
+ struct SpGuard {
+ const void* address;
+ const char* context;
+ };
+ const SpGuard* pushGetCallingSpGuard(const SpGuard* guard);
+ void restoreGetCallingSpGuard(const SpGuard* guard);
+ /**
+ * Used internally by getCalling*. Can also be used to assert that
+ * you are in a binder context (getCalling* is valid). This is
+ * intentionally not exposed as a boolean API since code should be
+ * written to know its environment.
+ */
+ void checkContextIsBinderForUse(const char* use) const;
void setStrictModePolicy(int32_t policy);
int32_t getStrictModePolicy() const;
@@ -197,6 +227,7 @@
Parcel mOut;
status_t mLastError;
const void* mServingStackPointer;
+ const SpGuard* mServingStackPointerGuard;
pid_t mCallingPid;
const char* mCallingSid;
uid_t mCallingUid;
diff --git a/libs/binder/include/binder/IServiceManager.h b/libs/binder/include/binder/IServiceManager.h
index 3dbe2c4..d152005 100644
--- a/libs/binder/include/binder/IServiceManager.h
+++ b/libs/binder/include/binder/IServiceManager.h
@@ -167,6 +167,20 @@
bool checkCallingPermission(const String16& permission);
bool checkCallingPermission(const String16& permission,
int32_t* outPid, int32_t* outUid);
-bool checkPermission(const String16& permission, pid_t pid, uid_t uid);
+bool checkPermission(const String16& permission, pid_t pid, uid_t uid,
+ bool logPermissionFailure = true);
+
+#ifndef __ANDROID__
+// Create an IServiceManager that delegates the service manager on the device via adb.
+// This is can be set as the default service manager at program start, so that
+// defaultServiceManager() returns it:
+// int main() {
+// setDefaultServiceManager(createRpcDelegateServiceManager());
+// auto sm = defaultServiceManager();
+// // ...
+// }
+// Resources are cleaned up when the object is destroyed.
+sp<IServiceManager> createRpcDelegateServiceManager();
+#endif
} // namespace android
diff --git a/libs/binder/include/binder/Parcel.h b/libs/binder/include/binder/Parcel.h
index 5aaaa0c..02052ad 100644
--- a/libs/binder/include/binder/Parcel.h
+++ b/libs/binder/include/binder/Parcel.h
@@ -561,6 +561,8 @@
status_t flattenBinder(const sp<IBinder>& binder);
status_t unflattenBinder(sp<IBinder>* out) const;
+ status_t readOutVectorSizeWithCheck(size_t elmSize, int32_t* size) const;
+
template<class T>
status_t readAligned(T *pArg) const;
@@ -1315,7 +1317,7 @@
template<typename T>
status_t Parcel::resizeOutVector(std::vector<T>* val) const {
int32_t size;
- status_t err = readInt32(&size);
+ status_t err = readOutVectorSizeWithCheck(sizeof(T), &size);
if (err != NO_ERROR) {
return err;
}
@@ -1330,7 +1332,7 @@
template<typename T>
status_t Parcel::resizeOutVector(std::optional<std::vector<T>>* val) const {
int32_t size;
- status_t err = readInt32(&size);
+ status_t err = readOutVectorSizeWithCheck(sizeof(T), &size);
if (err != NO_ERROR) {
return err;
}
@@ -1346,7 +1348,7 @@
template<typename T>
status_t Parcel::resizeOutVector(std::unique_ptr<std::vector<T>>* val) const {
int32_t size;
- status_t err = readInt32(&size);
+ status_t err = readOutVectorSizeWithCheck(sizeof(T), &size);
if (err != NO_ERROR) {
return err;
}
diff --git a/libs/binder/include/binder/ParcelableHolder.h b/libs/binder/include/binder/ParcelableHolder.h
index 9e4475c..42c85f9 100644
--- a/libs/binder/include/binder/ParcelableHolder.h
+++ b/libs/binder/include/binder/ParcelableHolder.h
@@ -42,6 +42,7 @@
}
mStability = other.mStability;
}
+ ParcelableHolder(ParcelableHolder&& other) = default;
status_t writeToParcel(Parcel* parcel) const override;
status_t readFromParcel(const Parcel* parcel) override;
diff --git a/libs/binder/include/binder/ProcessState.h b/libs/binder/include/binder/ProcessState.h
index b9db5d7..72c2ab7 100644
--- a/libs/binder/include/binder/ProcessState.h
+++ b/libs/binder/include/binder/ProcessState.h
@@ -18,8 +18,8 @@
#include <binder/IBinder.h>
#include <utils/KeyedVector.h>
-#include <utils/String8.h>
#include <utils/String16.h>
+#include <utils/String8.h>
#include <utils/threads.h>
@@ -30,11 +30,10 @@
class IPCThreadState;
-class ProcessState : public virtual RefBase
-{
+class ProcessState : public virtual RefBase {
public:
- static sp<ProcessState> self();
- static sp<ProcessState> selfOrNull();
+ static sp<ProcessState> self();
+ static sp<ProcessState> selfOrNull();
/* initWithDriver() can be used to configure libbinder to use
* a different binder driver dev node. It must be called *before*
@@ -44,94 +43,101 @@
*
* If this is called with nullptr, the behavior is the same as selfOrNull.
*/
- static sp<ProcessState> initWithDriver(const char *driver);
+ static sp<ProcessState> initWithDriver(const char* driver);
- sp<IBinder> getContextObject(const sp<IBinder>& caller);
+ sp<IBinder> getContextObject(const sp<IBinder>& caller);
- void startThreadPool();
+ void startThreadPool();
- bool becomeContextManager();
+ bool becomeContextManager();
- sp<IBinder> getStrongProxyForHandle(int32_t handle);
- void expungeHandle(int32_t handle, IBinder* binder);
+ sp<IBinder> getStrongProxyForHandle(int32_t handle);
+ void expungeHandle(int32_t handle, IBinder* binder);
- void spawnPooledThread(bool isMain);
-
- status_t setThreadPoolMaxThreadCount(size_t maxThreads);
- status_t enableOnewaySpamDetection(bool enable);
- void giveThreadPoolName();
+ void spawnPooledThread(bool isMain);
- String8 getDriverName();
+ status_t setThreadPoolMaxThreadCount(size_t maxThreads);
+ status_t enableOnewaySpamDetection(bool enable);
+ void giveThreadPoolName();
- ssize_t getKernelReferences(size_t count, uintptr_t* buf);
+ String8 getDriverName();
- // Only usable by the context manager.
- // This refcount includes:
- // 1. Strong references to the node by this and other processes
- // 2. Temporary strong references held by the kernel during a
- // transaction on the node.
- // It does NOT include local strong references to the node
- ssize_t getStrongRefCountForNode(const sp<BpBinder>& binder);
+ ssize_t getKernelReferences(size_t count, uintptr_t* buf);
- enum class CallRestriction {
- // all calls okay
- NONE,
- // log when calls are blocking
- ERROR_IF_NOT_ONEWAY,
- // abort process on blocking calls
- FATAL_IF_NOT_ONEWAY,
- };
- // Sets calling restrictions for all transactions in this process. This must be called
- // before any threads are spawned.
- void setCallRestriction(CallRestriction restriction);
+ // Only usable by the context manager.
+ // This refcount includes:
+ // 1. Strong references to the node by this and other processes
+ // 2. Temporary strong references held by the kernel during a
+ // transaction on the node.
+ // It does NOT include local strong references to the node
+ ssize_t getStrongRefCountForNode(const sp<BpBinder>& binder);
+
+ enum class CallRestriction {
+ // all calls okay
+ NONE,
+ // log when calls are blocking
+ ERROR_IF_NOT_ONEWAY,
+ // abort process on blocking calls
+ FATAL_IF_NOT_ONEWAY,
+ };
+ // Sets calling restrictions for all transactions in this process. This must be called
+ // before any threads are spawned.
+ void setCallRestriction(CallRestriction restriction);
+
+ /**
+ * Get the max number of threads that the kernel can start.
+ *
+ * Note: this is the lower bound. Additional threads may be started.
+ */
+ size_t getThreadPoolMaxThreadCount() const;
private:
- static sp<ProcessState> init(const char *defaultDriver, bool requireDefault);
+ static sp<ProcessState> init(const char* defaultDriver, bool requireDefault);
friend class IPCThreadState;
friend class sp<ProcessState>;
- explicit ProcessState(const char* driver);
- ~ProcessState();
+ explicit ProcessState(const char* driver);
+ ~ProcessState();
- ProcessState(const ProcessState& o);
- ProcessState& operator=(const ProcessState& o);
- String8 makeBinderThreadName();
+ ProcessState(const ProcessState& o);
+ ProcessState& operator=(const ProcessState& o);
+ String8 makeBinderThreadName();
- struct handle_entry {
- IBinder* binder;
- RefBase::weakref_type* refs;
- };
+ struct handle_entry {
+ IBinder* binder;
+ RefBase::weakref_type* refs;
+ };
- handle_entry* lookupHandleLocked(int32_t handle);
+ handle_entry* lookupHandleLocked(int32_t handle);
- String8 mDriverName;
- int mDriverFD;
- void* mVMStart;
+ String8 mDriverName;
+ int mDriverFD;
+ void* mVMStart;
- // Protects thread count and wait variables below.
- pthread_mutex_t mThreadCountLock;
- // Broadcast whenever mWaitingForThreads > 0
- pthread_cond_t mThreadCountDecrement;
- // Number of binder threads current executing a command.
- size_t mExecutingThreadsCount;
- // Number of threads calling IPCThreadState::blockUntilThreadAvailable()
- size_t mWaitingForThreads;
- // Maximum number for binder threads allowed for this process.
- size_t mMaxThreads;
- // Time when thread pool was emptied
- int64_t mStarvationStartTimeMs;
+ // Protects thread count and wait variables below.
+ pthread_mutex_t mThreadCountLock;
+ // Broadcast whenever mWaitingForThreads > 0
+ pthread_cond_t mThreadCountDecrement;
+ // Number of binder threads current executing a command.
+ size_t mExecutingThreadsCount;
+ // Number of threads calling IPCThreadState::blockUntilThreadAvailable()
+ size_t mWaitingForThreads;
+ // Maximum number for binder threads allowed for this process.
+ size_t mMaxThreads;
+ // Time when thread pool was emptied
+ int64_t mStarvationStartTimeMs;
- mutable Mutex mLock; // protects everything below.
+ mutable Mutex mLock; // protects everything below.
- Vector<handle_entry>mHandleToObject;
+ Vector<handle_entry> mHandleToObject;
- bool mThreadPoolStarted;
- volatile int32_t mThreadPoolSeq;
+ bool mThreadPoolStarted;
+ volatile int32_t mThreadPoolSeq;
- CallRestriction mCallRestriction;
+ CallRestriction mCallRestriction;
};
-
+
} // namespace android
// ---------------------------------------------------------------------------
diff --git a/libs/binder/include/binder/RpcAddress.h b/libs/binder/include/binder/RpcAddress.h
index 5a3f3a6..e428908 100644
--- a/libs/binder/include/binder/RpcAddress.h
+++ b/libs/binder/include/binder/RpcAddress.h
@@ -29,11 +29,7 @@
struct RpcWireAddress;
/**
- * This class represents an identifier of a binder object.
- *
- * The purpose of this class it to hide the ABI of an RpcWireAddress, and
- * potentially allow us to change the size of it in the future (RpcWireAddress
- * is PIMPL, essentially - although the type that is used here is not exposed).
+ * This class represents an identifier across an RPC boundary.
*/
class RpcAddress {
public:
@@ -46,9 +42,20 @@
bool isZero() const;
/**
- * Create a new address which is unique
+ * Create a new random address.
*/
- static RpcAddress unique();
+ static RpcAddress random(bool forServer);
+
+ /**
+ * Whether this address was created with 'bool forServer' true
+ */
+ bool isForServer() const;
+
+ /**
+ * Whether this address is one that could be created with this version of
+ * libbinder.
+ */
+ bool isRecognizedType() const;
/**
* Creates a new address as a copy of an embedded object.
diff --git a/libs/binder/include/binder/RpcServer.h b/libs/binder/include/binder/RpcServer.h
index 8f0c6fd..40ff78c 100644
--- a/libs/binder/include/binder/RpcServer.h
+++ b/libs/binder/include/binder/RpcServer.h
@@ -17,6 +17,7 @@
#include <android-base/unique_fd.h>
#include <binder/IBinder.h>
+#include <binder/RpcAddress.h>
#include <binder/RpcSession.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
@@ -44,7 +45,7 @@
* }
* server->join();
*/
-class RpcServer final : public virtual RefBase {
+class RpcServer final : public virtual RefBase, private RpcSession::EventListener {
public:
static sp<RpcServer> make();
@@ -97,13 +98,20 @@
*
* If this is not specified, this will be a single-threaded server.
*
- * TODO(b/185167543): these are currently created per client, but these
+ * TODO(b/167966510): these are currently created per client, but these
* should be shared.
*/
void setMaxThreads(size_t threads);
size_t getMaxThreads();
/**
+ * By default, the latest protocol version which is supported by a client is
+ * used. However, this can be used in order to prevent newer protocol
+ * versions from ever being used. This is expected to be useful for testing.
+ */
+ void setProtocolVersion(uint32_t version);
+
+ /**
* The root object can be retrieved by any client, without any
* authentication. TODO(b/183988761)
*
@@ -117,17 +125,31 @@
sp<IBinder> getRootObject();
/**
+ * Runs join() in a background thread. Immediately returns.
+ */
+ void start();
+
+ /**
* You must have at least one client session before calling this.
*
- * TODO(b/185167543): way to shut down?
+ * If a client needs to actively terminate join, call shutdown() in a separate thread.
+ *
+ * At any given point, there can only be one thread calling join().
+ *
+ * Warning: if shutdown is called, this will return while the shutdown is
+ * still occurring. To ensure that the service is fully shutdown, you might
+ * want to call shutdown after 'join' returns.
*/
void join();
/**
- * Accept one connection on this server. You must have at least one client
- * session before calling this.
+ * Shut down any existing join(). Return true if successfully shut down, false otherwise
+ * (e.g. no join() is running). Will wait for the server to be fully
+ * shutdown.
+ *
+ * Warning: this will hang if it is called from its own thread.
*/
- [[nodiscard]] bool acceptOne();
+ [[nodiscard]] bool shutdown();
/**
* For debugging!
@@ -137,28 +159,30 @@
~RpcServer();
- // internal use only
-
- void onSessionTerminating(const sp<RpcSession>& session);
-
private:
friend sp<RpcServer>;
RpcServer();
- void establishConnection(sp<RpcServer>&& session, base::unique_fd clientFd);
+ void onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) override;
+ void onSessionIncomingThreadEnded() override;
+
+ static void establishConnection(sp<RpcServer>&& server, base::unique_fd clientFd);
bool setupSocketServer(const RpcSocketAddress& address);
bool mAgreedExperimental = false;
- bool mStarted = false; // TODO(b/185167543): support dynamically added clients
size_t mMaxThreads = 1;
+ std::optional<uint32_t> mProtocolVersion;
base::unique_fd mServer; // socket we are accepting sessions on
std::mutex mLock; // for below
+ std::unique_ptr<std::thread> mJoinThread;
+ bool mJoinThreadRunning = false;
std::map<std::thread::id, std::thread> mConnectingThreads;
sp<IBinder> mRootObject;
wp<IBinder> mRootObjectWeak;
- std::map<int32_t, sp<RpcSession>> mSessions;
- int32_t mSessionIdCounter = 0;
+ std::map<RpcAddress, sp<RpcSession>> mSessions;
+ std::unique_ptr<RpcSession::FdTrigger> mShutdownTrigger;
+ std::condition_variable mShutdownCv;
};
} // namespace android
diff --git a/libs/binder/include/binder/RpcSession.h b/libs/binder/include/binder/RpcSession.h
index bcc213c..1f7c029 100644
--- a/libs/binder/include/binder/RpcSession.h
+++ b/libs/binder/include/binder/RpcSession.h
@@ -37,6 +37,10 @@
class RpcSocketAddress;
class RpcState;
+constexpr uint32_t RPC_WIRE_PROTOCOL_VERSION_NEXT = 0;
+constexpr uint32_t RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL = 0xF0000000;
+constexpr uint32_t RPC_WIRE_PROTOCOL_VERSION = RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL;
+
/**
* This represents a session (group of connections) between a client
* and a server. Multiple connections are needed for multiple parallel "binder"
@@ -47,6 +51,26 @@
static sp<RpcSession> make();
/**
+ * Set the maximum number of threads allowed to be made (for things like callbacks).
+ * By default, this is 0. This must be called before setting up this connection as a client.
+ * Server sessions will inherits this value from RpcServer.
+ *
+ * If this is called, 'shutdown' on this session must also be called.
+ * Otherwise, a threadpool will leak.
+ *
+ * TODO(b/189955605): start these dynamically
+ */
+ void setMaxThreads(size_t threads);
+ size_t getMaxThreads();
+
+ /**
+ * By default, the minimum of the supported versions of the client and the
+ * server will be used. Usually, this API should only be used for debugging.
+ */
+ [[nodiscard]] bool setProtocolVersion(uint32_t version);
+ std::optional<uint32_t> getProtocolVersion();
+
+ /**
* This should be called once per thread, matching 'join' in the remote
* process.
*/
@@ -83,42 +107,101 @@
*/
status_t getRemoteMaxThreads(size_t* maxThreads);
- [[nodiscard]] status_t transact(const RpcAddress& address, uint32_t code, const Parcel& data,
+ /**
+ * Shuts down the service.
+ *
+ * For client sessions, wait can be true or false. For server sessions,
+ * waiting is not currently supported (will abort).
+ *
+ * Warning: this is currently not active/nice (the server isn't told we're
+ * shutting down). Being nicer to the server could potentially make it
+ * reclaim resources faster.
+ *
+ * If this is called w/ 'wait' true, then this will wait for shutdown to
+ * complete before returning. This will hang if it is called from the
+ * session threadpool (when processing received calls).
+ */
+ [[nodiscard]] bool shutdownAndWait(bool wait);
+
+ [[nodiscard]] status_t transact(const sp<IBinder>& binder, uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags);
[[nodiscard]] status_t sendDecStrong(const RpcAddress& address);
~RpcSession();
- wp<RpcServer> server();
+ /**
+ * Server if this session is created as part of a server (symmetrical to
+ * client servers). Otherwise, nullptr.
+ */
+ sp<RpcServer> server();
// internal only
const std::unique_ptr<RpcState>& state() { return mState; }
- class PrivateAccessorForId {
- private:
- friend class RpcSession;
- friend class RpcState;
- explicit PrivateAccessorForId(const RpcSession* session) : mSession(session) {}
-
- const std::optional<int32_t> get() { return mSession->mId; }
-
- const RpcSession* mSession;
- };
- PrivateAccessorForId getPrivateAccessorForId() const { return PrivateAccessorForId(this); }
-
private:
- friend PrivateAccessorForId;
friend sp<RpcSession>;
friend RpcServer;
+ friend RpcState;
RpcSession();
- status_t readId();
+ /** This is not a pipe. */
+ struct FdTrigger {
+ /** Returns nullptr for error case */
+ static std::unique_ptr<FdTrigger> make();
- // transfer ownership of thread
- void preJoin(std::thread thread);
- // join on thread passed to preJoin
- void join(base::unique_fd client);
- void terminateLocked();
+ /**
+ * Close the write end of the pipe so that the read end receives POLLHUP.
+ * Not threadsafe.
+ */
+ void trigger();
+
+ /**
+ * Whether this has been triggered.
+ */
+ bool isTriggered();
+
+ /**
+ * Poll for a read event.
+ *
+ * event - for pollfd
+ *
+ * Return:
+ * true - time to read!
+ * false - trigger happened
+ */
+ status_t triggerablePoll(base::borrowed_fd fd, int16_t event);
+
+ /**
+ * Read (or write), but allow to be interrupted by this trigger.
+ *
+ * Return:
+ * true - succeeded in completely processing 'size'
+ * false - interrupted (failure or trigger)
+ */
+ status_t interruptableReadFully(base::borrowed_fd fd, void* data, size_t size);
+ status_t interruptableWriteFully(base::borrowed_fd fd, const void* data, size_t size);
+
+ private:
+ base::unique_fd mWrite;
+ base::unique_fd mRead;
+ };
+
+ class EventListener : public virtual RefBase {
+ public:
+ virtual void onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) = 0;
+ virtual void onSessionIncomingThreadEnded() = 0;
+ };
+
+ class WaitForShutdownListener : public EventListener {
+ public:
+ void onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) override;
+ void onSessionIncomingThreadEnded() override;
+ void waitForShutdown(std::unique_lock<std::mutex>& lock);
+
+ private:
+ std::condition_variable mCv;
+ volatile bool mShutdown = false;
+ };
struct RpcConnection : public RefBase {
base::unique_fd fd;
@@ -126,14 +209,41 @@
// whether this or another thread is currently using this fd to make
// or receive transactions.
std::optional<pid_t> exclusiveTid;
+
+ bool allowNested = false;
};
- bool setupSocketClient(const RpcSocketAddress& address);
- bool setupOneSocketClient(const RpcSocketAddress& address, int32_t sessionId);
- void addClientConnection(base::unique_fd fd);
- void setForServer(const wp<RpcServer>& server, int32_t sessionId);
- sp<RpcConnection> assignServerToThisThread(base::unique_fd fd);
- bool removeServerConnection(const sp<RpcConnection>& connection);
+ status_t readId();
+
+ // A thread joining a server must always call these functions in order, and
+ // cleanup is only programmed once into join. These are in separate
+ // functions in order to allow for different locks to be taken during
+ // different parts of setup.
+ //
+ // transfer ownership of thread (usually done while a lock is taken on the
+ // structure which originally owns the thread)
+ void preJoinThreadOwnership(std::thread thread);
+ // pass FD to thread and read initial connection information
+ struct PreJoinSetupResult {
+ // Server connection object associated with this
+ sp<RpcConnection> connection;
+ // Status of setup
+ status_t status;
+ };
+ PreJoinSetupResult preJoinSetup(base::unique_fd fd);
+ // join on thread passed to preJoinThreadOwnership
+ static void join(sp<RpcSession>&& session, PreJoinSetupResult&& result);
+
+ [[nodiscard]] bool setupSocketClient(const RpcSocketAddress& address);
+ [[nodiscard]] bool setupOneSocketConnection(const RpcSocketAddress& address,
+ const RpcAddress& sessionId, bool server);
+ [[nodiscard]] bool addIncomingConnection(base::unique_fd fd);
+ [[nodiscard]] bool addOutgoingConnection(base::unique_fd fd, bool init);
+ [[nodiscard]] bool setForServer(const wp<RpcServer>& server,
+ const wp<RpcSession::EventListener>& eventListener,
+ const RpcAddress& sessionId);
+ sp<RpcConnection> assignIncomingConnectionToThisThread(base::unique_fd fd);
+ [[nodiscard]] bool removeIncomingConnection(const sp<RpcConnection>& connection);
enum class ConnectionUse {
CLIENT,
@@ -141,12 +251,14 @@
CLIENT_REFCOUNT,
};
- // RAII object for session connection
+ // Object representing exclusive access to a connection.
class ExclusiveConnection {
public:
- explicit ExclusiveConnection(const sp<RpcSession>& session, ConnectionUse use);
+ static status_t find(const sp<RpcSession>& session, ConnectionUse use,
+ ExclusiveConnection* connection);
+
~ExclusiveConnection();
- const base::unique_fd& fd() { return mConnection->fd; }
+ const sp<RpcConnection>& get() { return mConnection; }
private:
static void findConnection(pid_t tid, sp<RpcConnection>* exclusive,
@@ -163,13 +275,13 @@
bool mReentrant = false;
};
- // On the other side of a session, for each of mClientConnections here, there should
- // be one of mServerConnections on the other side (and vice versa).
+ // On the other side of a session, for each of mOutgoingConnections here, there should
+ // be one of mIncomingConnections on the other side (and vice versa).
//
// For the simplest session, a single server with one client, you would
// have:
- // - the server has a single 'mServerConnections' and a thread listening on this
- // - the client has a single 'mClientConnections' and makes calls to this
+ // - the server has a single 'mIncomingConnections' and a thread listening on this
+ // - the client has a single 'mOutgoingConnections' and makes calls to this
// - here, when the client makes a call, the server can call back into it
// (nested calls), but outside of this, the client will only ever read
// calls from the server when it makes a call itself.
@@ -178,27 +290,28 @@
// serve calls to the server at all times (e.g. if it hosts a callback)
wp<RpcServer> mForServer; // maybe null, for client sessions
+ sp<WaitForShutdownListener> mShutdownListener; // used for client sessions
+ wp<EventListener> mEventListener; // mForServer if server, mShutdownListener if client
- // TODO(b/183988761): this shouldn't be guessable
- std::optional<int32_t> mId;
+ std::optional<RpcAddress> mId;
+
+ std::unique_ptr<FdTrigger> mShutdownTrigger;
std::unique_ptr<RpcState> mState;
std::mutex mMutex; // for all below
+ size_t mMaxThreads = 0;
+ std::optional<uint32_t> mProtocolVersion;
+
std::condition_variable mAvailableConnectionCv; // for mWaitingThreads
size_t mWaitingThreads = 0;
// hint index into clients, ++ when sending an async transaction
- size_t mClientConnectionsOffset = 0;
- std::vector<sp<RpcConnection>> mClientConnections;
- std::vector<sp<RpcConnection>> mServerConnections;
-
- // TODO(b/185167543): use for reverse sessions (allow client to also
- // serve calls on a session).
- // TODO(b/185167543): allow sharing between different sessions in a
- // process? (or combine with mServerConnections)
+ size_t mOutgoingConnectionsOffset = 0;
+ std::vector<sp<RpcConnection>> mOutgoingConnections;
+ size_t mMaxIncomingConnections = 0;
+ std::vector<sp<RpcConnection>> mIncomingConnections;
std::map<std::thread::id, std::thread> mThreads;
- bool mTerminated = false;
};
} // namespace android
diff --git a/libs/binder/include/binder/Stability.h b/libs/binder/include/binder/Stability.h
index f4bfac8..ce4362f 100644
--- a/libs/binder/include/binder/Stability.h
+++ b/libs/binder/include/binder/Stability.h
@@ -44,10 +44,9 @@
// to old servers, and new servers know how to interpret the 8-byte result,
// they can still communicate.
//
-// Every binder object has a stability level associated with it, and when
-// communicating with a binder, we make sure that the command we sent is one
-// that it knows how to process. The summary of stability of a binder is
-// represented by a Stability::Category object.
+// This class is specifically about (1). (2) is not currently tracked by
+// libbinder for regular binder calls, and everything on the system uses the
+// same copy of libbinder.
class Stability final {
public:
@@ -100,7 +99,7 @@
static void markVintf(IBinder* binder);
// WARNING: for debugging only
- static void debugLogStability(const std::string& tag, const sp<IBinder>& binder);
+ static std::string debugToString(const sp<IBinder>& binder);
// WARNING: This is only ever expected to be called by auto-generated code or tests.
// You likely want to change or modify the stability of the interface you are using.
@@ -128,7 +127,10 @@
static void tryMarkCompilationUnit(IBinder* binder);
- enum Level : uint8_t {
+ // Currently, we use int16_t for Level so that it can fit in BBinder.
+ // However, on the wire, we have 4 bytes reserved for stability, so whenever
+ // we ingest a Level, we always accept an int32_t.
+ enum Level : int16_t {
UNDECLARED = 0,
VENDOR = 0b000011,
@@ -136,38 +138,6 @@
VINTF = 0b111111,
};
- // This is the format of stability passed on the wire.
- struct Category {
- static inline Category fromRepr(int32_t representation) {
- return *reinterpret_cast<Category*>(&representation);
- }
- int32_t repr() const {
- return *reinterpret_cast<const int32_t*>(this);
- }
- static inline Category currentFromLevel(Level level);
-
- bool operator== (const Category& o) const {
- return repr() == o.repr();
- }
- bool operator!= (const Category& o) const {
- return !(*this == o);
- }
-
- std::string debugString();
-
- // This is the version of the wire protocol associated with the host
- // process of a particular binder. As the wire protocol changes, if
- // sending a transaction to a binder with an old version, the Parcel
- // class must write parcels according to the version documented here.
- uint8_t version;
-
- uint8_t reserved[2];
-
- // bitmask of Stability::Level
- Level level;
- };
- static_assert(sizeof(Category) == sizeof(int32_t));
-
// returns the stability according to how this was built
static Level getLocalLevel();
@@ -180,18 +150,18 @@
REPR_ALLOW_DOWNGRADE = 2,
};
// applies stability to binder if stability level is known
- __attribute__((warn_unused_result))
- static status_t setRepr(IBinder* binder, int32_t representation, uint32_t flags);
+ __attribute__((warn_unused_result)) static status_t setRepr(IBinder* binder, int32_t setting,
+ uint32_t flags);
// get stability information as encoded on the wire
- static Category getCategory(IBinder* binder);
+ static int16_t getRepr(IBinder* binder);
// whether a transaction on binder is allowed, if the transaction
// is done from a context with a specific stability level
- static bool check(Category provided, Level required);
+ static bool check(int16_t provided, Level required);
- static bool isDeclaredLevel(Level level);
- static std::string levelString(Level level);
+ static bool isDeclaredLevel(int32_t level);
+ static std::string levelString(int32_t level);
Stability();
};
diff --git a/libs/binder/libbinder.arm32.map b/libs/binder/libbinder.arm32.map
deleted file mode 100644
index f26c33d..0000000
--- a/libs/binder/libbinder.arm32.map
+++ /dev/null
@@ -1,1393 +0,0 @@
-LIBBINDER {
- global:
- getBinderKernelReferences;
- kDefaultDriver;
- _ZN7android10AllocationC1ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEEij;
- _ZN7android10AllocationC2ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEEij;
- _ZN7android10AllocationD0Ev;
- _ZN7android10AllocationD1Ev;
- _ZN7android10AllocationD2Ev;
- _ZN7android10IInterface8asBinderEPKS0_;
- _ZN7android10IInterface8asBinderERKNS_2spIS0_EE;
- _ZN7android10IInterfaceC2Ev;
- _ZN7android10IInterfaceD0Ev;
- _ZN7android10IInterfaceD1Ev;
- _ZN7android10IInterfaceD2Ev;
- _ZN7android10MemoryBaseC1ERKNS_2spINS_11IMemoryHeapEEEij;
- _ZN7android10MemoryBaseC2ERKNS_2spINS_11IMemoryHeapEEEij;
- _ZN7android10MemoryBaseD0Ev;
- _ZN7android10MemoryBaseD1Ev;
- _ZN7android10MemoryBaseD2Ev;
- _ZN7android10RpcAddress14readFromParcelERKNS_6ParcelE;
- _ZN7android10RpcAddress15fromRawEmbeddedEPKNS_14RpcWireAddressE;
- _ZN7android10RpcAddress4zeroEv;
- _ZN7android10RpcAddress6uniqueEv;
- _ZN7android10RpcAddressC1Ev;
- _ZN7android10RpcAddressC2Ev;
- _ZN7android10RpcAddressD1Ev;
- _ZN7android10RpcAddressD2Ev;
- _ZN7android10RpcSession12setForServerERKNS_2wpINS_9RpcServerEEEi;
- _ZN7android10RpcSession13getRootObjectEv;
- _ZN7android10RpcSession13sendDecStrongERKNS_10RpcAddressE;
- _ZN7android10RpcSession15setupInetClientEPKcj;
- _ZN7android10RpcSession15terminateLockedEv;
- _ZN7android10RpcSession16setupVsockClientEjj;
- _ZN7android10RpcSession17setupSocketClientERKNS_16RpcSocketAddressE;
- _ZN7android10RpcSession19addClientConnectionENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession19ExclusiveConnection14findConnectionEiPNS_2spINS0_13RpcConnectionEEES5_RNSt3__16vectorIS4_NS6_9allocatorIS4_EEEEj;
- _ZN7android10RpcSession19ExclusiveConnectionC1ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionC2ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionD1Ev;
- _ZN7android10RpcSession19ExclusiveConnectionD2Ev;
- _ZN7android10RpcSession19getRemoteMaxThreadsEPj;
- _ZN7android10RpcSession20setupOneSocketClientERKNS_16RpcSocketAddressEi;
- _ZN7android10RpcSession21setupUnixDomainClientEPKc;
- _ZN7android10RpcSession22addNullDebuggingClientEv;
- _ZN7android10RpcSession22removeServerConnectionERKNS_2spINS0_13RpcConnectionEEE;
- _ZN7android10RpcSession24assignServerToThisThreadENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4joinENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4makeEv;
- _ZN7android10RpcSession6readIdEv;
- _ZN7android10RpcSession6serverEv;
- _ZN7android10RpcSession7preJoinENSt3__16threadE;
- _ZN7android10RpcSession8transactERKNS_10RpcAddressEjRKNS_6ParcelEPS4_j;
- _ZN7android10RpcSessionC1Ev;
- _ZN7android10RpcSessionC2Ev;
- _ZN7android10RpcSessionD0Ev;
- _ZN7android10RpcSessionD1Ev;
- _ZN7android10RpcSessionD2Ev;
- _ZN7android10TextOutputC2Ev;
- _ZN7android10TextOutputD0Ev;
- _ZN7android10TextOutputD1Ev;
- _ZN7android10TextOutputD2Ev;
- _ZN7android10zeroMemoryEPhj;
- _ZN7android11BnInterfaceINS_11IMemoryHeapEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_14IShellCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_15IResultReceiverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_21IPermissionControllerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IClientCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IServiceManagerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os16IServiceCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm21IPackageManagerNativeEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm22IPackageChangeObserverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7IMemoryEE10onAsBinderEv;
- _ZN7android11IMemoryHeap10descriptorE;
- _ZN7android11IMemoryHeap11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android11IMemoryHeap12default_implE;
- _ZN7android11IMemoryHeap14getDefaultImplEv;
- _ZN7android11IMemoryHeap14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android11IMemoryHeapC2Ev;
- _ZN7android11IMemoryHeapD0Ev;
- _ZN7android11IMemoryHeapD1Ev;
- _ZN7android11IMemoryHeapD2Ev;
- _ZN7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android12BnMemoryHeapC2Ev;
- _ZN7android12BnMemoryHeapD0Ev;
- _ZN7android12BnMemoryHeapD1Ev;
- _ZN7android12BnMemoryHeapD2Ev;
- _ZN7android12BpMemoryHeapC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapD0Ev;
- _ZN7android12BpMemoryHeapD1Ev;
- _ZN7android12BpMemoryHeapD2Ev;
- _ZN7android12gTextBuffersE;
- _ZN7android12MemoryDealer10deallocateEj;
- _ZN7android12MemoryDealer22getAllocationAlignmentEv;
- _ZN7android12MemoryDealer8allocateEj;
- _ZN7android12MemoryDealerC1EjPKcj;
- _ZN7android12MemoryDealerC2EjPKcj;
- _ZN7android12MemoryDealerD0Ev;
- _ZN7android12MemoryDealerD1Ev;
- _ZN7android12MemoryDealerD2Ev;
- _ZN7android12printHexDataEiPKvjjijbPFvPvPKcES2_;
- _ZN7android12ProcessState10selfOrNullEv;
- _ZN7android12ProcessState13expungeHandleEiPNS_7IBinderE;
- _ZN7android12ProcessState13getDriverNameEv;
- _ZN7android12ProcessState14initWithDriverEPKc;
- _ZN7android12ProcessState15startThreadPoolEv;
- _ZN7android12ProcessState16getContextObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android12ProcessState17spawnPooledThreadEb;
- _ZN7android12ProcessState18giveThreadPoolNameEv;
- _ZN7android12ProcessState18lookupHandleLockedEi;
- _ZN7android12ProcessState18setCallRestrictionENS0_15CallRestrictionE;
- _ZN7android12ProcessState19getKernelReferencesEjPj;
- _ZN7android12ProcessState20becomeContextManagerEv;
- _ZN7android12ProcessState20makeBinderThreadNameEv;
- _ZN7android12ProcessState23getStrongProxyForHandleEi;
- _ZN7android12ProcessState24getStrongRefCountForNodeERKNS_2spINS_8BpBinderEEE;
- _ZN7android12ProcessState25enableOnewaySpamDetectionEb;
- _ZN7android12ProcessState27setThreadPoolMaxThreadCountEj;
- _ZN7android12ProcessState4initEPKcb;
- _ZN7android12ProcessState4selfEv;
- _ZN7android12ProcessStateC1EPKc;
- _ZN7android12ProcessStateC2EPKc;
- _ZN7android12ProcessStateD0Ev;
- _ZN7android12ProcessStateD1Ev;
- _ZN7android12ProcessStateD2Ev;
- _ZN7android13printTypeCodeEjPFvPvPKcES0_;
- _ZN7android14IPCThreadState10freeBufferEPNS_6ParcelEPKhjPKyj;
- _ZN7android14IPCThreadState10selfOrNullEv;
- _ZN7android14IPCThreadState11clearCallerEv;
- _ZN7android14IPCThreadState11stopProcessEb;
- _ZN7android14IPCThreadState12setupPollingEPi;
- _ZN7android14IPCThreadState13decWeakHandleEi;
- _ZN7android14IPCThreadState13expungeHandleEiPNS_7IBinderE;
- _ZN7android14IPCThreadState13flushCommandsEv;
- _ZN7android14IPCThreadState13flushIfNeededEv;
- _ZN7android14IPCThreadState13incWeakHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState14clearLastErrorEv;
- _ZN7android14IPCThreadState14executeCommandEi;
- _ZN7android14IPCThreadState14joinThreadPoolEb;
- _ZN7android14IPCThreadState14talkWithDriverEb;
- _ZN7android14IPCThreadState15decStrongHandleEi;
- _ZN7android14IPCThreadState15incStrongHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi;
- _ZN7android14IPCThreadState16threadDestructorEPv;
- _ZN7android14IPCThreadState18setCallRestrictionENS_12ProcessState15CallRestrictionE;
- _ZN7android14IPCThreadState19setStrictModePolicyEi;
- _ZN7android14IPCThreadState19setTheContextObjectERKNS_2spINS_7BBinderEEE;
- _ZN7android14IPCThreadState20clearCallingIdentityEv;
- _ZN7android14IPCThreadState20getAndExecuteCommandEv;
- _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_;
- _ZN7android14IPCThreadState20handlePolledCommandsEv;
- _ZN7android14IPCThreadState20processPendingDerefsEv;
- _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi;
- _ZN7android14IPCThreadState22attemptIncStrongHandleEi;
- _ZN7android14IPCThreadState22clearCallingWorkSourceEv;
- _ZN7android14IPCThreadState22clearDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState22processPostWriteDerefsEv;
- _ZN7android14IPCThreadState22restoreCallingIdentityEx;
- _ZN7android14IPCThreadState23setCallingWorkSourceUidEj;
- _ZN7android14IPCThreadState24clearPropagateWorkSourceEv;
- _ZN7android14IPCThreadState24requestDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState24restoreCallingWorkSourceEx;
- _ZN7android14IPCThreadState25blockUntilThreadAvailableEv;
- _ZN7android14IPCThreadState27disableBackgroundSchedulingEb;
- _ZN7android14IPCThreadState28backgroundSchedulingDisabledEv;
- _ZN7android14IPCThreadState29setLastTransactionBinderFlagsEi;
- _ZN7android14IPCThreadState41setCallingWorkSourceUidWithoutPropagationEj;
- _ZN7android14IPCThreadState4selfEv;
- _ZN7android14IPCThreadState6freezeEibj;
- _ZN7android14IPCThreadState7processEv;
- _ZN7android14IPCThreadState8shutdownEv;
- _ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j;
- _ZN7android14IPCThreadState9sendReplyERKNS_6ParcelEj;
- _ZN7android14IPCThreadStateC1Ev;
- _ZN7android14IPCThreadStateC2Ev;
- _ZN7android14IPCThreadStateD1Ev;
- _ZN7android14IPCThreadStateD2Ev;
- _ZN7android14IShellCallback10descriptorE;
- _ZN7android14IShellCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android14IShellCallback12default_implE;
- _ZN7android14IShellCallback14getDefaultImplEv;
- _ZN7android14IShellCallback14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android14IShellCallbackC2Ev;
- _ZN7android14IShellCallbackD0Ev;
- _ZN7android14IShellCallbackD1Ev;
- _ZN7android14IShellCallbackD2Ev;
- _ZN7android14MemoryHeapBase4initEiPvjiPKc;
- _ZN7android14MemoryHeapBase5mapfdEibjl;
- _ZN7android14MemoryHeapBase7disposeEv;
- _ZN7android14MemoryHeapBaseC1Eijjl;
- _ZN7android14MemoryHeapBaseC1EjjPKc;
- _ZN7android14MemoryHeapBaseC1EPKcjj;
- _ZN7android14MemoryHeapBaseC1Ev;
- _ZN7android14MemoryHeapBaseC2Eijjl;
- _ZN7android14MemoryHeapBaseC2EjjPKc;
- _ZN7android14MemoryHeapBaseC2EPKcjj;
- _ZN7android14MemoryHeapBaseC2Ev;
- _ZN7android14MemoryHeapBaseD0Ev;
- _ZN7android14MemoryHeapBaseD1Ev;
- _ZN7android14MemoryHeapBaseD2Ev;
- _ZN7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android15checkPermissionERKNS_8String16Eij;
- _ZN7android15IResultReceiver10descriptorE;
- _ZN7android15IResultReceiver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android15IResultReceiver12default_implE;
- _ZN7android15IResultReceiver14getDefaultImplEv;
- _ZN7android15IResultReceiver14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android15IResultReceiverC2Ev;
- _ZN7android15IResultReceiverD0Ev;
- _ZN7android15IResultReceiverD1Ev;
- _ZN7android15IResultReceiverD2Ev;
- _ZN7android15IServiceManagerC2Ev;
- _ZN7android15IServiceManagerD0Ev;
- _ZN7android15IServiceManagerD1Ev;
- _ZN7android15IServiceManagerD2Ev;
- _ZN7android15PermissionCache10purgeCacheEv;
- _ZN7android15PermissionCache15checkPermissionERKNS_8String16Eij;
- _ZN7android15PermissionCache22checkCallingPermissionERKNS_8String16E;
- _ZN7android15PermissionCache22checkCallingPermissionERKNS_8String16EPiS4_;
- _ZN7android15PermissionCache5cacheERKNS_8String16Ejb;
- _ZN7android15PermissionCache5purgeEv;
- _ZN7android15PermissionCacheC1Ev;
- _ZN7android15PermissionCacheC2Ev;
- _ZN7android15stringForIndentEi;
- _ZN7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android18BufferedTextOutput10moveIndentEi;
- _ZN7android18BufferedTextOutput10pushBundleEv;
- _ZN7android18BufferedTextOutput5printEPKcj;
- _ZN7android18BufferedTextOutput9popBundleEv;
- _ZN7android18BufferedTextOutputC2Ej;
- _ZN7android18BufferedTextOutputD0Ev;
- _ZN7android18BufferedTextOutputD1Ev;
- _ZN7android18BufferedTextOutputD2Ev;
- _ZN7android18ServiceManagerShim10addServiceERKNS_8String16ERKNS_2spINS_7IBinderEEEbi;
- _ZN7android18ServiceManagerShim10isDeclaredERKNS_8String16E;
- _ZN7android18ServiceManagerShim12listServicesEi;
- _ZN7android18ServiceManagerShim14waitForServiceERKNS_8String16E;
- _ZN7android18ServiceManagerShim16updatableViaApexERKNS_8String16E;
- _ZN7android18ServiceManagerShim20getDeclaredInstancesERKNS_8String16E;
- _ZN7android18ServiceManagerShimC1ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18ServiceManagerShimC2ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18the_context_objectE;
- _ZN7android20PermissionController10getServiceEv;
- _ZN7android20PermissionController13getPackageUidERKNS_8String16Ei;
- _ZN7android20PermissionController15checkPermissionERKNS_8String16Eii;
- _ZN7android20PermissionController17getPackagesForUidEjRNS_6VectorINS_8String16EEE;
- _ZN7android20PermissionController19isRuntimePermissionERKNS_8String16E;
- _ZN7android20PermissionController6noteOpERKNS_8String16EiS3_;
- _ZN7android20PermissionControllerC1Ev;
- _ZN7android20PermissionControllerC2Ev;
- _ZN7android21defaultServiceManagerEv;
- _ZN7android21IPermissionController10descriptorE;
- _ZN7android21IPermissionController11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android21IPermissionController12default_implE;
- _ZN7android21IPermissionController14getDefaultImplEv;
- _ZN7android21IPermissionController14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android21IPermissionControllerC2Ev;
- _ZN7android21IPermissionControllerD0Ev;
- _ZN7android21IPermissionControllerD1Ev;
- _ZN7android21IPermissionControllerD2Ev;
- _ZN7android22BnPermissionController10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android22checkCallingPermissionERKNS_8String16E;
- _ZN7android22checkCallingPermissionERKNS_8String16EPiS3_;
- _ZN7android22SimpleBestFitAllocator10deallocateEj;
- _ZN7android22SimpleBestFitAllocator12kMemoryAlignE;
- _ZN7android22SimpleBestFitAllocator5allocEjj;
- _ZN7android22SimpleBestFitAllocator7deallocEj;
- _ZN7android22SimpleBestFitAllocator8allocateEjj;
- _ZN7android22SimpleBestFitAllocatorC1Ej;
- _ZN7android22SimpleBestFitAllocatorC2Ej;
- _ZN7android22SimpleBestFitAllocatorD1Ev;
- _ZN7android22SimpleBestFitAllocatorD2Ev;
- _ZN7android24setDefaultServiceManagerERKNS_2spINS_15IServiceManagerEEE;
- _ZN7android2os15IClientCallback10descriptorE;
- _ZN7android2os15IClientCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IClientCallback12default_implE;
- _ZN7android2os15IClientCallback14getDefaultImplEv;
- _ZN7android2os15IClientCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IClientCallbackC2Ev;
- _ZN7android2os15IClientCallbackD0Ev;
- _ZN7android2os15IClientCallbackD1Ev;
- _ZN7android2os15IClientCallbackD2Ev;
- _ZN7android2os15IServiceManager10descriptorE;
- _ZN7android2os15IServiceManager11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IServiceManager12default_implE;
- _ZN7android2os15IServiceManager14getDefaultImplEv;
- _ZN7android2os15IServiceManager14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IServiceManagerC2Ev;
- _ZN7android2os15IServiceManagerD0Ev;
- _ZN7android2os15IServiceManagerD1Ev;
- _ZN7android2os15IServiceManagerD2Ev;
- _ZN7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnClientCallbackC2Ev;
- _ZN7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnServiceManagerC2Ev;
- _ZN7android2os16BpClientCallback9onClientsERKNS_2spINS_7IBinderEEEb;
- _ZN7android2os16BpClientCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpClientCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10addServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEEbi;
- _ZN7android2os16BpServiceManager10getServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10isDeclaredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPb;
- _ZN7android2os16BpServiceManager12checkServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager12listServicesEiPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEE;
- _ZN7android2os16BpServiceManager16updatableViaApexERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_8optionalIS8_EE;
- _ZN7android2os16BpServiceManager19getServiceDebugInfoEPNSt3__16vectorINS0_16ServiceDebugInfoENS2_9allocatorIS4_EEEE;
- _ZN7android2os16BpServiceManager20getDeclaredInstancesERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_6vectorIS8_NS6_IS8_EEEE;
- _ZN7android2os16BpServiceManager20tryUnregisterServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager22registerClientCallbackERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEERKNSB_INS0_15IClientCallbackEEE;
- _ZN7android2os16BpServiceManager24registerForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManager26unregisterForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManagerC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManagerC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback10descriptorE;
- _ZN7android2os16IServiceCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback12default_implE;
- _ZN7android2os16IServiceCallback14getDefaultImplEv;
- _ZN7android2os16IServiceCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os16IServiceCallbackC2Ev;
- _ZN7android2os16IServiceCallbackD0Ev;
- _ZN7android2os16IServiceCallbackD1Ev;
- _ZN7android2os16IServiceCallbackD2Ev;
- _ZN7android2os16ParcelableHolder14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os16ServiceDebugInfo14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os17BnServiceCallbackC2Ev;
- _ZN7android2os17BpServiceCallback14onRegistrationERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17PersistableBundle10putBooleanERKNS_8String16Eb;
- _ZN7android2os17PersistableBundle12putIntVectorERKNS_8String16ERKNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZN7android2os17PersistableBundle13putLongVectorERKNS_8String16ERKNSt3__16vectorIxNS5_9allocatorIxEEEE;
- _ZN7android2os17PersistableBundle14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17PersistableBundle15putDoubleVectorERKNS_8String16ERKNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZN7android2os17PersistableBundle15putStringVectorERKNS_8String16ERKNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZN7android2os17PersistableBundle16putBooleanVectorERKNS_8String16ERKNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZN7android2os17PersistableBundle19readFromParcelInnerEPKNS_6ParcelEj;
- _ZN7android2os17PersistableBundle20putPersistableBundleERKNS_8String16ERKS1_;
- _ZN7android2os17PersistableBundle5eraseERKNS_8String16E;
- _ZN7android2os17PersistableBundle6putIntERKNS_8String16Ei;
- _ZN7android2os17PersistableBundle7putLongERKNS_8String16Ex;
- _ZN7android2os17PersistableBundle9putDoubleERKNS_8String16Ed;
- _ZN7android2os17PersistableBundle9putStringERKNS_8String16ES4_;
- _ZN7android2os20ParcelFileDescriptor14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os20ParcelFileDescriptorC1ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC1Ev;
- _ZN7android2os20ParcelFileDescriptorC2ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC2Ev;
- _ZN7android2os20ParcelFileDescriptorD0Ev;
- _ZN7android2os20ParcelFileDescriptorD1Ev;
- _ZN7android2os20ParcelFileDescriptorD2Ev;
- _ZN7android4aerrE;
- _ZN7android4alogE;
- _ZN7android4aoutE;
- _ZN7android6binder20LazyServiceRegistrar10reRegisterEv;
- _ZN7android6binder20LazyServiceRegistrar11getInstanceEv;
- _ZN7android6binder20LazyServiceRegistrar12forcePersistEb;
- _ZN7android6binder20LazyServiceRegistrar13tryUnregisterEv;
- _ZN7android6binder20LazyServiceRegistrar15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEbi;
- _ZN7android6binder20LazyServiceRegistrar25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder20LazyServiceRegistrarC1Ev;
- _ZN7android6binder20LazyServiceRegistrarC2Ev;
- _ZN7android6binder6Status11fromStatusTEi;
- _ZN7android6binder6Status12setExceptionEiRKNS_7String8E;
- _ZN7android6binder6Status14readFromParcelERKNS_6ParcelE;
- _ZN7android6binder6Status14setFromStatusTEi;
- _ZN7android6binder6Status17exceptionToStringEi;
- _ZN7android6binder6Status17fromExceptionCodeEi;
- _ZN7android6binder6Status17fromExceptionCodeEiPKc;
- _ZN7android6binder6Status17fromExceptionCodeEiRKNS_7String8E;
- _ZN7android6binder6Status23setServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status24fromServiceSpecificErrorEi;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiPKc;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status2okEv;
- _ZN7android6binder6StatusC1Eii;
- _ZN7android6binder6StatusC1EiiRKNS_7String8E;
- _ZN7android6binder6StatusC2Eii;
- _ZN7android6binder6StatusC2EiiRKNS_7String8E;
- _ZN7android6binder8internal21ClientCounterCallback10reRegisterEv;
- _ZN7android6binder8internal21ClientCounterCallback12forcePersistEb;
- _ZN7android6binder8internal21ClientCounterCallback13tryUnregisterEv;
- _ZN7android6binder8internal21ClientCounterCallback15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi;
- _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder8internal21ClientCounterCallbackC1Ev;
- _ZN7android6binder8internal21ClientCounterCallbackC2Ev;
- _ZN7android6Parcel10appendFromEPKS0_jj;
- _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;
- _ZN7android6Parcel10writeFloatEf;
- _ZN7android6Parcel10writeInt32Ei;
- _ZN7android6Parcel10writeInt64Ex;
- _ZN7android6Parcel11compareDataERKS0_;
- _ZN7android6Parcel11finishWriteEj;
- _ZN7android6Parcel11setDataSizeEj;
- _ZN7android6Parcel11writeDoubleEd;
- _ZN7android6Parcel11writeObjectERK18flat_binder_objectb;
- _ZN7android6Parcel11writeUint32Ej;
- _ZN7android6Parcel11writeUint64Ey;
- _ZN7android6Parcel12pushAllowFdsEb;
- _ZN7android6Parcel12restartWriteEj;
- _ZN7android6Parcel12writeCStringEPKc;
- _ZN7android6Parcel12writeInplaceEj;
- _ZN7android6Parcel12writePointerEj;
- _ZN7android6Parcel12writeString8EPKcj;
- _ZN7android6Parcel12writeString8ERKNS_7String8E;
- _ZN7android6Parcel13continueWriteEj;
- _ZN7android6Parcel13flattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13markForBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13writeString16EPKDsj;
- _ZN7android6Parcel13writeString16ERKNS_8String16E;
- _ZN7android6Parcel13writeString16ERKNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZN7android6Parcel13writeString16ERKNSt3__18optionalINS_8String16EEE;
- _ZN7android6Parcel13writeUnpaddedEPKvj;
- _ZN7android6Parcel14acquireObjectsEv;
- _ZN7android6Parcel14freeDataNoInitEv;
- _ZN7android6Parcel14releaseObjectsEv;
- _ZN7android6Parcel14writeByteArrayEjPKh;
- _ZN7android6Parcel15restoreAllowFdsEb;
- _ZN7android6Parcel15setDataCapacityEj;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZN7android6Parcel15writeInt32ArrayEjPKi;
- _ZN7android6Parcel15writeParcelableERKNS_10ParcelableE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__110unique_ptrINS1_6vectorIxNS1_9allocatorIxEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__16vectorIxNS1_9allocatorIxEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__18optionalINS1_6vectorIxNS1_9allocatorIxEEEEEE;
- _ZN7android6Parcel16writeNoExceptionEv;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZN7android6Parcel17writeNativeHandleEPK13native_handle;
- _ZN7android6Parcel17writeStrongBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__110unique_ptrINS1_6vectorIyNS1_9allocatorIyEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__16vectorIyNS1_9allocatorIyEEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__18optionalINS1_6vectorIyNS1_9allocatorIyEEEEEE;
- _ZN7android6Parcel18getGlobalAllocSizeEv;
- _ZN7android6Parcel19finishFlattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel19getGlobalAllocCountEv;
- _ZN7android6Parcel19ipcSetDataReferenceEPKhjPKyjPFvPS0_S2_jS4_jE;
- _ZN7android6Parcel19writeFileDescriptorEib;
- _ZN7android6Parcel19writeInterfaceTokenEPKDsj;
- _ZN7android6Parcel19writeInterfaceTokenERKNS_8String16E;
- _ZN7android6Parcel19writeString16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZN7android6Parcel20closeFileDescriptorsEv;
- _ZN7android6Parcel22writeDupFileDescriptorEi;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZN7android6Parcel25writeParcelFileDescriptorEib;
- _ZN7android6Parcel25writeUniqueFileDescriptorERKNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android6Parcel26writeRawNullableParcelableEPKNS_10ParcelableE;
- _ZN7android6Parcel27replaceCallingWorkSourceUidEj;
- _ZN7android6Parcel28writeDupParcelFileDescriptorEi;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZN7android6Parcel35writeDupImmutableBlobFileDescriptorEi;
- _ZN7android6Parcel4Blob4initEiPvjb;
- _ZN7android6Parcel4Blob5clearEv;
- _ZN7android6Parcel4Blob7releaseEv;
- _ZN7android6Parcel4BlobC1Ev;
- _ZN7android6Parcel4BlobC2Ev;
- _ZN7android6Parcel4BlobD1Ev;
- _ZN7android6Parcel4BlobD2Ev;
- _ZN7android6Parcel5writeEPKvj;
- _ZN7android6Parcel5writeERKNS0_26FlattenableHelperInterfaceE;
- _ZN7android6Parcel7setDataEPKhj;
- _ZN7android6Parcel8freeDataEv;
- _ZN7android6Parcel8growDataEj;
- _ZN7android6Parcel8setErrorEi;
- _ZN7android6Parcel9initStateEv;
- _ZN7android6Parcel9writeBlobEjbPNS0_12WritableBlobE;
- _ZN7android6Parcel9writeBoolEb;
- _ZN7android6Parcel9writeByteEa;
- _ZN7android6Parcel9writeCharEDs;
- _ZN7android6ParcelC1Ev;
- _ZN7android6ParcelC2Ev;
- _ZN7android6ParcelD1Ev;
- _ZN7android6ParcelD2Ev;
- _ZN7android7BBinder10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinder10pingBinderEv;
- _ZN7android7BBinder11getDebugPidEv;
- _ZN7android7BBinder11isInheritRtEv;
- _ZN7android7BBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android7BBinder11localBinderEv;
- _ZN7android7BBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android7BBinder12detachObjectEPKv;
- _ZN7android7BBinder12getExtensionEv;
- _ZN7android7BBinder12setExtensionERKNS_2spINS_7IBinderEEE;
- _ZN7android7BBinder12setInheritRtEb;
- _ZN7android7BBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android7BBinder15isRequestingSidEv;
- _ZN7android7BBinder16setRequestingSidEb;
- _ZN7android7BBinder17getOrCreateExtrasEv;
- _ZN7android7BBinder21getMinSchedulerPolicyEv;
- _ZN7android7BBinder21setMinSchedulerPolicyEii;
- _ZN7android7BBinder23getMinSchedulerPriorityEv;
- _ZN7android7BBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinderC1Ev;
- _ZN7android7BBinderC2Ev;
- _ZN7android7BBinderD0Ev;
- _ZN7android7BBinderD1Ev;
- _ZN7android7BBinderD2Ev;
- _ZN7android7content2pm18PackageChangeEvent14readFromParcelEPKNS_6ParcelE;
- _ZN7android7content2pm21IPackageManagerNative10descriptorE;
- _ZN7android7content2pm21IPackageManagerNative11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm21IPackageManagerNative12default_implE;
- _ZN7android7content2pm21IPackageManagerNative14getDefaultImplEv;
- _ZN7android7content2pm21IPackageManagerNative14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm21IPackageManagerNativeC2Ev;
- _ZN7android7content2pm21IPackageManagerNativeD0Ev;
- _ZN7android7content2pm21IPackageManagerNativeD1Ev;
- _ZN7android7content2pm21IPackageManagerNativeD2Ev;
- _ZN7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm22BnPackageManagerNativeC2Ev;
- _ZN7android7content2pm22BpPackageManagerNative14getAllPackagesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative15getNamesForUidsERKNSt3__16vectorIiNS3_9allocatorIiEEEEPNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS5_IcEEEENS5_ISE_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative16getLocationFlagsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPi;
- _ZN7android7content2pm22BpPackageManagerNative16hasSystemFeatureERKNS_8String16EiPb;
- _ZN7android7content2pm22BpPackageManagerNative19isPackageDebuggableERKNS_8String16EPb;
- _ZN7android7content2pm22BpPackageManagerNative22getInstallerForPackageERKNS_8String16EPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative24getVersionCodeForPackageERKNS_8String16EPx;
- _ZN7android7content2pm22BpPackageManagerNative27hasSha256SigningCertificateERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIhNS7_IhEEEEPb;
- _ZN7android7content2pm22BpPackageManagerNative28getModuleMetadataPackageNameEPNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29getTargetSdkVersionForPackageERKNS_8String16EPi;
- _ZN7android7content2pm22BpPackageManagerNative29isAudioPlaybackCaptureAllowedERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEPNS4_IbNS8_IbEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29registerPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNative31unregisterPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver10descriptorE;
- _ZN7android7content2pm22IPackageChangeObserver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver12default_implE;
- _ZN7android7content2pm22IPackageChangeObserver14getDefaultImplEv;
- _ZN7android7content2pm22IPackageChangeObserver14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm22IPackageChangeObserverC2Ev;
- _ZN7android7content2pm22IPackageChangeObserverD0Ev;
- _ZN7android7content2pm22IPackageChangeObserverD1Ev;
- _ZN7android7content2pm22IPackageChangeObserverD2Ev;
- _ZN7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm23BnPackageChangeObserverC2Ev;
- _ZN7android7content2pm23BpPackageChangeObserver16onPackageChangedERKNS1_18PackageChangeEventE;
- _ZN7android7content2pm23BpPackageChangeObserverC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm23BpPackageChangeObserverC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7HexDumpC1EPKvjj;
- _ZN7android7HexDumpC2EPKvjj;
- _ZN7android7IBinder11getDebugPidEPi;
- _ZN7android7IBinder11localBinderEv;
- _ZN7android7IBinder12getExtensionEPNS_2spIS0_EE;
- _ZN7android7IBinder12remoteBinderEv;
- _ZN7android7IBinder12shellCommandERKNS_2spIS0_EEiiiRNS_6VectorINS_8String16EEERKNS1_INS_14IShellCallbackEEERKNS1_INS_15IResultReceiverEEE;
- _ZN7android7IBinder19queryLocalInterfaceERKNS_8String16E;
- _ZN7android7IBinderC2Ev;
- _ZN7android7IBinderD0Ev;
- _ZN7android7IBinderD1Ev;
- _ZN7android7IBinderD2Ev;
- _ZN7android7IMemory10descriptorE;
- _ZN7android7IMemory11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7IMemory12default_implE;
- _ZN7android7IMemory14getDefaultImplEv;
- _ZN7android7IMemory14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android7IMemoryC2Ev;
- _ZN7android7IMemoryD0Ev;
- _ZN7android7IMemoryD1Ev;
- _ZN7android7IMemoryD2Ev;
- _ZN7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BnMemoryC2Ev;
- _ZN7android8BnMemoryD0Ev;
- _ZN7android8BnMemoryD1Ev;
- _ZN7android8BnMemoryD2Ev;
- _ZN7android8BpBinder10onFirstRefEv;
- _ZN7android8BpBinder10pingBinderEv;
- _ZN7android8BpBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android8BpBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android8BpBinder12detachObjectEPKv;
- _ZN7android8BpBinder12remoteBinderEv;
- _ZN7android8BpBinder12sendObituaryEv;
- _ZN7android8BpBinder12sTrackingMapE;
- _ZN7android8BpBinder13getCountByUidERNS_6VectorIjEES3_;
- _ZN7android8BpBinder13ObjectManager4killEv;
- _ZN7android8BpBinder13ObjectManager6attachEPKvPvS4_PFvS3_S4_S4_E;
- _ZN7android8BpBinder13ObjectManager6detachEPKv;
- _ZN7android8BpBinder13ObjectManagerC1Ev;
- _ZN7android8BpBinder13ObjectManagerC2Ev;
- _ZN7android8BpBinder13ObjectManagerD1Ev;
- _ZN7android8BpBinder13ObjectManagerD2Ev;
- _ZN7android8BpBinder13sTrackingLockE;
- _ZN7android8BpBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android8BpBinder14reportOneDeathERKNS0_8ObituaryE;
- _ZN7android8BpBinder14sLimitCallbackE;
- _ZN7android8BpBinder15onLastStrongRefEPKv;
- _ZN7android8BpBinder15sNumTrackedUidsE;
- _ZN7android8BpBinder16enableCountByUidEv;
- _ZN7android8BpBinder16setLimitCallbackEPFviE;
- _ZN7android8BpBinder17disableCountByUidEv;
- _ZN7android8BpBinder18sCountByUidEnabledE;
- _ZN7android8BpBinder19getBinderProxyCountEj;
- _ZN7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZN7android8BpBinder20setCountByUidEnabledEb;
- _ZN7android8BpBinder26sBinderProxyThrottleCreateE;
- _ZN7android8BpBinder29sBinderProxyCountLowWatermarkE;
- _ZN7android8BpBinder29setBinderProxyCountWatermarksEii;
- _ZN7android8BpBinder30sBinderProxyCountHighWatermarkE;
- _ZN7android8BpBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android8BpBinder6createEi;
- _ZN7android8BpBinder6createERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BpBinderC1EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC1EONS0_9RpcHandleE;
- _ZN7android8BpBinderC1EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderC2EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC2EONS0_9RpcHandleE;
- _ZN7android8BpBinderC2EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderD0Ev;
- _ZN7android8BpBinderD1Ev;
- _ZN7android8BpBinderD2Ev;
- _ZN7android8BpMemoryC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryD0Ev;
- _ZN7android8BpMemoryD1Ev;
- _ZN7android8BpMemoryD2Ev;
- _ZN7android8internal9Stability11getCategoryEPNS_7IBinderE;
- _ZN7android8internal9Stability11levelStringENS1_5LevelE;
- _ZN7android8internal9Stability13getLocalLevelEv;
- _ZN7android8internal9Stability15isDeclaredLevelENS1_5LevelE;
- _ZN7android8internal9Stability17debugLogStabilityERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability19markCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability22tryMarkCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability24requiresVintfDeclarationERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability25forceDowngradeToStabilityERKNS_2spINS_7IBinderEEENS1_5LevelE;
- _ZN7android8internal9Stability30forceDowngradeToLocalStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToSystemStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToVendorStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability5checkENS1_8CategoryENS1_5LevelE;
- _ZN7android8internal9Stability7setReprEPNS_7IBinderEij;
- _ZN7android8internal9Stability8Category11debugStringEv;
- _ZN7android8internal9Stability8markVndkEPNS_7IBinderE;
- _ZN7android8internal9Stability9markVintfEPNS_7IBinderE;
- _ZN7android8RpcState11CommandDataC1Ej;
- _ZN7android8RpcState11CommandDataC2Ej;
- _ZN7android8RpcState12countBindersEv;
- _ZN7android8RpcState12getSessionIdERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPi;
- _ZN7android8RpcState12waitForReplyERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPNS_6ParcelE;
- _ZN7android8RpcState13getMaxThreadsERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPj;
- _ZN7android8RpcState13getRootObjectERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState13sendDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressE;
- _ZN7android8RpcState15onBinderLeavingERKNS_2spINS_10RpcSessionEEERKNS1_INS_7IBinderEEEPNS_10RpcAddressE;
- _ZN7android8RpcState15processTransactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState16onBinderEnteringERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8RpcState16processDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState20getAndExecuteCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState20processServerCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState23processTransactInternalERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEENS0_11CommandDataE;
- _ZN7android8RpcState4dumpEv;
- _ZN7android8RpcState6rpcRecERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPvj;
- _ZN7android8RpcState7rpcSendERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPKvj;
- _ZN7android8RpcState8transactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressEjRKNS_6ParcelERKNS_2spINS_10RpcSessionEEEPSA_j;
- _ZN7android8RpcState9terminateEv;
- _ZN7android8RpcStateC1Ev;
- _ZN7android8RpcStateC2Ev;
- _ZN7android8RpcStateD1Ev;
- _ZN7android8RpcStateD2Ev;
- _ZN7android9BpRefBase10onFirstRefEv;
- _ZN7android9BpRefBase15onLastStrongRefEPKv;
- _ZN7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZN7android9BpRefBaseC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseD0Ev;
- _ZN7android9BpRefBaseD1Ev;
- _ZN7android9BpRefBaseD2Ev;
- _ZN7android9HeapCache10binderDiedERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCache10dump_heapsEv;
- _ZN7android9HeapCache8get_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9find_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCacheC1Ev;
- _ZN7android9HeapCacheC2Ev;
- _ZN7android9HeapCacheD0Ev;
- _ZN7android9HeapCacheD1Ev;
- _ZN7android9HeapCacheD2Ev;
- _ZN7android9hexStringEPKvj;
- _ZN7android9RpcServer12listSessionsEv;
- _ZN7android9RpcServer13getMaxThreadsEv;
- _ZN7android9RpcServer13getRootObjectEv;
- _ZN7android9RpcServer13releaseServerEv;
- _ZN7android9RpcServer13setMaxThreadsEj;
- _ZN7android9RpcServer13setRootObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android9RpcServer15setupInetServerEjPj;
- _ZN7android9RpcServer16setupVsockServerEj;
- _ZN7android9RpcServer17setRootObjectWeakERKNS_2wpINS_7IBinderEEE;
- _ZN7android9RpcServer17setupSocketServerERKNS_16RpcSocketAddressE;
- _ZN7android9RpcServer19establishConnectionEONS_2spIS0_EENS_4base14unique_fd_implINS4_13DefaultCloserEEE;
- _ZN7android9RpcServer19setupExternalServerENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android9RpcServer20onSessionTerminatingERKNS_2spINS_10RpcSessionEEE;
- _ZN7android9RpcServer21setupUnixDomainServerEPKc;
- _ZN7android9RpcServer24numUninitializedSessionsEv;
- _ZN7android9RpcServer4joinEv;
- _ZN7android9RpcServer4makeEv;
- _ZN7android9RpcServer61iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProductionEv;
- _ZN7android9RpcServer9acceptOneEv;
- _ZN7android9RpcServer9hasServerEv;
- _ZN7android9RpcServerC1Ev;
- _ZN7android9RpcServerC2Ev;
- _ZN7android9RpcServerD0Ev;
- _ZN7android9RpcServerD1Ev;
- _ZN7android9RpcServerD2Ev;
- _ZN7android9SingletonINS_15PermissionCacheEE11getInstanceEv;
- _ZN7android9SingletonINS_15PermissionCacheEE11hasInstanceEv;
- _ZN7android9SingletonINS_15PermissionCacheEE5sLockE;
- _ZN7android9SingletonINS_15PermissionCacheEE9sInstanceE;
- _ZN7android9SingletonINS_15PermissionCacheEEC1Ev;
- _ZN7android9SingletonINS_15PermissionCacheEEC2Ev;
- _ZN7android9SingletonINS_15PermissionCacheEED1Ev;
- _ZN7android9SingletonINS_15PermissionCacheEED2Ev;
- _ZN7androidlsERNS_10TextOutputERKNS_7HexDumpE;
- _ZN7androidlsERNS_10TextOutputERKNS_8TypeCodeE;
- _ZN7androidlsIA15_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA24_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA2_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA34_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA3_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA43_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA4_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA5_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA8_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA9_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIjEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEERNS_10TextOutputES9_RKT_;
- _ZN7androidlsIPcEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIPvEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIyEERNS_10TextOutputES2_RKT_;
- _ZNK7android10MemoryBase9getMemoryEPiPj;
- _ZNK7android10RpcAddress13writeToParcelEPNS_6ParcelE;
- _ZNK7android10RpcAddress15viewRawEmbeddedEv;
- _ZNK7android10RpcAddress6isZeroEv;
- _ZNK7android10RpcAddress8toStringEv;
- _ZNK7android10RpcAddressltERKS0_;
- _ZNK7android11IMemoryHeap22getInterfaceDescriptorEv;
- _ZNK7android12BpMemoryHeap12assertMappedEv;
- _ZNK7android12BpMemoryHeap18assertReallyMappedEv;
- _ZNK7android12BpMemoryHeap7getBaseEv;
- _ZNK7android12BpMemoryHeap7getSizeEv;
- _ZNK7android12BpMemoryHeap8getFlagsEv;
- _ZNK7android12BpMemoryHeap9getHeapIDEv;
- _ZNK7android12BpMemoryHeap9getOffsetEv;
- _ZNK7android12MemoryDealer4dumpEPKc;
- _ZNK7android12MemoryDealer4heapEv;
- _ZNK7android12MemoryDealer9allocatorEv;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE10do_compareEPKvS5_;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE15do_move_forwardEPvPKvj;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE16do_move_backwardEPvPKvj;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE7do_copyEPvPKvj;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE8do_splatEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_compareEPKvSA_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE15do_move_forwardEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE16do_move_backwardEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE7do_copyEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE8do_splatEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_compareES3_S3_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE15do_move_forwardEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE16do_move_backwardEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE7do_copyEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE8do_splatEPvS3_j;
- _ZNK7android12SortedVectorINS_8String16EE10do_compareEPKvS4_;
- _ZNK7android12SortedVectorINS_8String16EE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_8String16EE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_8String16EE15do_move_forwardEPvPKvj;
- _ZNK7android12SortedVectorINS_8String16EE16do_move_backwardEPvPKvj;
- _ZNK7android12SortedVectorINS_8String16EE7do_copyEPvPKvj;
- _ZNK7android12SortedVectorINS_8String16EE8do_splatEPvPKvj;
- _ZNK7android14IPCThreadState13getCallingPidEv;
- _ZNK7android14IPCThreadState13getCallingSidEv;
- _ZNK7android14IPCThreadState13getCallingUidEv;
- _ZNK7android14IPCThreadState18getCallRestrictionEv;
- _ZNK7android14IPCThreadState19getStrictModePolicyEv;
- _ZNK7android14IPCThreadState22getServingStackPointerEv;
- _ZNK7android14IPCThreadState23getCallingWorkSourceUidEv;
- _ZNK7android14IPCThreadState25shouldPropagateWorkSourceEv;
- _ZNK7android14IPCThreadState29getLastTransactionBinderFlagsEv;
- _ZNK7android14IShellCallback22getInterfaceDescriptorEv;
- _ZNK7android14MemoryHeapBase7getBaseEv;
- _ZNK7android14MemoryHeapBase7getSizeEv;
- _ZNK7android14MemoryHeapBase8getFlagsEv;
- _ZNK7android14MemoryHeapBase9getDeviceEv;
- _ZNK7android14MemoryHeapBase9getHeapIDEv;
- _ZNK7android14MemoryHeapBase9getOffsetEv;
- _ZNK7android15IResultReceiver22getInterfaceDescriptorEv;
- _ZNK7android15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android15PermissionCache5checkEPbRKNS_8String16Ej;
- _ZNK7android18BufferedTextOutput9getBufferEv;
- _ZNK7android18ServiceManagerShim10getServiceERKNS_8String16E;
- _ZNK7android18ServiceManagerShim12checkServiceERKNS_8String16E;
- _ZNK7android21IPermissionController22getInterfaceDescriptorEv;
- _ZNK7android22SimpleBestFitAllocator4dumpEPKc;
- _ZNK7android22SimpleBestFitAllocator4dumpERNS_7String8EPKc;
- _ZNK7android22SimpleBestFitAllocator4sizeEv;
- _ZNK7android22SimpleBestFitAllocator6dump_lEPKc;
- _ZNK7android22SimpleBestFitAllocator6dump_lERNS_7String8EPKc;
- _ZNK7android2os15IClientCallback22getInterfaceDescriptorEv;
- _ZNK7android2os15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android2os16IServiceCallback22getInterfaceDescriptorEv;
- _ZNK7android2os16ParcelableHolder13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os16ServiceDebugInfo13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle10getBooleanERKNS_8String16EPb;
- _ZNK7android2os17PersistableBundle10getIntKeysEv;
- _ZNK7android2os17PersistableBundle11getLongKeysEv;
- _ZNK7android2os17PersistableBundle12getIntVectorERKNS_8String16EPNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZNK7android2os17PersistableBundle13getDoubleKeysEv;
- _ZNK7android2os17PersistableBundle13getLongVectorERKNS_8String16EPNSt3__16vectorIxNS5_9allocatorIxEEEE;
- _ZNK7android2os17PersistableBundle13getStringKeysEv;
- _ZNK7android2os17PersistableBundle13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle14getBooleanKeysEv;
- _ZNK7android2os17PersistableBundle15getDoubleVectorERKNS_8String16EPNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZNK7android2os17PersistableBundle15getStringVectorERKNS_8String16EPNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZNK7android2os17PersistableBundle16getBooleanVectorERKNS_8String16EPNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZNK7android2os17PersistableBundle16getIntVectorKeysEv;
- _ZNK7android2os17PersistableBundle17getLongVectorKeysEv;
- _ZNK7android2os17PersistableBundle18writeToParcelInnerEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle19getDoubleVectorKeysEv;
- _ZNK7android2os17PersistableBundle19getStringVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getBooleanVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getPersistableBundleERKNS_8String16EPS1_;
- _ZNK7android2os17PersistableBundle24getPersistableBundleKeysEv;
- _ZNK7android2os17PersistableBundle4sizeEv;
- _ZNK7android2os17PersistableBundle5emptyEv;
- _ZNK7android2os17PersistableBundle6getIntERKNS_8String16EPi;
- _ZNK7android2os17PersistableBundle7getLongERKNS_8String16EPx;
- _ZNK7android2os17PersistableBundle9getDoubleERKNS_8String16EPd;
- _ZNK7android2os17PersistableBundle9getStringERKNS_8String16EPS2_;
- _ZNK7android2os20ParcelFileDescriptor13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status9toString8Ev;
- _ZNK7android6Parcel10errorCheckEv;
- _ZNK7android6Parcel10ipcObjectsEv;
- _ZNK7android6Parcel10readDoubleEPd;
- _ZNK7android6Parcel10readDoubleEv;
- _ZNK7android6Parcel10readObjectEb;
- _ZNK7android6Parcel10readUint32EPj;
- _ZNK7android6Parcel10readUint32Ev;
- _ZNK7android6Parcel10readUint64EPy;
- _ZNK7android6Parcel10readUint64Ev;
- _ZNK7android6Parcel10scanForFdsEv;
- _ZNK7android6Parcel11ipcDataSizeEv;
- _ZNK7android6Parcel11readCStringEv;
- _ZNK7android6Parcel11readInplaceEj;
- _ZNK7android6Parcel11readPointerEPj;
- _ZNK7android6Parcel11readPointerEv;
- _ZNK7android6Parcel11readString8EPNS_7String8E;
- _ZNK7android6Parcel11readString8Ev;
- _ZNK7android6Parcel12dataCapacityEv;
- _ZNK7android6Parcel12dataPositionEv;
- _ZNK7android6Parcel12objectsCountEv;
- _ZNK7android6Parcel12readString16EPNS_8String16E;
- _ZNK7android6Parcel12readString16EPNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZNK7android6Parcel12readString16EPNSt3__18optionalINS_8String16EEE;
- _ZNK7android6Parcel12readString16Ev;
- _ZNK7android6Parcel13markSensitiveEv;
- _ZNK7android6Parcel14checkInterfaceEPNS_7IBinderE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZNK7android6Parcel14readParcelableEPNS_10ParcelableE;
- _ZNK7android6Parcel15ipcObjectsCountEv;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__110unique_ptrINS1_6vectorIxNS1_9allocatorIxEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__16vectorIxNS1_9allocatorIxEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__18optionalINS1_6vectorIxNS1_9allocatorIxEEEEEE;
- _ZNK7android6Parcel15setDataPositionEj;
- _ZNK7android6Parcel15unflattenBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16enforceInterfaceEPKDsjPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16enforceInterfaceERKNS_8String16EPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZNK7android6Parcel16readNativeHandleEv;
- _ZNK7android6Parcel16readStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16readStrongBinderEv;
- _ZNK7android6Parcel16readStrongBinderINS_2os15IClientCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_2os16IServiceCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_7content2pm22IPackageChangeObserverEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__110unique_ptrINS1_6vectorIyNS1_9allocatorIyEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__16vectorIyNS1_9allocatorIyEEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__18optionalINS1_6vectorIyNS1_9allocatorIyEEEEEE;
- _ZNK7android6Parcel16validateReadDataEj;
- _ZNK7android6Parcel17getBlobAshmemSizeEv;
- _ZNK7android6Parcel17getOpenAshmemSizeEv;
- _ZNK7android6Parcel17readExceptionCodeEv;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZNK7android6Parcel18hasFileDescriptorsEv;
- _ZNK7android6Parcel18readFileDescriptorEv;
- _ZNK7android6Parcel18readString16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZNK7android6Parcel18readString8InplaceEPj;
- _ZNK7android6Parcel19readString16InplaceEPj;
- _ZNK7android6Parcel21finishUnflattenBinderERKNS_2spINS_7IBinderEEEPS3_;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZNK7android6Parcel24readCallingWorkSourceUidEv;
- _ZNK7android6Parcel24readNullableStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel24readParcelFileDescriptorEv;
- _ZNK7android6Parcel24readUniqueFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZNK7android6Parcel30readUniqueParcelFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel37updateWorkSourceRequestHeaderPositionEv;
- _ZNK7android6Parcel4dataEv;
- _ZNK7android6Parcel4readEPvj;
- _ZNK7android6Parcel4readERNS0_26FlattenableHelperInterfaceE;
- _ZNK7android6Parcel5printERNS_10TextOutputEj;
- _ZNK7android6Parcel7ipcDataEv;
- _ZNK7android6Parcel8allowFdsEv;
- _ZNK7android6Parcel8dataSizeEv;
- _ZNK7android6Parcel8isForRpcEv;
- _ZNK7android6Parcel8readBlobEjPNS0_12ReadableBlobE;
- _ZNK7android6Parcel8readBoolEPb;
- _ZNK7android6Parcel8readBoolEv;
- _ZNK7android6Parcel8readByteEPa;
- _ZNK7android6Parcel8readByteEv;
- _ZNK7android6Parcel8readCharEPDs;
- _ZNK7android6Parcel8readCharEv;
- _ZNK7android6Parcel9dataAvailEv;
- _ZNK7android6Parcel9readFloatEPf;
- _ZNK7android6Parcel9readFloatEv;
- _ZNK7android6Parcel9readInt32EPi;
- _ZNK7android6Parcel9readInt32Ev;
- _ZNK7android6Parcel9readInt64EPx;
- _ZNK7android6Parcel9readInt64Ev;
- _ZNK7android6VectorIiE10do_destroyEPvj;
- _ZNK7android6VectorIiE12do_constructEPvj;
- _ZNK7android6VectorIiE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIiE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIiE7do_copyEPvPKvj;
- _ZNK7android6VectorIiE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE10do_destroyEPvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE12do_constructEPvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE10do_destroyEPvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE12do_constructEPvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE10do_destroyEPvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE12do_constructEPvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_8String16EE10do_destroyEPvj;
- _ZNK7android6VectorINS_8String16EE12do_constructEPvj;
- _ZNK7android6VectorINS_8String16EE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_8String16EE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_8String16EE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_8String16EE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7BBinderEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7BBinderEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7RefBaseEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7RefBaseEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE8do_splatEPvPKvj;
- _ZNK7android7BBinder10findObjectEPKv;
- _ZNK7android7BBinder13isBinderAliveEv;
- _ZNK7android7BBinder22getInterfaceDescriptorEv;
- _ZNK7android7content2pm18PackageChangeEvent13writeToParcelEPNS_6ParcelE;
- _ZNK7android7content2pm21IPackageManagerNative22getInterfaceDescriptorEv;
- _ZNK7android7content2pm22IPackageChangeObserver22getInterfaceDescriptorEv;
- _ZNK7android7IBinder13checkSubclassEPKv;
- _ZNK7android7IMemory11fastPointerERKNS_2spINS_7IBinderEEEi;
- _ZNK7android7IMemory15unsecurePointerEv;
- _ZNK7android7IMemory22getInterfaceDescriptorEv;
- _ZNK7android7IMemory4sizeEv;
- _ZNK7android7IMemory6offsetEv;
- _ZNK7android7IMemory7pointerEv;
- _ZNK7android8BpBinder10findObjectEPKv;
- _ZNK7android8BpBinder10rpcAddressEv;
- _ZNK7android8BpBinder10rpcSessionEv;
- _ZNK7android8BpBinder11isRpcBinderEv;
- _ZNK7android8BpBinder12binderHandleEv;
- _ZNK7android8BpBinder13isBinderAliveEv;
- _ZNK7android8BpBinder13ObjectManager4findEPKv;
- _ZNK7android8BpBinder18isDescriptorCachedEv;
- _ZNK7android8BpBinder22getInterfaceDescriptorEv;
- _ZNK7android8BpMemory9getMemoryEPiPj;
- _ZTCN7android10AllocationE0_NS_10IInterfaceE;
- _ZTCN7android10AllocationE0_NS_10MemoryBaseE;
- _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10AllocationE0_NS_7IMemoryE;
- _ZTCN7android10AllocationE0_NS_8BnMemoryE;
- _ZTCN7android10AllocationE4_NS_7BBinderE;
- _ZTCN7android10AllocationE4_NS_7IBinderE;
- _ZTCN7android10MemoryBaseE0_NS_10IInterfaceE;
- _ZTCN7android10MemoryBaseE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10MemoryBaseE0_NS_7IMemoryE;
- _ZTCN7android10MemoryBaseE0_NS_8BnMemoryE;
- _ZTCN7android10MemoryBaseE4_NS_7BBinderE;
- _ZTCN7android10MemoryBaseE4_NS_7IBinderE;
- _ZTCN7android10PoolThreadE0_NS_6ThreadE;
- _ZTCN7android11IMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BnMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BnMemoryHeapE4_NS_7BBinderE;
- _ZTCN7android12BnMemoryHeapE4_NS_7IBinderE;
- _ZTCN7android12BpMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BpMemoryHeapE0_NS_11BpInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BpMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BpMemoryHeapE4_NS_9BpRefBaseE;
- _ZTCN7android14IShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE32_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE32_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android14MemoryHeapBaseE32_NS_11IMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE32_NS_12BnMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE36_NS_7BBinderE;
- _ZTCN7android14MemoryHeapBaseE36_NS_7IBinderE;
- _ZTCN7android15BnShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BnShellCallbackE0_NS_11BnInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BnShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BnShellCallbackE4_NS_7BBinderE;
- _ZTCN7android15BnShellCallbackE4_NS_7IBinderE;
- _ZTCN7android15BpShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BpShellCallbackE0_NS_11BpInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BpShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BpShellCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android15IResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_11BnInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BnResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BnResultReceiverE4_NS_7BBinderE;
- _ZTCN7android16BnResultReceiverE4_NS_7IBinderE;
- _ZTCN7android16BpResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BpResultReceiverE0_NS_11BpInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BpResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BpResultReceiverE4_NS_9BpRefBaseE;
- _ZTCN7android18ServiceManagerShimE0_NS_10IInterfaceE;
- _ZTCN7android18ServiceManagerShimE0_NS_15IServiceManagerE;
- _ZTCN7android21IPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BnPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BnPermissionControllerE0_NS_11BnInterfaceINS_21IPermissionControllerEEE;
- _ZTCN7android22BnPermissionControllerE0_NS_21IPermissionControllerE;
- _ZTCN7android22BnPermissionControllerE4_NS_7BBinderE;
- _ZTCN7android22BnPermissionControllerE4_NS_7IBinderE;
- _ZTCN7android22BpPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BpPermissionControllerE0_NS_11BpInterfaceINS_21IPermissionControllerEEE;
- _ZTCN7android22BpPermissionControllerE0_NS_21IPermissionControllerE;
- _ZTCN7android22BpPermissionControllerE4_NS_9BpRefBaseE;
- _ZTCN7android2os15IClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BnClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS_11BnInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BnClientCallbackE4_NS_7BBinderE;
- _ZTCN7android2os16BnClientCallbackE4_NS_7IBinderE;
- _ZTCN7android2os16BnServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BnServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnServiceManagerE0_NS_11BnInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BnServiceManagerE4_NS_7BBinderE;
- _ZTCN7android2os16BnServiceManagerE4_NS_7IBinderE;
- _ZTCN7android2os16BpClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BpClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpClientCallbackE0_NS_11BpInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BpClientCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android2os16BpServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BpServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpServiceManagerE0_NS_11BpInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BpServiceManagerE4_NS_9BpRefBaseE;
- _ZTCN7android2os16IServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_11BnInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BnServiceCallbackE4_NS_7BBinderE;
- _ZTCN7android2os17BnServiceCallbackE4_NS_7IBinderE;
- _ZTCN7android2os17BpServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BpServiceCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android7BBinderE0_NS_7IBinderE;
- _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_11BnInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE4_NS_7BBinderE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE4_NS_7IBinderE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_11BpInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE4_NS_9BpRefBaseE;
- _ZTCN7android7content2pm22IPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_11BnInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE4_NS_7BBinderE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE4_NS_7IBinderE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_11BpInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE4_NS_9BpRefBaseE;
- _ZTCN7android7IMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BnMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BnMemoryE4_NS_7BBinderE;
- _ZTCN7android8BnMemoryE4_NS_7IBinderE;
- _ZTCN7android8BpBinderE0_NS_7IBinderE;
- _ZTCN7android8BpMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BpMemoryE0_NS_11BpInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BpMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BpMemoryE4_NS_9BpRefBaseE;
- _ZTCN7android9HeapCacheE0_NS_7IBinder14DeathRecipientE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE8_NS_13basic_ostreamIcS2_EE;
- _ZThn4_N7android10AllocationD0Ev;
- _ZThn4_N7android10AllocationD1Ev;
- _ZThn4_N7android10MemoryBaseD0Ev;
- _ZThn4_N7android10MemoryBaseD1Ev;
- _ZThn4_N7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android12BnMemoryHeapD0Ev;
- _ZThn4_N7android12BnMemoryHeapD1Ev;
- _ZThn4_N7android12BpMemoryHeapD0Ev;
- _ZThn4_N7android12BpMemoryHeapD1Ev;
- _ZThn4_N7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android22BnPermissionController10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn4_N7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn4_N7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android8BnMemoryD0Ev;
- _ZThn4_N7android8BnMemoryD1Ev;
- _ZThn4_N7android8BpMemoryD0Ev;
- _ZThn4_N7android8BpMemoryD1Ev;
- _ZTTN7android10AllocationE;
- _ZTTN7android10IInterfaceE;
- _ZTTN7android10MemoryBaseE;
- _ZTTN7android10PoolThreadE;
- _ZTTN7android10RpcSessionE;
- _ZTTN7android11IMemoryHeapE;
- _ZTTN7android12BnMemoryHeapE;
- _ZTTN7android12BpMemoryHeapE;
- _ZTTN7android12ProcessStateE;
- _ZTTN7android14IShellCallbackE;
- _ZTTN7android14MemoryHeapBaseE;
- _ZTTN7android15BnShellCallbackE;
- _ZTTN7android15BpShellCallbackE;
- _ZTTN7android15IResultReceiverE;
- _ZTTN7android15IServiceManagerE;
- _ZTTN7android16BnResultReceiverE;
- _ZTTN7android16BpResultReceiverE;
- _ZTTN7android18ServiceManagerShimE;
- _ZTTN7android21IPermissionControllerE;
- _ZTTN7android22BnPermissionControllerE;
- _ZTTN7android22BpPermissionControllerE;
- _ZTTN7android2os15IClientCallbackE;
- _ZTTN7android2os15IServiceManagerE;
- _ZTTN7android2os16BnClientCallbackE;
- _ZTTN7android2os16BnServiceManagerE;
- _ZTTN7android2os16BpClientCallbackE;
- _ZTTN7android2os16BpServiceManagerE;
- _ZTTN7android2os16IServiceCallbackE;
- _ZTTN7android2os17BnServiceCallbackE;
- _ZTTN7android2os17BpServiceCallbackE;
- _ZTTN7android7BBinderE;
- _ZTTN7android7content2pm21IPackageManagerNativeE;
- _ZTTN7android7content2pm22BnPackageManagerNativeE;
- _ZTTN7android7content2pm22BpPackageManagerNativeE;
- _ZTTN7android7content2pm22IPackageChangeObserverE;
- _ZTTN7android7content2pm23BnPackageChangeObserverE;
- _ZTTN7android7content2pm23BpPackageChangeObserverE;
- _ZTTN7android7IBinderE;
- _ZTTN7android7IMemoryE;
- _ZTTN7android8BnMemoryE;
- _ZTTN7android8BpBinderE;
- _ZTTN7android8BpMemoryE;
- _ZTTN7android9BpRefBaseE;
- _ZTTN7android9HeapCacheE;
- _ZTTN7android9RpcServerE;
- _ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
- _ZTv0_n12_N7android10AllocationD0Ev;
- _ZTv0_n12_N7android10AllocationD1Ev;
- _ZTv0_n12_N7android10IInterfaceD0Ev;
- _ZTv0_n12_N7android10IInterfaceD1Ev;
- _ZTv0_n12_N7android10MemoryBaseD0Ev;
- _ZTv0_n12_N7android10MemoryBaseD1Ev;
- _ZTv0_n12_N7android10RpcSessionD0Ev;
- _ZTv0_n12_N7android10RpcSessionD1Ev;
- _ZTv0_n12_N7android11IMemoryHeapD0Ev;
- _ZTv0_n12_N7android11IMemoryHeapD1Ev;
- _ZTv0_n12_N7android12BnMemoryHeapD0Ev;
- _ZTv0_n12_N7android12BnMemoryHeapD1Ev;
- _ZTv0_n12_N7android12BpMemoryHeapD0Ev;
- _ZTv0_n12_N7android12BpMemoryHeapD1Ev;
- _ZTv0_n12_N7android12ProcessStateD0Ev;
- _ZTv0_n12_N7android12ProcessStateD1Ev;
- _ZTv0_n12_N7android14IShellCallbackD0Ev;
- _ZTv0_n12_N7android14IShellCallbackD1Ev;
- _ZTv0_n12_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n12_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n12_N7android15IResultReceiverD0Ev;
- _ZTv0_n12_N7android15IResultReceiverD1Ev;
- _ZTv0_n12_N7android15IServiceManagerD0Ev;
- _ZTv0_n12_N7android15IServiceManagerD1Ev;
- _ZTv0_n12_N7android21IPermissionControllerD0Ev;
- _ZTv0_n12_N7android21IPermissionControllerD1Ev;
- _ZTv0_n12_N7android2os15IClientCallbackD0Ev;
- _ZTv0_n12_N7android2os15IClientCallbackD1Ev;
- _ZTv0_n12_N7android2os15IServiceManagerD0Ev;
- _ZTv0_n12_N7android2os15IServiceManagerD1Ev;
- _ZTv0_n12_N7android2os16IServiceCallbackD0Ev;
- _ZTv0_n12_N7android2os16IServiceCallbackD1Ev;
- _ZTv0_n12_N7android7BBinderD0Ev;
- _ZTv0_n12_N7android7BBinderD1Ev;
- _ZTv0_n12_N7android7content2pm21IPackageManagerNativeD0Ev;
- _ZTv0_n12_N7android7content2pm21IPackageManagerNativeD1Ev;
- _ZTv0_n12_N7android7content2pm22IPackageChangeObserverD0Ev;
- _ZTv0_n12_N7android7content2pm22IPackageChangeObserverD1Ev;
- _ZTv0_n12_N7android7IBinderD0Ev;
- _ZTv0_n12_N7android7IBinderD1Ev;
- _ZTv0_n12_N7android7IMemoryD0Ev;
- _ZTv0_n12_N7android7IMemoryD1Ev;
- _ZTv0_n12_N7android8BnMemoryD0Ev;
- _ZTv0_n12_N7android8BnMemoryD1Ev;
- _ZTv0_n12_N7android8BpBinderD0Ev;
- _ZTv0_n12_N7android8BpBinderD1Ev;
- _ZTv0_n12_N7android8BpMemoryD0Ev;
- _ZTv0_n12_N7android8BpMemoryD1Ev;
- _ZTv0_n12_N7android9BpRefBaseD0Ev;
- _ZTv0_n12_N7android9BpRefBaseD1Ev;
- _ZTv0_n12_N7android9HeapCacheD0Ev;
- _ZTv0_n12_N7android9HeapCacheD1Ev;
- _ZTv0_n12_N7android9RpcServerD0Ev;
- _ZTv0_n12_N7android9RpcServerD1Ev;
- _ZTv0_n16_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n16_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n16_N7android8BpBinder10onFirstRefEv;
- _ZTv0_n16_N7android9BpRefBase10onFirstRefEv;
- _ZTv0_n20_N7android8BpBinder15onLastStrongRefEPKv;
- _ZTv0_n20_N7android9BpRefBase15onLastStrongRefEPKv;
- _ZTv0_n24_N7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZTv0_n24_N7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZTv0_n28_NK7android14MemoryHeapBase9getHeapIDEv;
- _ZTv0_n32_NK7android14MemoryHeapBase7getBaseEv;
- _ZTv0_n36_NK7android14MemoryHeapBase7getSizeEv;
- _ZTv0_n40_NK7android14MemoryHeapBase8getFlagsEv;
- _ZTv0_n44_NK7android14MemoryHeapBase9getOffsetEv;
- _ZTvn4_n16_N7android14MemoryHeapBaseD0Ev;
- _ZTvn4_n16_N7android14MemoryHeapBaseD1Ev;
- _ZTVN7android10AllocationE;
- _ZTVN7android10IInterfaceE;
- _ZTVN7android10MemoryBaseE;
- _ZTVN7android10PoolThreadE;
- _ZTVN7android10RpcSession13RpcConnectionE;
- _ZTVN7android10RpcSessionE;
- _ZTVN7android10TextOutputE;
- _ZTVN7android11IMemoryHeapE;
- _ZTVN7android12BnMemoryHeapE;
- _ZTVN7android12BpMemoryHeapE;
- _ZTVN7android12FdTextOutputE;
- _ZTVN7android12MemoryDealerE;
- _ZTVN7android12ProcessStateE;
- _ZTVN7android12SortedVectorINS_15PermissionCache5EntryEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEEE;
- _ZTVN7android12SortedVectorINS_8String16EEE;
- _ZTVN7android13LogTextOutputE;
- _ZTVN7android14IShellCallbackE;
- _ZTVN7android14MemoryHeapBaseE;
- _ZTVN7android15BnShellCallbackE;
- _ZTVN7android15BpShellCallbackE;
- _ZTVN7android15IResultReceiverE;
- _ZTVN7android15IServiceManagerE;
- _ZTVN7android16BnResultReceiverE;
- _ZTVN7android16BpResultReceiverE;
- _ZTVN7android17InetSocketAddressE;
- _ZTVN7android17UnixSocketAddressE;
- _ZTVN7android18BufferedTextOutput11BufferStateE;
- _ZTVN7android18BufferedTextOutputE;
- _ZTVN7android18ServiceManagerShimE;
- _ZTVN7android18VsockSocketAddressE;
- _ZTVN7android21IPermissionControllerE;
- _ZTVN7android22BnPermissionControllerE;
- _ZTVN7android22BpPermissionControllerE;
- _ZTVN7android2os15IClientCallbackE;
- _ZTVN7android2os15IServiceManagerE;
- _ZTVN7android2os16BnClientCallbackE;
- _ZTVN7android2os16BnServiceManagerE;
- _ZTVN7android2os16BpClientCallbackE;
- _ZTVN7android2os16BpServiceManagerE;
- _ZTVN7android2os16IServiceCallbackE;
- _ZTVN7android2os16ParcelableHolderE;
- _ZTVN7android2os16ServiceDebugInfoE;
- _ZTVN7android2os17BnServiceCallbackE;
- _ZTVN7android2os17BpServiceCallbackE;
- _ZTVN7android2os17PersistableBundleE;
- _ZTVN7android2os20ParcelFileDescriptorE;
- _ZTVN7android6VectorIiEE;
- _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;
- _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE;
- _ZTVN7android6VectorINS_8BpBinder8ObituaryEEE;
- _ZTVN7android6VectorINS_8String16EEE;
- _ZTVN7android6VectorIPNS_7BBinderEEE;
- _ZTVN7android6VectorIPNS_7RefBase12weakref_typeEEE;
- _ZTVN7android6VectorIPNS_7RefBaseEEE;
- _ZTVN7android7BBinderE;
- _ZTVN7android7content2pm18PackageChangeEventE;
- _ZTVN7android7content2pm21IPackageManagerNativeE;
- _ZTVN7android7content2pm22BnPackageManagerNativeE;
- _ZTVN7android7content2pm22BpPackageManagerNativeE;
- _ZTVN7android7content2pm22IPackageChangeObserverE;
- _ZTVN7android7content2pm23BnPackageChangeObserverE;
- _ZTVN7android7content2pm23BpPackageChangeObserverE;
- _ZTVN7android7IBinderE;
- _ZTVN7android7IMemoryE;
- _ZTVN7android8BnMemoryE;
- _ZTVN7android8BpBinderE;
- _ZTVN7android8BpMemoryE;
- _ZTVN7android9BpRefBaseE;
- _ZTVN7android9HeapCacheE;
- _ZTVN7android9RpcServerE;
- local:
- *;
-};
diff --git a/libs/binder/libbinder.arm32.vendor.map b/libs/binder/libbinder.arm32.vendor.map
deleted file mode 100644
index 5042414..0000000
--- a/libs/binder/libbinder.arm32.vendor.map
+++ /dev/null
@@ -1,1319 +0,0 @@
-# b/190148312: Populate with correct list of ABI symbols
-LIBBINDER {
- global:
- getBinderKernelReferences;
- kDefaultDriver;
- _ZN7android10AllocationC1ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEEij;
- _ZN7android10AllocationC2ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEEij;
- _ZN7android10AllocationD0Ev;
- _ZN7android10AllocationD1Ev;
- _ZN7android10AllocationD2Ev;
- _ZN7android10IInterface8asBinderEPKS0_;
- _ZN7android10IInterface8asBinderERKNS_2spIS0_EE;
- _ZN7android10IInterfaceC2Ev;
- _ZN7android10IInterfaceD0Ev;
- _ZN7android10IInterfaceD1Ev;
- _ZN7android10IInterfaceD2Ev;
- _ZN7android10MemoryBaseC1ERKNS_2spINS_11IMemoryHeapEEEij;
- _ZN7android10MemoryBaseC2ERKNS_2spINS_11IMemoryHeapEEEij;
- _ZN7android10MemoryBaseD0Ev;
- _ZN7android10MemoryBaseD1Ev;
- _ZN7android10MemoryBaseD2Ev;
- _ZN7android10RpcAddress14readFromParcelERKNS_6ParcelE;
- _ZN7android10RpcAddress15fromRawEmbeddedEPKNS_14RpcWireAddressE;
- _ZN7android10RpcAddress4zeroEv;
- _ZN7android10RpcAddress6uniqueEv;
- _ZN7android10RpcAddressC1Ev;
- _ZN7android10RpcAddressC2Ev;
- _ZN7android10RpcAddressD1Ev;
- _ZN7android10RpcAddressD2Ev;
- _ZN7android10RpcSession12setForServerERKNS_2wpINS_9RpcServerEEEi;
- _ZN7android10RpcSession13getRootObjectEv;
- _ZN7android10RpcSession13sendDecStrongERKNS_10RpcAddressE;
- _ZN7android10RpcSession15setupInetClientEPKcj;
- _ZN7android10RpcSession15terminateLockedEv;
- _ZN7android10RpcSession16setupVsockClientEjj;
- _ZN7android10RpcSession17setupSocketClientERKNS_16RpcSocketAddressE;
- _ZN7android10RpcSession19addClientConnectionENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession19ExclusiveConnection14findConnectionEiPNS_2spINS0_13RpcConnectionEEES5_RNSt3__16vectorIS4_NS6_9allocatorIS4_EEEEj;
- _ZN7android10RpcSession19ExclusiveConnectionC1ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionC2ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionD1Ev;
- _ZN7android10RpcSession19ExclusiveConnectionD2Ev;
- _ZN7android10RpcSession19getRemoteMaxThreadsEPj;
- _ZN7android10RpcSession20setupOneSocketClientERKNS_16RpcSocketAddressEi;
- _ZN7android10RpcSession21setupUnixDomainClientEPKc;
- _ZN7android10RpcSession22addNullDebuggingClientEv;
- _ZN7android10RpcSession22removeServerConnectionERKNS_2spINS0_13RpcConnectionEEE;
- _ZN7android10RpcSession24assignServerToThisThreadENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4joinENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4makeEv;
- _ZN7android10RpcSession6readIdEv;
- _ZN7android10RpcSession6serverEv;
- _ZN7android10RpcSession7preJoinENSt3__16threadE;
- _ZN7android10RpcSession8transactERKNS_10RpcAddressEjRKNS_6ParcelEPS4_j;
- _ZN7android10RpcSessionC1Ev;
- _ZN7android10RpcSessionC2Ev;
- _ZN7android10RpcSessionD0Ev;
- _ZN7android10RpcSessionD1Ev;
- _ZN7android10RpcSessionD2Ev;
- _ZN7android10TextOutputC2Ev;
- _ZN7android10TextOutputD0Ev;
- _ZN7android10TextOutputD1Ev;
- _ZN7android10TextOutputD2Ev;
- _ZN7android10zeroMemoryEPhj;
- _ZN7android11BnInterfaceINS_11IMemoryHeapEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_14IShellCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_15IResultReceiverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IClientCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IServiceManagerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os16IServiceCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm21IPackageManagerNativeEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm22IPackageChangeObserverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7IMemoryEE10onAsBinderEv;
- _ZN7android11IMemoryHeap10descriptorE;
- _ZN7android11IMemoryHeap11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android11IMemoryHeap12default_implE;
- _ZN7android11IMemoryHeap14getDefaultImplEv;
- _ZN7android11IMemoryHeap14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android11IMemoryHeapC2Ev;
- _ZN7android11IMemoryHeapD0Ev;
- _ZN7android11IMemoryHeapD1Ev;
- _ZN7android11IMemoryHeapD2Ev;
- _ZN7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android12BnMemoryHeapC2Ev;
- _ZN7android12BnMemoryHeapD0Ev;
- _ZN7android12BnMemoryHeapD1Ev;
- _ZN7android12BnMemoryHeapD2Ev;
- _ZN7android12BpMemoryHeapC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapD0Ev;
- _ZN7android12BpMemoryHeapD1Ev;
- _ZN7android12BpMemoryHeapD2Ev;
- _ZN7android12gTextBuffersE;
- _ZN7android12MemoryDealer10deallocateEj;
- _ZN7android12MemoryDealer22getAllocationAlignmentEv;
- _ZN7android12MemoryDealer8allocateEj;
- _ZN7android12MemoryDealerC1EjPKcj;
- _ZN7android12MemoryDealerC2EjPKcj;
- _ZN7android12MemoryDealerD0Ev;
- _ZN7android12MemoryDealerD1Ev;
- _ZN7android12MemoryDealerD2Ev;
- _ZN7android12printHexDataEiPKvjjijbPFvPvPKcES2_;
- _ZN7android12ProcessState10selfOrNullEv;
- _ZN7android12ProcessState13expungeHandleEiPNS_7IBinderE;
- _ZN7android12ProcessState13getDriverNameEv;
- _ZN7android12ProcessState14initWithDriverEPKc;
- _ZN7android12ProcessState15startThreadPoolEv;
- _ZN7android12ProcessState16getContextObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android12ProcessState17spawnPooledThreadEb;
- _ZN7android12ProcessState18giveThreadPoolNameEv;
- _ZN7android12ProcessState18lookupHandleLockedEi;
- _ZN7android12ProcessState18setCallRestrictionENS0_15CallRestrictionE;
- _ZN7android12ProcessState19getKernelReferencesEjPj;
- _ZN7android12ProcessState20becomeContextManagerEv;
- _ZN7android12ProcessState20makeBinderThreadNameEv;
- _ZN7android12ProcessState23getStrongProxyForHandleEi;
- _ZN7android12ProcessState24getStrongRefCountForNodeERKNS_2spINS_8BpBinderEEE;
- _ZN7android12ProcessState25enableOnewaySpamDetectionEb;
- _ZN7android12ProcessState27setThreadPoolMaxThreadCountEj;
- _ZN7android12ProcessState4initEPKcb;
- _ZN7android12ProcessState4selfEv;
- _ZN7android12ProcessStateC1EPKc;
- _ZN7android12ProcessStateC2EPKc;
- _ZN7android12ProcessStateD0Ev;
- _ZN7android12ProcessStateD1Ev;
- _ZN7android12ProcessStateD2Ev;
- _ZN7android13printTypeCodeEjPFvPvPKcES0_;
- _ZN7android14IPCThreadState10freeBufferEPNS_6ParcelEPKhjPKyj;
- _ZN7android14IPCThreadState10selfOrNullEv;
- _ZN7android14IPCThreadState11clearCallerEv;
- _ZN7android14IPCThreadState11stopProcessEb;
- _ZN7android14IPCThreadState12setupPollingEPi;
- _ZN7android14IPCThreadState13decWeakHandleEi;
- _ZN7android14IPCThreadState13expungeHandleEiPNS_7IBinderE;
- _ZN7android14IPCThreadState13flushCommandsEv;
- _ZN7android14IPCThreadState13flushIfNeededEv;
- _ZN7android14IPCThreadState13incWeakHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState14clearLastErrorEv;
- _ZN7android14IPCThreadState14executeCommandEi;
- _ZN7android14IPCThreadState14joinThreadPoolEb;
- _ZN7android14IPCThreadState14talkWithDriverEb;
- _ZN7android14IPCThreadState15decStrongHandleEi;
- _ZN7android14IPCThreadState15incStrongHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi;
- _ZN7android14IPCThreadState16threadDestructorEPv;
- _ZN7android14IPCThreadState18setCallRestrictionENS_12ProcessState15CallRestrictionE;
- _ZN7android14IPCThreadState19setStrictModePolicyEi;
- _ZN7android14IPCThreadState19setTheContextObjectERKNS_2spINS_7BBinderEEE;
- _ZN7android14IPCThreadState20clearCallingIdentityEv;
- _ZN7android14IPCThreadState20getAndExecuteCommandEv;
- _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_;
- _ZN7android14IPCThreadState20handlePolledCommandsEv;
- _ZN7android14IPCThreadState20processPendingDerefsEv;
- _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi;
- _ZN7android14IPCThreadState22attemptIncStrongHandleEi;
- _ZN7android14IPCThreadState22clearCallingWorkSourceEv;
- _ZN7android14IPCThreadState22clearDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState22processPostWriteDerefsEv;
- _ZN7android14IPCThreadState22restoreCallingIdentityEx;
- _ZN7android14IPCThreadState23setCallingWorkSourceUidEj;
- _ZN7android14IPCThreadState24clearPropagateWorkSourceEv;
- _ZN7android14IPCThreadState24requestDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState24restoreCallingWorkSourceEx;
- _ZN7android14IPCThreadState25blockUntilThreadAvailableEv;
- _ZN7android14IPCThreadState27disableBackgroundSchedulingEb;
- _ZN7android14IPCThreadState28backgroundSchedulingDisabledEv;
- _ZN7android14IPCThreadState29setLastTransactionBinderFlagsEi;
- _ZN7android14IPCThreadState41setCallingWorkSourceUidWithoutPropagationEj;
- _ZN7android14IPCThreadState4selfEv;
- _ZN7android14IPCThreadState6freezeEibj;
- _ZN7android14IPCThreadState7processEv;
- _ZN7android14IPCThreadState8shutdownEv;
- _ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j;
- _ZN7android14IPCThreadState9sendReplyERKNS_6ParcelEj;
- _ZN7android14IPCThreadStateC1Ev;
- _ZN7android14IPCThreadStateC2Ev;
- _ZN7android14IPCThreadStateD1Ev;
- _ZN7android14IPCThreadStateD2Ev;
- _ZN7android14IShellCallback10descriptorE;
- _ZN7android14IShellCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android14IShellCallback12default_implE;
- _ZN7android14IShellCallback14getDefaultImplEv;
- _ZN7android14IShellCallback14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android14IShellCallbackC2Ev;
- _ZN7android14IShellCallbackD0Ev;
- _ZN7android14IShellCallbackD1Ev;
- _ZN7android14IShellCallbackD2Ev;
- _ZN7android14MemoryHeapBase4initEiPvjiPKc;
- _ZN7android14MemoryHeapBase5mapfdEibjl;
- _ZN7android14MemoryHeapBase7disposeEv;
- _ZN7android14MemoryHeapBaseC1Eijjl;
- _ZN7android14MemoryHeapBaseC1EjjPKc;
- _ZN7android14MemoryHeapBaseC1EPKcjj;
- _ZN7android14MemoryHeapBaseC1Ev;
- _ZN7android14MemoryHeapBaseC2Eijjl;
- _ZN7android14MemoryHeapBaseC2EjjPKc;
- _ZN7android14MemoryHeapBaseC2EPKcjj;
- _ZN7android14MemoryHeapBaseC2Ev;
- _ZN7android14MemoryHeapBaseD0Ev;
- _ZN7android14MemoryHeapBaseD1Ev;
- _ZN7android14MemoryHeapBaseD2Ev;
- _ZN7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android15IResultReceiver10descriptorE;
- _ZN7android15IResultReceiver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android15IResultReceiver12default_implE;
- _ZN7android15IResultReceiver14getDefaultImplEv;
- _ZN7android15IResultReceiver14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android15IResultReceiverC2Ev;
- _ZN7android15IResultReceiverD0Ev;
- _ZN7android15IResultReceiverD1Ev;
- _ZN7android15IResultReceiverD2Ev;
- _ZN7android15IServiceManagerC2Ev;
- _ZN7android15IServiceManagerD0Ev;
- _ZN7android15IServiceManagerD1Ev;
- _ZN7android15IServiceManagerD2Ev;
- _ZN7android15stringForIndentEi;
- _ZN7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android18BufferedTextOutput10moveIndentEi;
- _ZN7android18BufferedTextOutput10pushBundleEv;
- _ZN7android18BufferedTextOutput5printEPKcj;
- _ZN7android18BufferedTextOutput9popBundleEv;
- _ZN7android18BufferedTextOutputC2Ej;
- _ZN7android18BufferedTextOutputD0Ev;
- _ZN7android18BufferedTextOutputD1Ev;
- _ZN7android18BufferedTextOutputD2Ev;
- _ZN7android18ServiceManagerShim10addServiceERKNS_8String16ERKNS_2spINS_7IBinderEEEbi;
- _ZN7android18ServiceManagerShim10isDeclaredERKNS_8String16E;
- _ZN7android18ServiceManagerShim12listServicesEi;
- _ZN7android18ServiceManagerShim14waitForServiceERKNS_8String16E;
- _ZN7android18ServiceManagerShim16updatableViaApexERKNS_8String16E;
- _ZN7android18ServiceManagerShim20getDeclaredInstancesERKNS_8String16E;
- _ZN7android18ServiceManagerShimC1ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18ServiceManagerShimC2ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18the_context_objectE;
- _ZN7android21defaultServiceManagerEv;
- _ZN7android22SimpleBestFitAllocator10deallocateEj;
- _ZN7android22SimpleBestFitAllocator12kMemoryAlignE;
- _ZN7android22SimpleBestFitAllocator5allocEjj;
- _ZN7android22SimpleBestFitAllocator7deallocEj;
- _ZN7android22SimpleBestFitAllocator8allocateEjj;
- _ZN7android22SimpleBestFitAllocatorC1Ej;
- _ZN7android22SimpleBestFitAllocatorC2Ej;
- _ZN7android22SimpleBestFitAllocatorD1Ev;
- _ZN7android22SimpleBestFitAllocatorD2Ev;
- _ZN7android24setDefaultServiceManagerERKNS_2spINS_15IServiceManagerEEE;
- _ZN7android2os15IClientCallback10descriptorE;
- _ZN7android2os15IClientCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IClientCallback12default_implE;
- _ZN7android2os15IClientCallback14getDefaultImplEv;
- _ZN7android2os15IClientCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IClientCallbackC2Ev;
- _ZN7android2os15IClientCallbackD0Ev;
- _ZN7android2os15IClientCallbackD1Ev;
- _ZN7android2os15IClientCallbackD2Ev;
- _ZN7android2os15IServiceManager10descriptorE;
- _ZN7android2os15IServiceManager11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IServiceManager12default_implE;
- _ZN7android2os15IServiceManager14getDefaultImplEv;
- _ZN7android2os15IServiceManager14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IServiceManagerC2Ev;
- _ZN7android2os15IServiceManagerD0Ev;
- _ZN7android2os15IServiceManagerD1Ev;
- _ZN7android2os15IServiceManagerD2Ev;
- _ZN7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnClientCallbackC2Ev;
- _ZN7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnServiceManagerC2Ev;
- _ZN7android2os16BpClientCallback9onClientsERKNS_2spINS_7IBinderEEEb;
- _ZN7android2os16BpClientCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpClientCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10addServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEEbi;
- _ZN7android2os16BpServiceManager10getServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10isDeclaredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPb;
- _ZN7android2os16BpServiceManager12checkServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager12listServicesEiPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEE;
- _ZN7android2os16BpServiceManager16updatableViaApexERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_8optionalIS8_EE;
- _ZN7android2os16BpServiceManager19getServiceDebugInfoEPNSt3__16vectorINS0_16ServiceDebugInfoENS2_9allocatorIS4_EEEE;
- _ZN7android2os16BpServiceManager20getDeclaredInstancesERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_6vectorIS8_NS6_IS8_EEEE;
- _ZN7android2os16BpServiceManager20tryUnregisterServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager22registerClientCallbackERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEERKNSB_INS0_15IClientCallbackEEE;
- _ZN7android2os16BpServiceManager24registerForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManager26unregisterForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManagerC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManagerC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback10descriptorE;
- _ZN7android2os16IServiceCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback12default_implE;
- _ZN7android2os16IServiceCallback14getDefaultImplEv;
- _ZN7android2os16IServiceCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os16IServiceCallbackC2Ev;
- _ZN7android2os16IServiceCallbackD0Ev;
- _ZN7android2os16IServiceCallbackD1Ev;
- _ZN7android2os16IServiceCallbackD2Ev;
- _ZN7android2os16ParcelableHolder14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os16ServiceDebugInfo14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os17BnServiceCallbackC2Ev;
- _ZN7android2os17BpServiceCallback14onRegistrationERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17PersistableBundle10putBooleanERKNS_8String16Eb;
- _ZN7android2os17PersistableBundle12putIntVectorERKNS_8String16ERKNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZN7android2os17PersistableBundle13putLongVectorERKNS_8String16ERKNSt3__16vectorIxNS5_9allocatorIxEEEE;
- _ZN7android2os17PersistableBundle14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17PersistableBundle15putDoubleVectorERKNS_8String16ERKNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZN7android2os17PersistableBundle15putStringVectorERKNS_8String16ERKNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZN7android2os17PersistableBundle16putBooleanVectorERKNS_8String16ERKNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZN7android2os17PersistableBundle19readFromParcelInnerEPKNS_6ParcelEj;
- _ZN7android2os17PersistableBundle20putPersistableBundleERKNS_8String16ERKS1_;
- _ZN7android2os17PersistableBundle5eraseERKNS_8String16E;
- _ZN7android2os17PersistableBundle6putIntERKNS_8String16Ei;
- _ZN7android2os17PersistableBundle7putLongERKNS_8String16Ex;
- _ZN7android2os17PersistableBundle9putDoubleERKNS_8String16Ed;
- _ZN7android2os17PersistableBundle9putStringERKNS_8String16ES4_;
- _ZN7android2os20ParcelFileDescriptor14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os20ParcelFileDescriptorC1ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC1Ev;
- _ZN7android2os20ParcelFileDescriptorC2ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC2Ev;
- _ZN7android2os20ParcelFileDescriptorD0Ev;
- _ZN7android2os20ParcelFileDescriptorD1Ev;
- _ZN7android2os20ParcelFileDescriptorD2Ev;
- _ZN7android4aerrE;
- _ZN7android4alogE;
- _ZN7android4aoutE;
- _ZN7android6binder20LazyServiceRegistrar10reRegisterEv;
- _ZN7android6binder20LazyServiceRegistrar11getInstanceEv;
- _ZN7android6binder20LazyServiceRegistrar12forcePersistEb;
- _ZN7android6binder20LazyServiceRegistrar13tryUnregisterEv;
- _ZN7android6binder20LazyServiceRegistrar15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEbi;
- _ZN7android6binder20LazyServiceRegistrar25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder20LazyServiceRegistrarC1Ev;
- _ZN7android6binder20LazyServiceRegistrarC2Ev;
- _ZN7android6binder6Status11fromStatusTEi;
- _ZN7android6binder6Status12setExceptionEiRKNS_7String8E;
- _ZN7android6binder6Status14readFromParcelERKNS_6ParcelE;
- _ZN7android6binder6Status14setFromStatusTEi;
- _ZN7android6binder6Status17exceptionToStringEi;
- _ZN7android6binder6Status17fromExceptionCodeEi;
- _ZN7android6binder6Status17fromExceptionCodeEiPKc;
- _ZN7android6binder6Status17fromExceptionCodeEiRKNS_7String8E;
- _ZN7android6binder6Status23setServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status24fromServiceSpecificErrorEi;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiPKc;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status2okEv;
- _ZN7android6binder6StatusC1Eii;
- _ZN7android6binder6StatusC1EiiRKNS_7String8E;
- _ZN7android6binder6StatusC2Eii;
- _ZN7android6binder6StatusC2EiiRKNS_7String8E;
- _ZN7android6binder8internal21ClientCounterCallback10reRegisterEv;
- _ZN7android6binder8internal21ClientCounterCallback12forcePersistEb;
- _ZN7android6binder8internal21ClientCounterCallback13tryUnregisterEv;
- _ZN7android6binder8internal21ClientCounterCallback15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi;
- _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder8internal21ClientCounterCallbackC1Ev;
- _ZN7android6binder8internal21ClientCounterCallbackC2Ev;
- _ZN7android6Parcel10appendFromEPKS0_jj;
- _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;
- _ZN7android6Parcel10writeFloatEf;
- _ZN7android6Parcel10writeInt32Ei;
- _ZN7android6Parcel10writeInt64Ex;
- _ZN7android6Parcel11compareDataERKS0_;
- _ZN7android6Parcel11finishWriteEj;
- _ZN7android6Parcel11setDataSizeEj;
- _ZN7android6Parcel11writeDoubleEd;
- _ZN7android6Parcel11writeObjectERK18flat_binder_objectb;
- _ZN7android6Parcel11writeUint32Ej;
- _ZN7android6Parcel11writeUint64Ey;
- _ZN7android6Parcel12pushAllowFdsEb;
- _ZN7android6Parcel12restartWriteEj;
- _ZN7android6Parcel12writeCStringEPKc;
- _ZN7android6Parcel12writeInplaceEj;
- _ZN7android6Parcel12writePointerEj;
- _ZN7android6Parcel12writeString8EPKcj;
- _ZN7android6Parcel12writeString8ERKNS_7String8E;
- _ZN7android6Parcel13continueWriteEj;
- _ZN7android6Parcel13flattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13markForBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13writeString16EPKDsj;
- _ZN7android6Parcel13writeString16ERKNS_8String16E;
- _ZN7android6Parcel13writeString16ERKNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZN7android6Parcel13writeString16ERKNSt3__18optionalINS_8String16EEE;
- _ZN7android6Parcel13writeUnpaddedEPKvj;
- _ZN7android6Parcel14acquireObjectsEv;
- _ZN7android6Parcel14freeDataNoInitEv;
- _ZN7android6Parcel14releaseObjectsEv;
- _ZN7android6Parcel14writeByteArrayEjPKh;
- _ZN7android6Parcel15restoreAllowFdsEb;
- _ZN7android6Parcel15setDataCapacityEj;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZN7android6Parcel15writeInt32ArrayEjPKi;
- _ZN7android6Parcel15writeParcelableERKNS_10ParcelableE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__110unique_ptrINS1_6vectorIxNS1_9allocatorIxEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__16vectorIxNS1_9allocatorIxEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__18optionalINS1_6vectorIxNS1_9allocatorIxEEEEEE;
- _ZN7android6Parcel16writeNoExceptionEv;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZN7android6Parcel17writeNativeHandleEPK13native_handle;
- _ZN7android6Parcel17writeStrongBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__110unique_ptrINS1_6vectorIyNS1_9allocatorIyEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__16vectorIyNS1_9allocatorIyEEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__18optionalINS1_6vectorIyNS1_9allocatorIyEEEEEE;
- _ZN7android6Parcel18getGlobalAllocSizeEv;
- _ZN7android6Parcel19finishFlattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel19getGlobalAllocCountEv;
- _ZN7android6Parcel19ipcSetDataReferenceEPKhjPKyjPFvPS0_S2_jS4_jE;
- _ZN7android6Parcel19writeFileDescriptorEib;
- _ZN7android6Parcel19writeInterfaceTokenEPKDsj;
- _ZN7android6Parcel19writeInterfaceTokenERKNS_8String16E;
- _ZN7android6Parcel19writeString16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZN7android6Parcel20closeFileDescriptorsEv;
- _ZN7android6Parcel22writeDupFileDescriptorEi;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZN7android6Parcel25writeParcelFileDescriptorEib;
- _ZN7android6Parcel25writeUniqueFileDescriptorERKNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android6Parcel26writeRawNullableParcelableEPKNS_10ParcelableE;
- _ZN7android6Parcel27replaceCallingWorkSourceUidEj;
- _ZN7android6Parcel28writeDupParcelFileDescriptorEi;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZN7android6Parcel35writeDupImmutableBlobFileDescriptorEi;
- _ZN7android6Parcel4Blob4initEiPvjb;
- _ZN7android6Parcel4Blob5clearEv;
- _ZN7android6Parcel4Blob7releaseEv;
- _ZN7android6Parcel4BlobC1Ev;
- _ZN7android6Parcel4BlobC2Ev;
- _ZN7android6Parcel4BlobD1Ev;
- _ZN7android6Parcel4BlobD2Ev;
- _ZN7android6Parcel5writeEPKvj;
- _ZN7android6Parcel5writeERKNS0_26FlattenableHelperInterfaceE;
- _ZN7android6Parcel7setDataEPKhj;
- _ZN7android6Parcel8freeDataEv;
- _ZN7android6Parcel8growDataEj;
- _ZN7android6Parcel8setErrorEi;
- _ZN7android6Parcel9initStateEv;
- _ZN7android6Parcel9writeBlobEjbPNS0_12WritableBlobE;
- _ZN7android6Parcel9writeBoolEb;
- _ZN7android6Parcel9writeByteEa;
- _ZN7android6Parcel9writeCharEDs;
- _ZN7android6ParcelC1Ev;
- _ZN7android6ParcelC2Ev;
- _ZN7android6ParcelD1Ev;
- _ZN7android6ParcelD2Ev;
- _ZN7android7BBinder10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinder10pingBinderEv;
- _ZN7android7BBinder11getDebugPidEv;
- _ZN7android7BBinder11isInheritRtEv;
- _ZN7android7BBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android7BBinder11localBinderEv;
- _ZN7android7BBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android7BBinder12detachObjectEPKv;
- _ZN7android7BBinder12getExtensionEv;
- _ZN7android7BBinder12setExtensionERKNS_2spINS_7IBinderEEE;
- _ZN7android7BBinder12setInheritRtEb;
- _ZN7android7BBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android7BBinder15isRequestingSidEv;
- _ZN7android7BBinder16setRequestingSidEb;
- _ZN7android7BBinder17getOrCreateExtrasEv;
- _ZN7android7BBinder21getMinSchedulerPolicyEv;
- _ZN7android7BBinder21setMinSchedulerPolicyEii;
- _ZN7android7BBinder23getMinSchedulerPriorityEv;
- _ZN7android7BBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinderC1Ev;
- _ZN7android7BBinderC2Ev;
- _ZN7android7BBinderD0Ev;
- _ZN7android7BBinderD1Ev;
- _ZN7android7BBinderD2Ev;
- _ZN7android7content2pm18PackageChangeEvent14readFromParcelEPKNS_6ParcelE;
- _ZN7android7content2pm21IPackageManagerNative10descriptorE;
- _ZN7android7content2pm21IPackageManagerNative11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm21IPackageManagerNative12default_implE;
- _ZN7android7content2pm21IPackageManagerNative14getDefaultImplEv;
- _ZN7android7content2pm21IPackageManagerNative14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm21IPackageManagerNativeC2Ev;
- _ZN7android7content2pm21IPackageManagerNativeD0Ev;
- _ZN7android7content2pm21IPackageManagerNativeD1Ev;
- _ZN7android7content2pm21IPackageManagerNativeD2Ev;
- _ZN7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm22BnPackageManagerNativeC2Ev;
- _ZN7android7content2pm22BpPackageManagerNative14getAllPackagesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative15getNamesForUidsERKNSt3__16vectorIiNS3_9allocatorIiEEEEPNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS5_IcEEEENS5_ISE_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative16getLocationFlagsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPi;
- _ZN7android7content2pm22BpPackageManagerNative16hasSystemFeatureERKNS_8String16EiPb;
- _ZN7android7content2pm22BpPackageManagerNative19isPackageDebuggableERKNS_8String16EPb;
- _ZN7android7content2pm22BpPackageManagerNative22getInstallerForPackageERKNS_8String16EPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative24getVersionCodeForPackageERKNS_8String16EPx;
- _ZN7android7content2pm22BpPackageManagerNative27hasSha256SigningCertificateERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIhNS7_IhEEEEPb;
- _ZN7android7content2pm22BpPackageManagerNative28getModuleMetadataPackageNameEPNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29getTargetSdkVersionForPackageERKNS_8String16EPi;
- _ZN7android7content2pm22BpPackageManagerNative29isAudioPlaybackCaptureAllowedERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEPNS4_IbNS8_IbEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29registerPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNative31unregisterPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver10descriptorE;
- _ZN7android7content2pm22IPackageChangeObserver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver12default_implE;
- _ZN7android7content2pm22IPackageChangeObserver14getDefaultImplEv;
- _ZN7android7content2pm22IPackageChangeObserver14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm22IPackageChangeObserverC2Ev;
- _ZN7android7content2pm22IPackageChangeObserverD0Ev;
- _ZN7android7content2pm22IPackageChangeObserverD1Ev;
- _ZN7android7content2pm22IPackageChangeObserverD2Ev;
- _ZN7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm23BnPackageChangeObserverC2Ev;
- _ZN7android7content2pm23BpPackageChangeObserver16onPackageChangedERKNS1_18PackageChangeEventE;
- _ZN7android7content2pm23BpPackageChangeObserverC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm23BpPackageChangeObserverC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7HexDumpC1EPKvjj;
- _ZN7android7HexDumpC2EPKvjj;
- _ZN7android7IBinder11getDebugPidEPi;
- _ZN7android7IBinder11localBinderEv;
- _ZN7android7IBinder12getExtensionEPNS_2spIS0_EE;
- _ZN7android7IBinder12remoteBinderEv;
- _ZN7android7IBinder12shellCommandERKNS_2spIS0_EEiiiRNS_6VectorINS_8String16EEERKNS1_INS_14IShellCallbackEEERKNS1_INS_15IResultReceiverEEE;
- _ZN7android7IBinder19queryLocalInterfaceERKNS_8String16E;
- _ZN7android7IBinderC2Ev;
- _ZN7android7IBinderD0Ev;
- _ZN7android7IBinderD1Ev;
- _ZN7android7IBinderD2Ev;
- _ZN7android7IMemory10descriptorE;
- _ZN7android7IMemory11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7IMemory12default_implE;
- _ZN7android7IMemory14getDefaultImplEv;
- _ZN7android7IMemory14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android7IMemoryC2Ev;
- _ZN7android7IMemoryD0Ev;
- _ZN7android7IMemoryD1Ev;
- _ZN7android7IMemoryD2Ev;
- _ZN7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BnMemoryC2Ev;
- _ZN7android8BnMemoryD0Ev;
- _ZN7android8BnMemoryD1Ev;
- _ZN7android8BnMemoryD2Ev;
- _ZN7android8BpBinder10onFirstRefEv;
- _ZN7android8BpBinder10pingBinderEv;
- _ZN7android8BpBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android8BpBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android8BpBinder12detachObjectEPKv;
- _ZN7android8BpBinder12remoteBinderEv;
- _ZN7android8BpBinder12sendObituaryEv;
- _ZN7android8BpBinder12sTrackingMapE;
- _ZN7android8BpBinder13getCountByUidERNS_6VectorIjEES3_;
- _ZN7android8BpBinder13ObjectManager4killEv;
- _ZN7android8BpBinder13ObjectManager6attachEPKvPvS4_PFvS3_S4_S4_E;
- _ZN7android8BpBinder13ObjectManager6detachEPKv;
- _ZN7android8BpBinder13ObjectManagerC1Ev;
- _ZN7android8BpBinder13ObjectManagerC2Ev;
- _ZN7android8BpBinder13ObjectManagerD1Ev;
- _ZN7android8BpBinder13ObjectManagerD2Ev;
- _ZN7android8BpBinder13sTrackingLockE;
- _ZN7android8BpBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android8BpBinder14reportOneDeathERKNS0_8ObituaryE;
- _ZN7android8BpBinder14sLimitCallbackE;
- _ZN7android8BpBinder15onLastStrongRefEPKv;
- _ZN7android8BpBinder15sNumTrackedUidsE;
- _ZN7android8BpBinder16enableCountByUidEv;
- _ZN7android8BpBinder16setLimitCallbackEPFviE;
- _ZN7android8BpBinder17disableCountByUidEv;
- _ZN7android8BpBinder18sCountByUidEnabledE;
- _ZN7android8BpBinder19getBinderProxyCountEj;
- _ZN7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZN7android8BpBinder20setCountByUidEnabledEb;
- _ZN7android8BpBinder26sBinderProxyThrottleCreateE;
- _ZN7android8BpBinder29sBinderProxyCountLowWatermarkE;
- _ZN7android8BpBinder29setBinderProxyCountWatermarksEii;
- _ZN7android8BpBinder30sBinderProxyCountHighWatermarkE;
- _ZN7android8BpBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android8BpBinder6createEi;
- _ZN7android8BpBinder6createERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BpBinderC1EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC1EONS0_9RpcHandleE;
- _ZN7android8BpBinderC1EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderC2EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC2EONS0_9RpcHandleE;
- _ZN7android8BpBinderC2EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderD0Ev;
- _ZN7android8BpBinderD1Ev;
- _ZN7android8BpBinderD2Ev;
- _ZN7android8BpMemoryC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryD0Ev;
- _ZN7android8BpMemoryD1Ev;
- _ZN7android8BpMemoryD2Ev;
- _ZN7android8internal9Stability11getCategoryEPNS_7IBinderE;
- _ZN7android8internal9Stability11levelStringENS1_5LevelE;
- _ZN7android8internal9Stability13getLocalLevelEv;
- _ZN7android8internal9Stability15isDeclaredLevelENS1_5LevelE;
- _ZN7android8internal9Stability17debugLogStabilityERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability19markCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability22tryMarkCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability24requiresVintfDeclarationERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability25forceDowngradeToStabilityERKNS_2spINS_7IBinderEEENS1_5LevelE;
- _ZN7android8internal9Stability30forceDowngradeToLocalStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToSystemStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToVendorStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability5checkENS1_8CategoryENS1_5LevelE;
- _ZN7android8internal9Stability7setReprEPNS_7IBinderEij;
- _ZN7android8internal9Stability8Category11debugStringEv;
- _ZN7android8internal9Stability8markVndkEPNS_7IBinderE;
- _ZN7android8internal9Stability9markVintfEPNS_7IBinderE;
- _ZN7android8RpcState11CommandDataC1Ej;
- _ZN7android8RpcState11CommandDataC2Ej;
- _ZN7android8RpcState12countBindersEv;
- _ZN7android8RpcState12getSessionIdERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPi;
- _ZN7android8RpcState12waitForReplyERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPNS_6ParcelE;
- _ZN7android8RpcState13getMaxThreadsERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPj;
- _ZN7android8RpcState13getRootObjectERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState13sendDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressE;
- _ZN7android8RpcState15onBinderLeavingERKNS_2spINS_10RpcSessionEEERKNS1_INS_7IBinderEEEPNS_10RpcAddressE;
- _ZN7android8RpcState15processTransactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState16onBinderEnteringERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8RpcState16processDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState20getAndExecuteCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState20processServerCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState23processTransactInternalERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEENS0_11CommandDataE;
- _ZN7android8RpcState4dumpEv;
- _ZN7android8RpcState6rpcRecERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPvj;
- _ZN7android8RpcState7rpcSendERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPKvj;
- _ZN7android8RpcState8transactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressEjRKNS_6ParcelERKNS_2spINS_10RpcSessionEEEPSA_j;
- _ZN7android8RpcState9terminateEv;
- _ZN7android8RpcStateC1Ev;
- _ZN7android8RpcStateC2Ev;
- _ZN7android8RpcStateD1Ev;
- _ZN7android8RpcStateD2Ev;
- _ZN7android9BpRefBase10onFirstRefEv;
- _ZN7android9BpRefBase15onLastStrongRefEPKv;
- _ZN7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZN7android9BpRefBaseC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseD0Ev;
- _ZN7android9BpRefBaseD1Ev;
- _ZN7android9BpRefBaseD2Ev;
- _ZN7android9HeapCache10binderDiedERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCache10dump_heapsEv;
- _ZN7android9HeapCache8get_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9find_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCacheC1Ev;
- _ZN7android9HeapCacheC2Ev;
- _ZN7android9HeapCacheD0Ev;
- _ZN7android9HeapCacheD1Ev;
- _ZN7android9HeapCacheD2Ev;
- _ZN7android9hexStringEPKvj;
- _ZN7android9RpcServer12listSessionsEv;
- _ZN7android9RpcServer13getMaxThreadsEv;
- _ZN7android9RpcServer13getRootObjectEv;
- _ZN7android9RpcServer13releaseServerEv;
- _ZN7android9RpcServer13setMaxThreadsEj;
- _ZN7android9RpcServer13setRootObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android9RpcServer15setupInetServerEjPj;
- _ZN7android9RpcServer16setupVsockServerEj;
- _ZN7android9RpcServer17setRootObjectWeakERKNS_2wpINS_7IBinderEEE;
- _ZN7android9RpcServer17setupSocketServerERKNS_16RpcSocketAddressE;
- _ZN7android9RpcServer19establishConnectionEONS_2spIS0_EENS_4base14unique_fd_implINS4_13DefaultCloserEEE;
- _ZN7android9RpcServer19setupExternalServerENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android9RpcServer20onSessionTerminatingERKNS_2spINS_10RpcSessionEEE;
- _ZN7android9RpcServer21setupUnixDomainServerEPKc;
- _ZN7android9RpcServer24numUninitializedSessionsEv;
- _ZN7android9RpcServer4joinEv;
- _ZN7android9RpcServer4makeEv;
- _ZN7android9RpcServer61iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProductionEv;
- _ZN7android9RpcServer9acceptOneEv;
- _ZN7android9RpcServer9hasServerEv;
- _ZN7android9RpcServerC1Ev;
- _ZN7android9RpcServerC2Ev;
- _ZN7android9RpcServerD0Ev;
- _ZN7android9RpcServerD1Ev;
- _ZN7android9RpcServerD2Ev;
- _ZN7androidlsERNS_10TextOutputERKNS_7HexDumpE;
- _ZN7androidlsERNS_10TextOutputERKNS_8TypeCodeE;
- _ZN7androidlsIA15_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA24_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA2_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA34_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA3_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA43_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA4_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA5_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA8_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA9_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIjEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEERNS_10TextOutputES9_RKT_;
- _ZN7androidlsIPcEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIPvEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIyEERNS_10TextOutputES2_RKT_;
- _ZNK7android10MemoryBase9getMemoryEPiPj;
- _ZNK7android10RpcAddress13writeToParcelEPNS_6ParcelE;
- _ZNK7android10RpcAddress15viewRawEmbeddedEv;
- _ZNK7android10RpcAddress6isZeroEv;
- _ZNK7android10RpcAddress8toStringEv;
- _ZNK7android10RpcAddressltERKS0_;
- _ZNK7android11IMemoryHeap22getInterfaceDescriptorEv;
- _ZNK7android12BpMemoryHeap12assertMappedEv;
- _ZNK7android12BpMemoryHeap18assertReallyMappedEv;
- _ZNK7android12BpMemoryHeap7getBaseEv;
- _ZNK7android12BpMemoryHeap7getSizeEv;
- _ZNK7android12BpMemoryHeap8getFlagsEv;
- _ZNK7android12BpMemoryHeap9getHeapIDEv;
- _ZNK7android12BpMemoryHeap9getOffsetEv;
- _ZNK7android12MemoryDealer4dumpEPKc;
- _ZNK7android12MemoryDealer4heapEv;
- _ZNK7android12MemoryDealer9allocatorEv;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_compareEPKvSA_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE15do_move_forwardEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE16do_move_backwardEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE7do_copyEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE8do_splatEPvPKvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_compareES3_S3_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_destroyEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE12do_constructEPvj;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE15do_move_forwardEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE16do_move_backwardEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE7do_copyEPvS3_j;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE8do_splatEPvS3_j;
- _ZNK7android14IPCThreadState13getCallingPidEv;
- _ZNK7android14IPCThreadState13getCallingSidEv;
- _ZNK7android14IPCThreadState13getCallingUidEv;
- _ZNK7android14IPCThreadState18getCallRestrictionEv;
- _ZNK7android14IPCThreadState19getStrictModePolicyEv;
- _ZNK7android14IPCThreadState22getServingStackPointerEv;
- _ZNK7android14IPCThreadState23getCallingWorkSourceUidEv;
- _ZNK7android14IPCThreadState25shouldPropagateWorkSourceEv;
- _ZNK7android14IPCThreadState29getLastTransactionBinderFlagsEv;
- _ZNK7android14IShellCallback22getInterfaceDescriptorEv;
- _ZNK7android14MemoryHeapBase7getBaseEv;
- _ZNK7android14MemoryHeapBase7getSizeEv;
- _ZNK7android14MemoryHeapBase8getFlagsEv;
- _ZNK7android14MemoryHeapBase9getDeviceEv;
- _ZNK7android14MemoryHeapBase9getHeapIDEv;
- _ZNK7android14MemoryHeapBase9getOffsetEv;
- _ZNK7android15IResultReceiver22getInterfaceDescriptorEv;
- _ZNK7android15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android18BufferedTextOutput9getBufferEv;
- _ZNK7android18ServiceManagerShim10getServiceERKNS_8String16E;
- _ZNK7android18ServiceManagerShim12checkServiceERKNS_8String16E;
- _ZNK7android22SimpleBestFitAllocator4dumpEPKc;
- _ZNK7android22SimpleBestFitAllocator4dumpERNS_7String8EPKc;
- _ZNK7android22SimpleBestFitAllocator4sizeEv;
- _ZNK7android22SimpleBestFitAllocator6dump_lEPKc;
- _ZNK7android22SimpleBestFitAllocator6dump_lERNS_7String8EPKc;
- _ZNK7android2os15IClientCallback22getInterfaceDescriptorEv;
- _ZNK7android2os15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android2os16IServiceCallback22getInterfaceDescriptorEv;
- _ZNK7android2os16ParcelableHolder13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os16ServiceDebugInfo13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle10getBooleanERKNS_8String16EPb;
- _ZNK7android2os17PersistableBundle10getIntKeysEv;
- _ZNK7android2os17PersistableBundle11getLongKeysEv;
- _ZNK7android2os17PersistableBundle12getIntVectorERKNS_8String16EPNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZNK7android2os17PersistableBundle13getDoubleKeysEv;
- _ZNK7android2os17PersistableBundle13getLongVectorERKNS_8String16EPNSt3__16vectorIxNS5_9allocatorIxEEEE;
- _ZNK7android2os17PersistableBundle13getStringKeysEv;
- _ZNK7android2os17PersistableBundle13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle14getBooleanKeysEv;
- _ZNK7android2os17PersistableBundle15getDoubleVectorERKNS_8String16EPNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZNK7android2os17PersistableBundle15getStringVectorERKNS_8String16EPNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZNK7android2os17PersistableBundle16getBooleanVectorERKNS_8String16EPNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZNK7android2os17PersistableBundle16getIntVectorKeysEv;
- _ZNK7android2os17PersistableBundle17getLongVectorKeysEv;
- _ZNK7android2os17PersistableBundle18writeToParcelInnerEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle19getDoubleVectorKeysEv;
- _ZNK7android2os17PersistableBundle19getStringVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getBooleanVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getPersistableBundleERKNS_8String16EPS1_;
- _ZNK7android2os17PersistableBundle24getPersistableBundleKeysEv;
- _ZNK7android2os17PersistableBundle4sizeEv;
- _ZNK7android2os17PersistableBundle5emptyEv;
- _ZNK7android2os17PersistableBundle6getIntERKNS_8String16EPi;
- _ZNK7android2os17PersistableBundle7getLongERKNS_8String16EPx;
- _ZNK7android2os17PersistableBundle9getDoubleERKNS_8String16EPd;
- _ZNK7android2os17PersistableBundle9getStringERKNS_8String16EPS2_;
- _ZNK7android2os20ParcelFileDescriptor13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status9toString8Ev;
- _ZNK7android6Parcel10errorCheckEv;
- _ZNK7android6Parcel10ipcObjectsEv;
- _ZNK7android6Parcel10readDoubleEPd;
- _ZNK7android6Parcel10readDoubleEv;
- _ZNK7android6Parcel10readObjectEb;
- _ZNK7android6Parcel10readUint32EPj;
- _ZNK7android6Parcel10readUint32Ev;
- _ZNK7android6Parcel10readUint64EPy;
- _ZNK7android6Parcel10readUint64Ev;
- _ZNK7android6Parcel10scanForFdsEv;
- _ZNK7android6Parcel11ipcDataSizeEv;
- _ZNK7android6Parcel11readCStringEv;
- _ZNK7android6Parcel11readInplaceEj;
- _ZNK7android6Parcel11readPointerEPj;
- _ZNK7android6Parcel11readPointerEv;
- _ZNK7android6Parcel11readString8EPNS_7String8E;
- _ZNK7android6Parcel11readString8Ev;
- _ZNK7android6Parcel12dataCapacityEv;
- _ZNK7android6Parcel12dataPositionEv;
- _ZNK7android6Parcel12objectsCountEv;
- _ZNK7android6Parcel12readString16EPNS_8String16E;
- _ZNK7android6Parcel12readString16EPNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZNK7android6Parcel12readString16EPNSt3__18optionalINS_8String16EEE;
- _ZNK7android6Parcel12readString16Ev;
- _ZNK7android6Parcel13markSensitiveEv;
- _ZNK7android6Parcel14checkInterfaceEPNS_7IBinderE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZNK7android6Parcel14readParcelableEPNS_10ParcelableE;
- _ZNK7android6Parcel15ipcObjectsCountEv;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__110unique_ptrINS1_6vectorIxNS1_9allocatorIxEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__16vectorIxNS1_9allocatorIxEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__18optionalINS1_6vectorIxNS1_9allocatorIxEEEEEE;
- _ZNK7android6Parcel15setDataPositionEj;
- _ZNK7android6Parcel15unflattenBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16enforceInterfaceEPKDsjPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16enforceInterfaceERKNS_8String16EPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZNK7android6Parcel16readNativeHandleEv;
- _ZNK7android6Parcel16readStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16readStrongBinderEv;
- _ZNK7android6Parcel16readStrongBinderINS_2os15IClientCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_2os16IServiceCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_7content2pm22IPackageChangeObserverEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__110unique_ptrINS1_6vectorIyNS1_9allocatorIyEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__16vectorIyNS1_9allocatorIyEEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__18optionalINS1_6vectorIyNS1_9allocatorIyEEEEEE;
- _ZNK7android6Parcel16validateReadDataEj;
- _ZNK7android6Parcel17getBlobAshmemSizeEv;
- _ZNK7android6Parcel17getOpenAshmemSizeEv;
- _ZNK7android6Parcel17readExceptionCodeEv;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZNK7android6Parcel18hasFileDescriptorsEv;
- _ZNK7android6Parcel18readFileDescriptorEv;
- _ZNK7android6Parcel18readString16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZNK7android6Parcel18readString8InplaceEPj;
- _ZNK7android6Parcel19readString16InplaceEPj;
- _ZNK7android6Parcel21finishUnflattenBinderERKNS_2spINS_7IBinderEEEPS3_;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZNK7android6Parcel24readCallingWorkSourceUidEv;
- _ZNK7android6Parcel24readNullableStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel24readParcelFileDescriptorEv;
- _ZNK7android6Parcel24readUniqueFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZNK7android6Parcel30readUniqueParcelFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel37updateWorkSourceRequestHeaderPositionEv;
- _ZNK7android6Parcel4dataEv;
- _ZNK7android6Parcel4readEPvj;
- _ZNK7android6Parcel4readERNS0_26FlattenableHelperInterfaceE;
- _ZNK7android6Parcel5printERNS_10TextOutputEj;
- _ZNK7android6Parcel7ipcDataEv;
- _ZNK7android6Parcel8allowFdsEv;
- _ZNK7android6Parcel8dataSizeEv;
- _ZNK7android6Parcel8isForRpcEv;
- _ZNK7android6Parcel8readBlobEjPNS0_12ReadableBlobE;
- _ZNK7android6Parcel8readBoolEPb;
- _ZNK7android6Parcel8readBoolEv;
- _ZNK7android6Parcel8readByteEPa;
- _ZNK7android6Parcel8readByteEv;
- _ZNK7android6Parcel8readCharEPDs;
- _ZNK7android6Parcel8readCharEv;
- _ZNK7android6Parcel9dataAvailEv;
- _ZNK7android6Parcel9readFloatEPf;
- _ZNK7android6Parcel9readFloatEv;
- _ZNK7android6Parcel9readInt32EPi;
- _ZNK7android6Parcel9readInt32Ev;
- _ZNK7android6Parcel9readInt64EPx;
- _ZNK7android6Parcel9readInt64Ev;
- _ZNK7android6VectorIiE10do_destroyEPvj;
- _ZNK7android6VectorIiE12do_constructEPvj;
- _ZNK7android6VectorIiE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIiE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIiE7do_copyEPvPKvj;
- _ZNK7android6VectorIiE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE10do_destroyEPvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE12do_constructEPvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE10do_destroyEPvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE12do_constructEPvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE10do_destroyEPvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE12do_constructEPvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE8do_splatEPvPKvj;
- _ZNK7android6VectorINS_8String16EE10do_destroyEPvj;
- _ZNK7android6VectorINS_8String16EE12do_constructEPvj;
- _ZNK7android6VectorINS_8String16EE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorINS_8String16EE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorINS_8String16EE7do_copyEPvPKvj;
- _ZNK7android6VectorINS_8String16EE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7BBinderEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7BBinderEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7BBinderEE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE8do_splatEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE10do_destroyEPvj;
- _ZNK7android6VectorIPNS_7RefBaseEE12do_constructEPvj;
- _ZNK7android6VectorIPNS_7RefBaseEE15do_move_forwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE16do_move_backwardEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE7do_copyEPvPKvj;
- _ZNK7android6VectorIPNS_7RefBaseEE8do_splatEPvPKvj;
- _ZNK7android7BBinder10findObjectEPKv;
- _ZNK7android7BBinder13isBinderAliveEv;
- _ZNK7android7BBinder22getInterfaceDescriptorEv;
- _ZNK7android7content2pm18PackageChangeEvent13writeToParcelEPNS_6ParcelE;
- _ZNK7android7content2pm21IPackageManagerNative22getInterfaceDescriptorEv;
- _ZNK7android7content2pm22IPackageChangeObserver22getInterfaceDescriptorEv;
- _ZNK7android7IBinder13checkSubclassEPKv;
- _ZNK7android7IMemory11fastPointerERKNS_2spINS_7IBinderEEEi;
- _ZNK7android7IMemory15unsecurePointerEv;
- _ZNK7android7IMemory22getInterfaceDescriptorEv;
- _ZNK7android7IMemory4sizeEv;
- _ZNK7android7IMemory6offsetEv;
- _ZNK7android7IMemory7pointerEv;
- _ZNK7android8BpBinder10findObjectEPKv;
- _ZNK7android8BpBinder10rpcAddressEv;
- _ZNK7android8BpBinder10rpcSessionEv;
- _ZNK7android8BpBinder11isRpcBinderEv;
- _ZNK7android8BpBinder12binderHandleEv;
- _ZNK7android8BpBinder13isBinderAliveEv;
- _ZNK7android8BpBinder13ObjectManager4findEPKv;
- _ZNK7android8BpBinder18isDescriptorCachedEv;
- _ZNK7android8BpBinder22getInterfaceDescriptorEv;
- _ZNK7android8BpMemory9getMemoryEPiPj;
- _ZTCN7android10AllocationE0_NS_10IInterfaceE;
- _ZTCN7android10AllocationE0_NS_10MemoryBaseE;
- _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10AllocationE0_NS_7IMemoryE;
- _ZTCN7android10AllocationE0_NS_8BnMemoryE;
- _ZTCN7android10AllocationE4_NS_7BBinderE;
- _ZTCN7android10AllocationE4_NS_7IBinderE;
- _ZTCN7android10MemoryBaseE0_NS_10IInterfaceE;
- _ZTCN7android10MemoryBaseE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10MemoryBaseE0_NS_7IMemoryE;
- _ZTCN7android10MemoryBaseE0_NS_8BnMemoryE;
- _ZTCN7android10MemoryBaseE4_NS_7BBinderE;
- _ZTCN7android10MemoryBaseE4_NS_7IBinderE;
- _ZTCN7android10PoolThreadE0_NS_6ThreadE;
- _ZTCN7android11IMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BnMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BnMemoryHeapE4_NS_7BBinderE;
- _ZTCN7android12BnMemoryHeapE4_NS_7IBinderE;
- _ZTCN7android12BpMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BpMemoryHeapE0_NS_11BpInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BpMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BpMemoryHeapE4_NS_9BpRefBaseE;
- _ZTCN7android14IShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE32_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE32_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android14MemoryHeapBaseE32_NS_11IMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE32_NS_12BnMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE36_NS_7BBinderE;
- _ZTCN7android14MemoryHeapBaseE36_NS_7IBinderE;
- _ZTCN7android15BnShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BnShellCallbackE0_NS_11BnInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BnShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BnShellCallbackE4_NS_7BBinderE;
- _ZTCN7android15BnShellCallbackE4_NS_7IBinderE;
- _ZTCN7android15BpShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BpShellCallbackE0_NS_11BpInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BpShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BpShellCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android15IResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_11BnInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BnResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BnResultReceiverE4_NS_7BBinderE;
- _ZTCN7android16BnResultReceiverE4_NS_7IBinderE;
- _ZTCN7android16BpResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BpResultReceiverE0_NS_11BpInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BpResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BpResultReceiverE4_NS_9BpRefBaseE;
- _ZTCN7android18ServiceManagerShimE0_NS_10IInterfaceE;
- _ZTCN7android18ServiceManagerShimE0_NS_15IServiceManagerE;
- _ZTCN7android2os15IClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BnClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS_11BnInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BnClientCallbackE4_NS_7BBinderE;
- _ZTCN7android2os16BnClientCallbackE4_NS_7IBinderE;
- _ZTCN7android2os16BnServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BnServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnServiceManagerE0_NS_11BnInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BnServiceManagerE4_NS_7BBinderE;
- _ZTCN7android2os16BnServiceManagerE4_NS_7IBinderE;
- _ZTCN7android2os16BpClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BpClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpClientCallbackE0_NS_11BpInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BpClientCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android2os16BpServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BpServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpServiceManagerE0_NS_11BpInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BpServiceManagerE4_NS_9BpRefBaseE;
- _ZTCN7android2os16IServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_11BnInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BnServiceCallbackE4_NS_7BBinderE;
- _ZTCN7android2os17BnServiceCallbackE4_NS_7IBinderE;
- _ZTCN7android2os17BpServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BpServiceCallbackE4_NS_9BpRefBaseE;
- _ZTCN7android7BBinderE0_NS_7IBinderE;
- _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_11BnInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE4_NS_7BBinderE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE4_NS_7IBinderE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_11BpInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE4_NS_9BpRefBaseE;
- _ZTCN7android7content2pm22IPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_11BnInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE4_NS_7BBinderE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE4_NS_7IBinderE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_11BpInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE4_NS_9BpRefBaseE;
- _ZTCN7android7IMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BnMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BnMemoryE4_NS_7BBinderE;
- _ZTCN7android8BnMemoryE4_NS_7IBinderE;
- _ZTCN7android8BpBinderE0_NS_7IBinderE;
- _ZTCN7android8BpMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BpMemoryE0_NS_11BpInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BpMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BpMemoryE4_NS_9BpRefBaseE;
- _ZTCN7android9HeapCacheE0_NS_7IBinder14DeathRecipientE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE8_NS_13basic_ostreamIcS2_EE;
- _ZThn4_N7android10AllocationD0Ev;
- _ZThn4_N7android10AllocationD1Ev;
- _ZThn4_N7android10MemoryBaseD0Ev;
- _ZThn4_N7android10MemoryBaseD1Ev;
- _ZThn4_N7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android12BnMemoryHeapD0Ev;
- _ZThn4_N7android12BnMemoryHeapD1Ev;
- _ZThn4_N7android12BpMemoryHeapD0Ev;
- _ZThn4_N7android12BpMemoryHeapD1Ev;
- _ZThn4_N7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn4_N7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn4_N7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn4_N7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn4_N7android8BnMemoryD0Ev;
- _ZThn4_N7android8BnMemoryD1Ev;
- _ZThn4_N7android8BpMemoryD0Ev;
- _ZThn4_N7android8BpMemoryD1Ev;
- _ZTTN7android10AllocationE;
- _ZTTN7android10IInterfaceE;
- _ZTTN7android10MemoryBaseE;
- _ZTTN7android10PoolThreadE;
- _ZTTN7android10RpcSessionE;
- _ZTTN7android11IMemoryHeapE;
- _ZTTN7android12BnMemoryHeapE;
- _ZTTN7android12BpMemoryHeapE;
- _ZTTN7android12ProcessStateE;
- _ZTTN7android14IShellCallbackE;
- _ZTTN7android14MemoryHeapBaseE;
- _ZTTN7android15BnShellCallbackE;
- _ZTTN7android15BpShellCallbackE;
- _ZTTN7android15IResultReceiverE;
- _ZTTN7android15IServiceManagerE;
- _ZTTN7android16BnResultReceiverE;
- _ZTTN7android16BpResultReceiverE;
- _ZTTN7android18ServiceManagerShimE;
- _ZTTN7android2os15IClientCallbackE;
- _ZTTN7android2os15IServiceManagerE;
- _ZTTN7android2os16BnClientCallbackE;
- _ZTTN7android2os16BnServiceManagerE;
- _ZTTN7android2os16BpClientCallbackE;
- _ZTTN7android2os16BpServiceManagerE;
- _ZTTN7android2os16IServiceCallbackE;
- _ZTTN7android2os17BnServiceCallbackE;
- _ZTTN7android2os17BpServiceCallbackE;
- _ZTTN7android7BBinderE;
- _ZTTN7android7content2pm21IPackageManagerNativeE;
- _ZTTN7android7content2pm22BnPackageManagerNativeE;
- _ZTTN7android7content2pm22BpPackageManagerNativeE;
- _ZTTN7android7content2pm22IPackageChangeObserverE;
- _ZTTN7android7content2pm23BnPackageChangeObserverE;
- _ZTTN7android7content2pm23BpPackageChangeObserverE;
- _ZTTN7android7IBinderE;
- _ZTTN7android7IMemoryE;
- _ZTTN7android8BnMemoryE;
- _ZTTN7android8BpBinderE;
- _ZTTN7android8BpMemoryE;
- _ZTTN7android9BpRefBaseE;
- _ZTTN7android9HeapCacheE;
- _ZTTN7android9RpcServerE;
- _ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
- _ZTv0_n12_N7android10AllocationD0Ev;
- _ZTv0_n12_N7android10AllocationD1Ev;
- _ZTv0_n12_N7android10IInterfaceD0Ev;
- _ZTv0_n12_N7android10IInterfaceD1Ev;
- _ZTv0_n12_N7android10MemoryBaseD0Ev;
- _ZTv0_n12_N7android10MemoryBaseD1Ev;
- _ZTv0_n12_N7android10RpcSessionD0Ev;
- _ZTv0_n12_N7android10RpcSessionD1Ev;
- _ZTv0_n12_N7android11IMemoryHeapD0Ev;
- _ZTv0_n12_N7android11IMemoryHeapD1Ev;
- _ZTv0_n12_N7android12BnMemoryHeapD0Ev;
- _ZTv0_n12_N7android12BnMemoryHeapD1Ev;
- _ZTv0_n12_N7android12BpMemoryHeapD0Ev;
- _ZTv0_n12_N7android12BpMemoryHeapD1Ev;
- _ZTv0_n12_N7android12ProcessStateD0Ev;
- _ZTv0_n12_N7android12ProcessStateD1Ev;
- _ZTv0_n12_N7android14IShellCallbackD0Ev;
- _ZTv0_n12_N7android14IShellCallbackD1Ev;
- _ZTv0_n12_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n12_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n12_N7android15IResultReceiverD0Ev;
- _ZTv0_n12_N7android15IResultReceiverD1Ev;
- _ZTv0_n12_N7android15IServiceManagerD0Ev;
- _ZTv0_n12_N7android15IServiceManagerD1Ev;
- _ZTv0_n12_N7android2os15IClientCallbackD0Ev;
- _ZTv0_n12_N7android2os15IClientCallbackD1Ev;
- _ZTv0_n12_N7android2os15IServiceManagerD0Ev;
- _ZTv0_n12_N7android2os15IServiceManagerD1Ev;
- _ZTv0_n12_N7android2os16IServiceCallbackD0Ev;
- _ZTv0_n12_N7android2os16IServiceCallbackD1Ev;
- _ZTv0_n12_N7android7BBinderD0Ev;
- _ZTv0_n12_N7android7BBinderD1Ev;
- _ZTv0_n12_N7android7content2pm21IPackageManagerNativeD0Ev;
- _ZTv0_n12_N7android7content2pm21IPackageManagerNativeD1Ev;
- _ZTv0_n12_N7android7content2pm22IPackageChangeObserverD0Ev;
- _ZTv0_n12_N7android7content2pm22IPackageChangeObserverD1Ev;
- _ZTv0_n12_N7android7IBinderD0Ev;
- _ZTv0_n12_N7android7IBinderD1Ev;
- _ZTv0_n12_N7android7IMemoryD0Ev;
- _ZTv0_n12_N7android7IMemoryD1Ev;
- _ZTv0_n12_N7android8BnMemoryD0Ev;
- _ZTv0_n12_N7android8BnMemoryD1Ev;
- _ZTv0_n12_N7android8BpBinderD0Ev;
- _ZTv0_n12_N7android8BpBinderD1Ev;
- _ZTv0_n12_N7android8BpMemoryD0Ev;
- _ZTv0_n12_N7android8BpMemoryD1Ev;
- _ZTv0_n12_N7android9BpRefBaseD0Ev;
- _ZTv0_n12_N7android9BpRefBaseD1Ev;
- _ZTv0_n12_N7android9HeapCacheD0Ev;
- _ZTv0_n12_N7android9HeapCacheD1Ev;
- _ZTv0_n12_N7android9RpcServerD0Ev;
- _ZTv0_n12_N7android9RpcServerD1Ev;
- _ZTv0_n16_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n16_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n16_N7android8BpBinder10onFirstRefEv;
- _ZTv0_n16_N7android9BpRefBase10onFirstRefEv;
- _ZTv0_n20_N7android8BpBinder15onLastStrongRefEPKv;
- _ZTv0_n20_N7android9BpRefBase15onLastStrongRefEPKv;
- _ZTv0_n24_N7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZTv0_n24_N7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZTv0_n28_NK7android14MemoryHeapBase9getHeapIDEv;
- _ZTv0_n32_NK7android14MemoryHeapBase7getBaseEv;
- _ZTv0_n36_NK7android14MemoryHeapBase7getSizeEv;
- _ZTv0_n40_NK7android14MemoryHeapBase8getFlagsEv;
- _ZTv0_n44_NK7android14MemoryHeapBase9getOffsetEv;
- _ZTvn4_n16_N7android14MemoryHeapBaseD0Ev;
- _ZTvn4_n16_N7android14MemoryHeapBaseD1Ev;
- _ZTVN7android10AllocationE;
- _ZTVN7android10IInterfaceE;
- _ZTVN7android10MemoryBaseE;
- _ZTVN7android10PoolThreadE;
- _ZTVN7android10RpcSession13RpcConnectionE;
- _ZTVN7android10RpcSessionE;
- _ZTVN7android10TextOutputE;
- _ZTVN7android11IMemoryHeapE;
- _ZTVN7android12BnMemoryHeapE;
- _ZTVN7android12BpMemoryHeapE;
- _ZTVN7android12FdTextOutputE;
- _ZTVN7android12MemoryDealerE;
- _ZTVN7android12ProcessStateE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEEE;
- _ZTVN7android13LogTextOutputE;
- _ZTVN7android14IShellCallbackE;
- _ZTVN7android14MemoryHeapBaseE;
- _ZTVN7android15BnShellCallbackE;
- _ZTVN7android15BpShellCallbackE;
- _ZTVN7android15IResultReceiverE;
- _ZTVN7android15IServiceManagerE;
- _ZTVN7android16BnResultReceiverE;
- _ZTVN7android16BpResultReceiverE;
- _ZTVN7android17InetSocketAddressE;
- _ZTVN7android17UnixSocketAddressE;
- _ZTVN7android18BufferedTextOutput11BufferStateE;
- _ZTVN7android18BufferedTextOutputE;
- _ZTVN7android18ServiceManagerShimE;
- _ZTVN7android18VsockSocketAddressE;
- _ZTVN7android2os15IClientCallbackE;
- _ZTVN7android2os15IServiceManagerE;
- _ZTVN7android2os16BnClientCallbackE;
- _ZTVN7android2os16BnServiceManagerE;
- _ZTVN7android2os16BpClientCallbackE;
- _ZTVN7android2os16BpServiceManagerE;
- _ZTVN7android2os16IServiceCallbackE;
- _ZTVN7android2os16ParcelableHolderE;
- _ZTVN7android2os16ServiceDebugInfoE;
- _ZTVN7android2os17BnServiceCallbackE;
- _ZTVN7android2os17BpServiceCallbackE;
- _ZTVN7android2os17PersistableBundleE;
- _ZTVN7android2os20ParcelFileDescriptorE;
- _ZTVN7android6VectorIiEE;
- _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;
- _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE;
- _ZTVN7android6VectorINS_8BpBinder8ObituaryEEE;
- _ZTVN7android6VectorINS_8String16EEE;
- _ZTVN7android6VectorIPNS_7BBinderEEE;
- _ZTVN7android6VectorIPNS_7RefBase12weakref_typeEEE;
- _ZTVN7android6VectorIPNS_7RefBaseEEE;
- _ZTVN7android7BBinderE;
- _ZTVN7android7content2pm18PackageChangeEventE;
- _ZTVN7android7content2pm21IPackageManagerNativeE;
- _ZTVN7android7content2pm22BnPackageManagerNativeE;
- _ZTVN7android7content2pm22BpPackageManagerNativeE;
- _ZTVN7android7content2pm22IPackageChangeObserverE;
- _ZTVN7android7content2pm23BnPackageChangeObserverE;
- _ZTVN7android7content2pm23BpPackageChangeObserverE;
- _ZTVN7android7IBinderE;
- _ZTVN7android7IMemoryE;
- _ZTVN7android8BnMemoryE;
- _ZTVN7android8BpBinderE;
- _ZTVN7android8BpMemoryE;
- _ZTVN7android9BpRefBaseE;
- _ZTVN7android9HeapCacheE;
- _ZTVN7android9RpcServerE;
- local:
- *;
-};
diff --git a/libs/binder/libbinder.arm64.map b/libs/binder/libbinder.arm64.map
deleted file mode 100644
index 6211250..0000000
--- a/libs/binder/libbinder.arm64.map
+++ /dev/null
@@ -1,1395 +0,0 @@
-# b/190148312: Populate with correct list of ABI symbols
-LIBBINDER {
- global:
- getBinderKernelReferences;
- kDefaultDriver;
- _ZN7android10AllocationC1ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEElm;
- _ZN7android10AllocationC2ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEElm;
- _ZN7android10AllocationD0Ev;
- _ZN7android10AllocationD1Ev;
- _ZN7android10AllocationD2Ev;
- _ZN7android10IInterface8asBinderEPKS0_;
- _ZN7android10IInterface8asBinderERKNS_2spIS0_EE;
- _ZN7android10IInterfaceC2Ev;
- _ZN7android10IInterfaceD0Ev;
- _ZN7android10IInterfaceD1Ev;
- _ZN7android10IInterfaceD2Ev;
- _ZN7android10MemoryBaseC1ERKNS_2spINS_11IMemoryHeapEEElm;
- _ZN7android10MemoryBaseC2ERKNS_2spINS_11IMemoryHeapEEElm;
- _ZN7android10MemoryBaseD0Ev;
- _ZN7android10MemoryBaseD1Ev;
- _ZN7android10MemoryBaseD2Ev;
- _ZN7android10RpcAddress14readFromParcelERKNS_6ParcelE;
- _ZN7android10RpcAddress15fromRawEmbeddedEPKNS_14RpcWireAddressE;
- _ZN7android10RpcAddress4zeroEv;
- _ZN7android10RpcAddress6uniqueEv;
- _ZN7android10RpcAddressC1Ev;
- _ZN7android10RpcAddressC2Ev;
- _ZN7android10RpcAddressD1Ev;
- _ZN7android10RpcAddressD2Ev;
- _ZN7android10RpcSession12setForServerERKNS_2wpINS_9RpcServerEEEi;
- _ZN7android10RpcSession13getRootObjectEv;
- _ZN7android10RpcSession13sendDecStrongERKNS_10RpcAddressE;
- _ZN7android10RpcSession15setupInetClientEPKcj;
- _ZN7android10RpcSession15terminateLockedEv;
- _ZN7android10RpcSession16setupVsockClientEjj;
- _ZN7android10RpcSession17setupSocketClientERKNS_16RpcSocketAddressE;
- _ZN7android10RpcSession19addClientConnectionENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession19ExclusiveConnection14findConnectionEiPNS_2spINS0_13RpcConnectionEEES5_RNSt3__16vectorIS4_NS6_9allocatorIS4_EEEEm;
- _ZN7android10RpcSession19ExclusiveConnectionC1ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionC2ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionD1Ev;
- _ZN7android10RpcSession19ExclusiveConnectionD2Ev;
- _ZN7android10RpcSession19getRemoteMaxThreadsEPm;
- _ZN7android10RpcSession20setupOneSocketClientERKNS_16RpcSocketAddressEi;
- _ZN7android10RpcSession21setupUnixDomainClientEPKc;
- _ZN7android10RpcSession22addNullDebuggingClientEv;
- _ZN7android10RpcSession22removeServerConnectionERKNS_2spINS0_13RpcConnectionEEE;
- _ZN7android10RpcSession24assignServerToThisThreadENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4joinENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4makeEv;
- _ZN7android10RpcSession6readIdEv;
- _ZN7android10RpcSession6serverEv;
- _ZN7android10RpcSession7preJoinENSt3__16threadE;
- _ZN7android10RpcSession8transactERKNS_10RpcAddressEjRKNS_6ParcelEPS4_j;
- _ZN7android10RpcSessionC1Ev;
- _ZN7android10RpcSessionC2Ev;
- _ZN7android10RpcSessionD0Ev;
- _ZN7android10RpcSessionD1Ev;
- _ZN7android10RpcSessionD2Ev;
- _ZN7android10TextOutputC2Ev;
- _ZN7android10TextOutputD0Ev;
- _ZN7android10TextOutputD1Ev;
- _ZN7android10TextOutputD2Ev;
- _ZN7android10zeroMemoryEPhm;
- _ZN7android11BnInterfaceINS_11IMemoryHeapEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_14IShellCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_15IResultReceiverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_21IPermissionControllerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IClientCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IServiceManagerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os16IServiceCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm21IPackageManagerNativeEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm22IPackageChangeObserverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7IMemoryEE10onAsBinderEv;
- _ZN7android11IMemoryHeap10descriptorE;
- _ZN7android11IMemoryHeap11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android11IMemoryHeap12default_implE;
- _ZN7android11IMemoryHeap14getDefaultImplEv;
- _ZN7android11IMemoryHeap14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android11IMemoryHeapC2Ev;
- _ZN7android11IMemoryHeapD0Ev;
- _ZN7android11IMemoryHeapD1Ev;
- _ZN7android11IMemoryHeapD2Ev;
- _ZN7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android12BnMemoryHeapC2Ev;
- _ZN7android12BnMemoryHeapD0Ev;
- _ZN7android12BnMemoryHeapD1Ev;
- _ZN7android12BnMemoryHeapD2Ev;
- _ZN7android12BpMemoryHeapC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapD0Ev;
- _ZN7android12BpMemoryHeapD1Ev;
- _ZN7android12BpMemoryHeapD2Ev;
- _ZN7android12gTextBuffersE;
- _ZN7android12MemoryDealer10deallocateEm;
- _ZN7android12MemoryDealer22getAllocationAlignmentEv;
- _ZN7android12MemoryDealer8allocateEm;
- _ZN7android12MemoryDealerC1EmPKcj;
- _ZN7android12MemoryDealerC2EmPKcj;
- _ZN7android12MemoryDealerD0Ev;
- _ZN7android12MemoryDealerD1Ev;
- _ZN7android12MemoryDealerD2Ev;
- _ZN7android12printHexDataEiPKvmmimbPFvPvPKcES2_;
- _ZN7android12ProcessState10selfOrNullEv;
- _ZN7android12ProcessState13expungeHandleEiPNS_7IBinderE;
- _ZN7android12ProcessState13getDriverNameEv;
- _ZN7android12ProcessState14initWithDriverEPKc;
- _ZN7android12ProcessState15startThreadPoolEv;
- _ZN7android12ProcessState16getContextObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android12ProcessState17spawnPooledThreadEb;
- _ZN7android12ProcessState18giveThreadPoolNameEv;
- _ZN7android12ProcessState18lookupHandleLockedEi;
- _ZN7android12ProcessState18setCallRestrictionENS0_15CallRestrictionE;
- _ZN7android12ProcessState19getKernelReferencesEmPm;
- _ZN7android12ProcessState20becomeContextManagerEv;
- _ZN7android12ProcessState20makeBinderThreadNameEv;
- _ZN7android12ProcessState23getStrongProxyForHandleEi;
- _ZN7android12ProcessState24getStrongRefCountForNodeERKNS_2spINS_8BpBinderEEE;
- _ZN7android12ProcessState25enableOnewaySpamDetectionEb;
- _ZN7android12ProcessState27setThreadPoolMaxThreadCountEm;
- _ZN7android12ProcessState4initEPKcb;
- _ZN7android12ProcessState4selfEv;
- _ZN7android12ProcessStateC1EPKc;
- _ZN7android12ProcessStateC2EPKc;
- _ZN7android12ProcessStateD0Ev;
- _ZN7android12ProcessStateD1Ev;
- _ZN7android12ProcessStateD2Ev;
- _ZN7android13printTypeCodeEjPFvPvPKcES0_;
- _ZN7android14IPCThreadState10freeBufferEPNS_6ParcelEPKhmPKym;
- _ZN7android14IPCThreadState10selfOrNullEv;
- _ZN7android14IPCThreadState11clearCallerEv;
- _ZN7android14IPCThreadState11stopProcessEb;
- _ZN7android14IPCThreadState12setupPollingEPi;
- _ZN7android14IPCThreadState13decWeakHandleEi;
- _ZN7android14IPCThreadState13expungeHandleEiPNS_7IBinderE;
- _ZN7android14IPCThreadState13flushCommandsEv;
- _ZN7android14IPCThreadState13flushIfNeededEv;
- _ZN7android14IPCThreadState13incWeakHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState14clearLastErrorEv;
- _ZN7android14IPCThreadState14executeCommandEi;
- _ZN7android14IPCThreadState14joinThreadPoolEb;
- _ZN7android14IPCThreadState14talkWithDriverEb;
- _ZN7android14IPCThreadState15decStrongHandleEi;
- _ZN7android14IPCThreadState15incStrongHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi;
- _ZN7android14IPCThreadState16threadDestructorEPv;
- _ZN7android14IPCThreadState18setCallRestrictionENS_12ProcessState15CallRestrictionE;
- _ZN7android14IPCThreadState19setStrictModePolicyEi;
- _ZN7android14IPCThreadState19setTheContextObjectERKNS_2spINS_7BBinderEEE;
- _ZN7android14IPCThreadState20clearCallingIdentityEv;
- _ZN7android14IPCThreadState20getAndExecuteCommandEv;
- _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_;
- _ZN7android14IPCThreadState20handlePolledCommandsEv;
- _ZN7android14IPCThreadState20processPendingDerefsEv;
- _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi;
- _ZN7android14IPCThreadState22attemptIncStrongHandleEi;
- _ZN7android14IPCThreadState22clearCallingWorkSourceEv;
- _ZN7android14IPCThreadState22clearDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState22processPostWriteDerefsEv;
- _ZN7android14IPCThreadState22restoreCallingIdentityEl;
- _ZN7android14IPCThreadState23setCallingWorkSourceUidEj;
- _ZN7android14IPCThreadState24clearPropagateWorkSourceEv;
- _ZN7android14IPCThreadState24requestDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState24restoreCallingWorkSourceEl;
- _ZN7android14IPCThreadState25blockUntilThreadAvailableEv;
- _ZN7android14IPCThreadState27disableBackgroundSchedulingEb;
- _ZN7android14IPCThreadState28backgroundSchedulingDisabledEv;
- _ZN7android14IPCThreadState29setLastTransactionBinderFlagsEi;
- _ZN7android14IPCThreadState41setCallingWorkSourceUidWithoutPropagationEj;
- _ZN7android14IPCThreadState4selfEv;
- _ZN7android14IPCThreadState6freezeEibj;
- _ZN7android14IPCThreadState7processEv;
- _ZN7android14IPCThreadState8shutdownEv;
- _ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j;
- _ZN7android14IPCThreadState9sendReplyERKNS_6ParcelEj;
- _ZN7android14IPCThreadStateC1Ev;
- _ZN7android14IPCThreadStateC2Ev;
- _ZN7android14IPCThreadStateD1Ev;
- _ZN7android14IPCThreadStateD2Ev;
- _ZN7android14IShellCallback10descriptorE;
- _ZN7android14IShellCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android14IShellCallback12default_implE;
- _ZN7android14IShellCallback14getDefaultImplEv;
- _ZN7android14IShellCallback14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android14IShellCallbackC2Ev;
- _ZN7android14IShellCallbackD0Ev;
- _ZN7android14IShellCallbackD1Ev;
- _ZN7android14IShellCallbackD2Ev;
- _ZN7android14MemoryHeapBase4initEiPvmiPKc;
- _ZN7android14MemoryHeapBase5mapfdEibml;
- _ZN7android14MemoryHeapBase7disposeEv;
- _ZN7android14MemoryHeapBaseC1Eimjl;
- _ZN7android14MemoryHeapBaseC1EmjPKc;
- _ZN7android14MemoryHeapBaseC1EPKcmj;
- _ZN7android14MemoryHeapBaseC1Ev;
- _ZN7android14MemoryHeapBaseC2Eimjl;
- _ZN7android14MemoryHeapBaseC2EmjPKc;
- _ZN7android14MemoryHeapBaseC2EPKcmj;
- _ZN7android14MemoryHeapBaseC2Ev;
- _ZN7android14MemoryHeapBaseD0Ev;
- _ZN7android14MemoryHeapBaseD1Ev;
- _ZN7android14MemoryHeapBaseD2Ev;
- _ZN7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android15checkPermissionERKNS_8String16Eij;
- _ZN7android15IResultReceiver10descriptorE;
- _ZN7android15IResultReceiver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android15IResultReceiver12default_implE;
- _ZN7android15IResultReceiver14getDefaultImplEv;
- _ZN7android15IResultReceiver14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android15IResultReceiverC2Ev;
- _ZN7android15IResultReceiverD0Ev;
- _ZN7android15IResultReceiverD1Ev;
- _ZN7android15IResultReceiverD2Ev;
- _ZN7android15IServiceManagerC2Ev;
- _ZN7android15IServiceManagerD0Ev;
- _ZN7android15IServiceManagerD1Ev;
- _ZN7android15IServiceManagerD2Ev;
- _ZN7android15PermissionCache10purgeCacheEv;
- _ZN7android15PermissionCache15checkPermissionERKNS_8String16Eij;
- _ZN7android15PermissionCache22checkCallingPermissionERKNS_8String16E;
- _ZN7android15PermissionCache22checkCallingPermissionERKNS_8String16EPiS4_;
- _ZN7android15PermissionCache5cacheERKNS_8String16Ejb;
- _ZN7android15PermissionCache5purgeEv;
- _ZN7android15PermissionCacheC1Ev;
- _ZN7android15PermissionCacheC2Ev;
- _ZN7android15stringForIndentEi;
- _ZN7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android18BufferedTextOutput10moveIndentEi;
- _ZN7android18BufferedTextOutput10pushBundleEv;
- _ZN7android18BufferedTextOutput5printEPKcm;
- _ZN7android18BufferedTextOutput9popBundleEv;
- _ZN7android18BufferedTextOutputC2Ej;
- _ZN7android18BufferedTextOutputD0Ev;
- _ZN7android18BufferedTextOutputD1Ev;
- _ZN7android18BufferedTextOutputD2Ev;
- _ZN7android18ServiceManagerShim10addServiceERKNS_8String16ERKNS_2spINS_7IBinderEEEbi;
- _ZN7android18ServiceManagerShim10isDeclaredERKNS_8String16E;
- _ZN7android18ServiceManagerShim12listServicesEi;
- _ZN7android18ServiceManagerShim14waitForServiceERKNS_8String16E;
- _ZN7android18ServiceManagerShim16updatableViaApexERKNS_8String16E;
- _ZN7android18ServiceManagerShim20getDeclaredInstancesERKNS_8String16E;
- _ZN7android18ServiceManagerShimC1ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18ServiceManagerShimC2ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18the_context_objectE;
- _ZN7android20PermissionController10getServiceEv;
- _ZN7android20PermissionController13getPackageUidERKNS_8String16Ei;
- _ZN7android20PermissionController15checkPermissionERKNS_8String16Eii;
- _ZN7android20PermissionController17getPackagesForUidEjRNS_6VectorINS_8String16EEE;
- _ZN7android20PermissionController19isRuntimePermissionERKNS_8String16E;
- _ZN7android20PermissionController6noteOpERKNS_8String16EiS3_;
- _ZN7android20PermissionControllerC1Ev;
- _ZN7android20PermissionControllerC2Ev;
- _ZN7android21defaultServiceManagerEv;
- _ZN7android21IPermissionController10descriptorE;
- _ZN7android21IPermissionController11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android21IPermissionController12default_implE;
- _ZN7android21IPermissionController14getDefaultImplEv;
- _ZN7android21IPermissionController14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android21IPermissionControllerC2Ev;
- _ZN7android21IPermissionControllerD0Ev;
- _ZN7android21IPermissionControllerD1Ev;
- _ZN7android21IPermissionControllerD2Ev;
- _ZN7android22BnPermissionController10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android22checkCallingPermissionERKNS_8String16E;
- _ZN7android22checkCallingPermissionERKNS_8String16EPiS3_;
- _ZN7android22SimpleBestFitAllocator10deallocateEm;
- _ZN7android22SimpleBestFitAllocator12kMemoryAlignE;
- _ZN7android22SimpleBestFitAllocator5allocEmj;
- _ZN7android22SimpleBestFitAllocator7deallocEm;
- _ZN7android22SimpleBestFitAllocator8allocateEmj;
- _ZN7android22SimpleBestFitAllocatorC1Em;
- _ZN7android22SimpleBestFitAllocatorC2Em;
- _ZN7android22SimpleBestFitAllocatorD1Ev;
- _ZN7android22SimpleBestFitAllocatorD2Ev;
- _ZN7android24setDefaultServiceManagerERKNS_2spINS_15IServiceManagerEEE;
- _ZN7android2os15IClientCallback10descriptorE;
- _ZN7android2os15IClientCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IClientCallback12default_implE;
- _ZN7android2os15IClientCallback14getDefaultImplEv;
- _ZN7android2os15IClientCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IClientCallbackC2Ev;
- _ZN7android2os15IClientCallbackD0Ev;
- _ZN7android2os15IClientCallbackD1Ev;
- _ZN7android2os15IClientCallbackD2Ev;
- _ZN7android2os15IServiceManager10descriptorE;
- _ZN7android2os15IServiceManager11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IServiceManager12default_implE;
- _ZN7android2os15IServiceManager14getDefaultImplEv;
- _ZN7android2os15IServiceManager14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IServiceManagerC2Ev;
- _ZN7android2os15IServiceManagerD0Ev;
- _ZN7android2os15IServiceManagerD1Ev;
- _ZN7android2os15IServiceManagerD2Ev;
- _ZN7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnClientCallbackC2Ev;
- _ZN7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnServiceManagerC2Ev;
- _ZN7android2os16BpClientCallback9onClientsERKNS_2spINS_7IBinderEEEb;
- _ZN7android2os16BpClientCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpClientCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10addServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEEbi;
- _ZN7android2os16BpServiceManager10getServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10isDeclaredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPb;
- _ZN7android2os16BpServiceManager12checkServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager12listServicesEiPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEE;
- _ZN7android2os16BpServiceManager16updatableViaApexERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_8optionalIS8_EE;
- _ZN7android2os16BpServiceManager19getServiceDebugInfoEPNSt3__16vectorINS0_16ServiceDebugInfoENS2_9allocatorIS4_EEEE;
- _ZN7android2os16BpServiceManager20getDeclaredInstancesERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_6vectorIS8_NS6_IS8_EEEE;
- _ZN7android2os16BpServiceManager20tryUnregisterServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager22registerClientCallbackERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEERKNSB_INS0_15IClientCallbackEEE;
- _ZN7android2os16BpServiceManager24registerForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManager26unregisterForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManagerC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManagerC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback10descriptorE;
- _ZN7android2os16IServiceCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback12default_implE;
- _ZN7android2os16IServiceCallback14getDefaultImplEv;
- _ZN7android2os16IServiceCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os16IServiceCallbackC2Ev;
- _ZN7android2os16IServiceCallbackD0Ev;
- _ZN7android2os16IServiceCallbackD1Ev;
- _ZN7android2os16IServiceCallbackD2Ev;
- _ZN7android2os16ParcelableHolder14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os16ServiceDebugInfo14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os17BnServiceCallbackC2Ev;
- _ZN7android2os17BpServiceCallback14onRegistrationERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17PersistableBundle10putBooleanERKNS_8String16Eb;
- _ZN7android2os17PersistableBundle12putIntVectorERKNS_8String16ERKNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZN7android2os17PersistableBundle13putLongVectorERKNS_8String16ERKNSt3__16vectorIlNS5_9allocatorIlEEEE;
- _ZN7android2os17PersistableBundle14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17PersistableBundle15putDoubleVectorERKNS_8String16ERKNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZN7android2os17PersistableBundle15putStringVectorERKNS_8String16ERKNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZN7android2os17PersistableBundle16putBooleanVectorERKNS_8String16ERKNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZN7android2os17PersistableBundle19readFromParcelInnerEPKNS_6ParcelEm;
- _ZN7android2os17PersistableBundle20putPersistableBundleERKNS_8String16ERKS1_;
- _ZN7android2os17PersistableBundle5eraseERKNS_8String16E;
- _ZN7android2os17PersistableBundle6putIntERKNS_8String16Ei;
- _ZN7android2os17PersistableBundle7putLongERKNS_8String16El;
- _ZN7android2os17PersistableBundle9putDoubleERKNS_8String16Ed;
- _ZN7android2os17PersistableBundle9putStringERKNS_8String16ES4_;
- _ZN7android2os20ParcelFileDescriptor14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os20ParcelFileDescriptorC1ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC1Ev;
- _ZN7android2os20ParcelFileDescriptorC2ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC2Ev;
- _ZN7android2os20ParcelFileDescriptorD0Ev;
- _ZN7android2os20ParcelFileDescriptorD1Ev;
- _ZN7android2os20ParcelFileDescriptorD2Ev;
- _ZN7android4aerrE;
- _ZN7android4alogE;
- _ZN7android4aoutE;
- _ZN7android6binder20LazyServiceRegistrar10reRegisterEv;
- _ZN7android6binder20LazyServiceRegistrar11getInstanceEv;
- _ZN7android6binder20LazyServiceRegistrar12forcePersistEb;
- _ZN7android6binder20LazyServiceRegistrar13tryUnregisterEv;
- _ZN7android6binder20LazyServiceRegistrar15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEbi;
- _ZN7android6binder20LazyServiceRegistrar25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder20LazyServiceRegistrarC1Ev;
- _ZN7android6binder20LazyServiceRegistrarC2Ev;
- _ZN7android6binder6Status11fromStatusTEi;
- _ZN7android6binder6Status12setExceptionEiRKNS_7String8E;
- _ZN7android6binder6Status14readFromParcelERKNS_6ParcelE;
- _ZN7android6binder6Status14setFromStatusTEi;
- _ZN7android6binder6Status17exceptionToStringEi;
- _ZN7android6binder6Status17fromExceptionCodeEi;
- _ZN7android6binder6Status17fromExceptionCodeEiPKc;
- _ZN7android6binder6Status17fromExceptionCodeEiRKNS_7String8E;
- _ZN7android6binder6Status23setServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status24fromServiceSpecificErrorEi;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiPKc;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status2okEv;
- _ZN7android6binder6StatusC1Eii;
- _ZN7android6binder6StatusC1EiiRKNS_7String8E;
- _ZN7android6binder6StatusC2Eii;
- _ZN7android6binder6StatusC2EiiRKNS_7String8E;
- _ZN7android6binder8internal21ClientCounterCallback10reRegisterEv;
- _ZN7android6binder8internal21ClientCounterCallback12forcePersistEb;
- _ZN7android6binder8internal21ClientCounterCallback13tryUnregisterEv;
- _ZN7android6binder8internal21ClientCounterCallback15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi;
- _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder8internal21ClientCounterCallbackC1Ev;
- _ZN7android6binder8internal21ClientCounterCallbackC2Ev;
- _ZN7android6Parcel10appendFromEPKS0_mm;
- _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;
- _ZN7android6Parcel10writeFloatEf;
- _ZN7android6Parcel10writeInt32Ei;
- _ZN7android6Parcel10writeInt64El;
- _ZN7android6Parcel11compareDataERKS0_;
- _ZN7android6Parcel11finishWriteEm;
- _ZN7android6Parcel11setDataSizeEm;
- _ZN7android6Parcel11writeDoubleEd;
- _ZN7android6Parcel11writeObjectERK18flat_binder_objectb;
- _ZN7android6Parcel11writeUint32Ej;
- _ZN7android6Parcel11writeUint64Em;
- _ZN7android6Parcel12pushAllowFdsEb;
- _ZN7android6Parcel12restartWriteEm;
- _ZN7android6Parcel12writeCStringEPKc;
- _ZN7android6Parcel12writeInplaceEm;
- _ZN7android6Parcel12writePointerEm;
- _ZN7android6Parcel12writeString8EPKcm;
- _ZN7android6Parcel12writeString8ERKNS_7String8E;
- _ZN7android6Parcel13continueWriteEm;
- _ZN7android6Parcel13flattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13markForBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13writeString16EPKDsm;
- _ZN7android6Parcel13writeString16ERKNS_8String16E;
- _ZN7android6Parcel13writeString16ERKNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZN7android6Parcel13writeString16ERKNSt3__18optionalINS_8String16EEE;
- _ZN7android6Parcel13writeUnpaddedEPKvm;
- _ZN7android6Parcel14acquireObjectsEv;
- _ZN7android6Parcel14freeDataNoInitEv;
- _ZN7android6Parcel14releaseObjectsEv;
- _ZN7android6Parcel14writeByteArrayEmPKh;
- _ZN7android6Parcel15restoreAllowFdsEb;
- _ZN7android6Parcel15setDataCapacityEm;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZN7android6Parcel15writeInt32ArrayEmPKi;
- _ZN7android6Parcel15writeParcelableERKNS_10ParcelableE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__110unique_ptrINS1_6vectorIlNS1_9allocatorIlEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__16vectorIlNS1_9allocatorIlEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__18optionalINS1_6vectorIlNS1_9allocatorIlEEEEEE;
- _ZN7android6Parcel16writeNoExceptionEv;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZN7android6Parcel17writeNativeHandleEPK13native_handle;
- _ZN7android6Parcel17writeStrongBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__110unique_ptrINS1_6vectorImNS1_9allocatorImEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__16vectorImNS1_9allocatorImEEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__18optionalINS1_6vectorImNS1_9allocatorImEEEEEE;
- _ZN7android6Parcel18getGlobalAllocSizeEv;
- _ZN7android6Parcel19finishFlattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel19getGlobalAllocCountEv;
- _ZN7android6Parcel19ipcSetDataReferenceEPKhmPKymPFvPS0_S2_mS4_mE;
- _ZN7android6Parcel19writeFileDescriptorEib;
- _ZN7android6Parcel19writeInterfaceTokenEPKDsm;
- _ZN7android6Parcel19writeInterfaceTokenERKNS_8String16E;
- _ZN7android6Parcel19writeString16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZN7android6Parcel20closeFileDescriptorsEv;
- _ZN7android6Parcel22writeDupFileDescriptorEi;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZN7android6Parcel25writeParcelFileDescriptorEib;
- _ZN7android6Parcel25writeUniqueFileDescriptorERKNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android6Parcel26writeRawNullableParcelableEPKNS_10ParcelableE;
- _ZN7android6Parcel27replaceCallingWorkSourceUidEj;
- _ZN7android6Parcel28writeDupParcelFileDescriptorEi;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZN7android6Parcel35writeDupImmutableBlobFileDescriptorEi;
- _ZN7android6Parcel4Blob4initEiPvmb;
- _ZN7android6Parcel4Blob5clearEv;
- _ZN7android6Parcel4Blob7releaseEv;
- _ZN7android6Parcel4BlobC1Ev;
- _ZN7android6Parcel4BlobC2Ev;
- _ZN7android6Parcel4BlobD1Ev;
- _ZN7android6Parcel4BlobD2Ev;
- _ZN7android6Parcel5writeEPKvm;
- _ZN7android6Parcel5writeERKNS0_26FlattenableHelperInterfaceE;
- _ZN7android6Parcel7setDataEPKhm;
- _ZN7android6Parcel8freeDataEv;
- _ZN7android6Parcel8growDataEm;
- _ZN7android6Parcel8setErrorEi;
- _ZN7android6Parcel9initStateEv;
- _ZN7android6Parcel9writeBlobEmbPNS0_12WritableBlobE;
- _ZN7android6Parcel9writeBoolEb;
- _ZN7android6Parcel9writeByteEa;
- _ZN7android6Parcel9writeCharEDs;
- _ZN7android6ParcelC1Ev;
- _ZN7android6ParcelC2Ev;
- _ZN7android6ParcelD1Ev;
- _ZN7android6ParcelD2Ev;
- _ZN7android7BBinder10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinder10pingBinderEv;
- _ZN7android7BBinder11getDebugPidEv;
- _ZN7android7BBinder11isInheritRtEv;
- _ZN7android7BBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android7BBinder11localBinderEv;
- _ZN7android7BBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android7BBinder12detachObjectEPKv;
- _ZN7android7BBinder12getExtensionEv;
- _ZN7android7BBinder12setExtensionERKNS_2spINS_7IBinderEEE;
- _ZN7android7BBinder12setInheritRtEb;
- _ZN7android7BBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android7BBinder15isRequestingSidEv;
- _ZN7android7BBinder16setRequestingSidEb;
- _ZN7android7BBinder17getOrCreateExtrasEv;
- _ZN7android7BBinder21getMinSchedulerPolicyEv;
- _ZN7android7BBinder21setMinSchedulerPolicyEii;
- _ZN7android7BBinder23getMinSchedulerPriorityEv;
- _ZN7android7BBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinderC1Ev;
- _ZN7android7BBinderC2Ev;
- _ZN7android7BBinderD0Ev;
- _ZN7android7BBinderD1Ev;
- _ZN7android7BBinderD2Ev;
- _ZN7android7content2pm18PackageChangeEvent14readFromParcelEPKNS_6ParcelE;
- _ZN7android7content2pm21IPackageManagerNative10descriptorE;
- _ZN7android7content2pm21IPackageManagerNative11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm21IPackageManagerNative12default_implE;
- _ZN7android7content2pm21IPackageManagerNative14getDefaultImplEv;
- _ZN7android7content2pm21IPackageManagerNative14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm21IPackageManagerNativeC2Ev;
- _ZN7android7content2pm21IPackageManagerNativeD0Ev;
- _ZN7android7content2pm21IPackageManagerNativeD1Ev;
- _ZN7android7content2pm21IPackageManagerNativeD2Ev;
- _ZN7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm22BnPackageManagerNativeC2Ev;
- _ZN7android7content2pm22BpPackageManagerNative14getAllPackagesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative15getNamesForUidsERKNSt3__16vectorIiNS3_9allocatorIiEEEEPNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS5_IcEEEENS5_ISE_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative16getLocationFlagsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPi;
- _ZN7android7content2pm22BpPackageManagerNative16hasSystemFeatureERKNS_8String16EiPb;
- _ZN7android7content2pm22BpPackageManagerNative19isPackageDebuggableERKNS_8String16EPb;
- _ZN7android7content2pm22BpPackageManagerNative22getInstallerForPackageERKNS_8String16EPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative24getVersionCodeForPackageERKNS_8String16EPl;
- _ZN7android7content2pm22BpPackageManagerNative27hasSha256SigningCertificateERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIhNS7_IhEEEEPb;
- _ZN7android7content2pm22BpPackageManagerNative28getModuleMetadataPackageNameEPNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29getTargetSdkVersionForPackageERKNS_8String16EPi;
- _ZN7android7content2pm22BpPackageManagerNative29isAudioPlaybackCaptureAllowedERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEPNS4_IbNS8_IbEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29registerPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNative31unregisterPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver10descriptorE;
- _ZN7android7content2pm22IPackageChangeObserver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver12default_implE;
- _ZN7android7content2pm22IPackageChangeObserver14getDefaultImplEv;
- _ZN7android7content2pm22IPackageChangeObserver14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm22IPackageChangeObserverC2Ev;
- _ZN7android7content2pm22IPackageChangeObserverD0Ev;
- _ZN7android7content2pm22IPackageChangeObserverD1Ev;
- _ZN7android7content2pm22IPackageChangeObserverD2Ev;
- _ZN7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm23BnPackageChangeObserverC2Ev;
- _ZN7android7content2pm23BpPackageChangeObserver16onPackageChangedERKNS1_18PackageChangeEventE;
- _ZN7android7content2pm23BpPackageChangeObserverC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm23BpPackageChangeObserverC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7HexDumpC1EPKvmm;
- _ZN7android7HexDumpC2EPKvmm;
- _ZN7android7IBinder11getDebugPidEPi;
- _ZN7android7IBinder11localBinderEv;
- _ZN7android7IBinder12getExtensionEPNS_2spIS0_EE;
- _ZN7android7IBinder12remoteBinderEv;
- _ZN7android7IBinder12shellCommandERKNS_2spIS0_EEiiiRNS_6VectorINS_8String16EEERKNS1_INS_14IShellCallbackEEERKNS1_INS_15IResultReceiverEEE;
- _ZN7android7IBinder19queryLocalInterfaceERKNS_8String16E;
- _ZN7android7IBinderC2Ev;
- _ZN7android7IBinderD0Ev;
- _ZN7android7IBinderD1Ev;
- _ZN7android7IBinderD2Ev;
- _ZN7android7IMemory10descriptorE;
- _ZN7android7IMemory11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7IMemory12default_implE;
- _ZN7android7IMemory14getDefaultImplEv;
- _ZN7android7IMemory14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android7IMemoryC2Ev;
- _ZN7android7IMemoryD0Ev;
- _ZN7android7IMemoryD1Ev;
- _ZN7android7IMemoryD2Ev;
- _ZN7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BnMemoryC2Ev;
- _ZN7android8BnMemoryD0Ev;
- _ZN7android8BnMemoryD1Ev;
- _ZN7android8BnMemoryD2Ev;
- _ZN7android8BpBinder10onFirstRefEv;
- _ZN7android8BpBinder10pingBinderEv;
- _ZN7android8BpBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android8BpBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android8BpBinder12detachObjectEPKv;
- _ZN7android8BpBinder12remoteBinderEv;
- _ZN7android8BpBinder12sendObituaryEv;
- _ZN7android8BpBinder12sTrackingMapE;
- _ZN7android8BpBinder13getCountByUidERNS_6VectorIjEES3_;
- _ZN7android8BpBinder13ObjectManager4killEv;
- _ZN7android8BpBinder13ObjectManager6attachEPKvPvS4_PFvS3_S4_S4_E;
- _ZN7android8BpBinder13ObjectManager6detachEPKv;
- _ZN7android8BpBinder13ObjectManagerC1Ev;
- _ZN7android8BpBinder13ObjectManagerC2Ev;
- _ZN7android8BpBinder13ObjectManagerD1Ev;
- _ZN7android8BpBinder13ObjectManagerD2Ev;
- _ZN7android8BpBinder13sTrackingLockE;
- _ZN7android8BpBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android8BpBinder14reportOneDeathERKNS0_8ObituaryE;
- _ZN7android8BpBinder14sLimitCallbackE;
- _ZN7android8BpBinder15onLastStrongRefEPKv;
- _ZN7android8BpBinder15sNumTrackedUidsE;
- _ZN7android8BpBinder16enableCountByUidEv;
- _ZN7android8BpBinder16setLimitCallbackEPFviE;
- _ZN7android8BpBinder17disableCountByUidEv;
- _ZN7android8BpBinder18sCountByUidEnabledE;
- _ZN7android8BpBinder19getBinderProxyCountEj;
- _ZN7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZN7android8BpBinder20setCountByUidEnabledEb;
- _ZN7android8BpBinder26sBinderProxyThrottleCreateE;
- _ZN7android8BpBinder29sBinderProxyCountLowWatermarkE;
- _ZN7android8BpBinder29setBinderProxyCountWatermarksEii;
- _ZN7android8BpBinder30sBinderProxyCountHighWatermarkE;
- _ZN7android8BpBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android8BpBinder6createEi;
- _ZN7android8BpBinder6createERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BpBinderC1EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC1EONS0_9RpcHandleE;
- _ZN7android8BpBinderC1EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderC2EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC2EONS0_9RpcHandleE;
- _ZN7android8BpBinderC2EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderD0Ev;
- _ZN7android8BpBinderD1Ev;
- _ZN7android8BpBinderD2Ev;
- _ZN7android8BpMemoryC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryD0Ev;
- _ZN7android8BpMemoryD1Ev;
- _ZN7android8BpMemoryD2Ev;
- _ZN7android8internal9Stability11getCategoryEPNS_7IBinderE;
- _ZN7android8internal9Stability11levelStringENS1_5LevelE;
- _ZN7android8internal9Stability13getLocalLevelEv;
- _ZN7android8internal9Stability15isDeclaredLevelENS1_5LevelE;
- _ZN7android8internal9Stability17debugLogStabilityERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability19markCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability22tryMarkCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability24requiresVintfDeclarationERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability25forceDowngradeToStabilityERKNS_2spINS_7IBinderEEENS1_5LevelE;
- _ZN7android8internal9Stability30forceDowngradeToLocalStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToSystemStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToVendorStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability5checkENS1_8CategoryENS1_5LevelE;
- _ZN7android8internal9Stability7setReprEPNS_7IBinderEij;
- _ZN7android8internal9Stability8Category11debugStringEv;
- _ZN7android8internal9Stability8markVndkEPNS_7IBinderE;
- _ZN7android8internal9Stability9markVintfEPNS_7IBinderE;
- _ZN7android8RpcState11CommandDataC1Em;
- _ZN7android8RpcState11CommandDataC2Em;
- _ZN7android8RpcState12countBindersEv;
- _ZN7android8RpcState12getSessionIdERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPi;
- _ZN7android8RpcState12waitForReplyERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPNS_6ParcelE;
- _ZN7android8RpcState13getMaxThreadsERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPm;
- _ZN7android8RpcState13getRootObjectERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState13sendDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressE;
- _ZN7android8RpcState15onBinderLeavingERKNS_2spINS_10RpcSessionEEERKNS1_INS_7IBinderEEEPNS_10RpcAddressE;
- _ZN7android8RpcState15processTransactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState16onBinderEnteringERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8RpcState16processDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState20getAndExecuteCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState20processServerCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState23processTransactInternalERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEENS0_11CommandDataE;
- _ZN7android8RpcState4dumpEv;
- _ZN7android8RpcState6rpcRecERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPvm;
- _ZN7android8RpcState7rpcSendERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPKvm;
- _ZN7android8RpcState8transactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressEjRKNS_6ParcelERKNS_2spINS_10RpcSessionEEEPSA_j;
- _ZN7android8RpcState9terminateEv;
- _ZN7android8RpcStateC1Ev;
- _ZN7android8RpcStateC2Ev;
- _ZN7android8RpcStateD1Ev;
- _ZN7android8RpcStateD2Ev;
- _ZN7android9BpRefBase10onFirstRefEv;
- _ZN7android9BpRefBase15onLastStrongRefEPKv;
- _ZN7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZN7android9BpRefBaseC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseD0Ev;
- _ZN7android9BpRefBaseD1Ev;
- _ZN7android9BpRefBaseD2Ev;
- _ZN7android9HeapCache10binderDiedERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCache10dump_heapsEv;
- _ZN7android9HeapCache8get_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9find_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCacheC1Ev;
- _ZN7android9HeapCacheC2Ev;
- _ZN7android9HeapCacheD0Ev;
- _ZN7android9HeapCacheD1Ev;
- _ZN7android9HeapCacheD2Ev;
- _ZN7android9hexStringEPKvm;
- _ZN7android9RpcServer12listSessionsEv;
- _ZN7android9RpcServer13getMaxThreadsEv;
- _ZN7android9RpcServer13getRootObjectEv;
- _ZN7android9RpcServer13releaseServerEv;
- _ZN7android9RpcServer13setMaxThreadsEm;
- _ZN7android9RpcServer13setRootObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android9RpcServer15setupInetServerEjPj;
- _ZN7android9RpcServer16setupVsockServerEj;
- _ZN7android9RpcServer17setRootObjectWeakERKNS_2wpINS_7IBinderEEE;
- _ZN7android9RpcServer17setupSocketServerERKNS_16RpcSocketAddressE;
- _ZN7android9RpcServer19establishConnectionEONS_2spIS0_EENS_4base14unique_fd_implINS4_13DefaultCloserEEE;
- _ZN7android9RpcServer19setupExternalServerENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android9RpcServer20onSessionTerminatingERKNS_2spINS_10RpcSessionEEE;
- _ZN7android9RpcServer21setupUnixDomainServerEPKc;
- _ZN7android9RpcServer24numUninitializedSessionsEv;
- _ZN7android9RpcServer4joinEv;
- _ZN7android9RpcServer4makeEv;
- _ZN7android9RpcServer61iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProductionEv;
- _ZN7android9RpcServer9acceptOneEv;
- _ZN7android9RpcServer9hasServerEv;
- _ZN7android9RpcServerC1Ev;
- _ZN7android9RpcServerC2Ev;
- _ZN7android9RpcServerD0Ev;
- _ZN7android9RpcServerD1Ev;
- _ZN7android9RpcServerD2Ev;
- _ZN7android9SingletonINS_15PermissionCacheEE11getInstanceEv;
- _ZN7android9SingletonINS_15PermissionCacheEE11hasInstanceEv;
- _ZN7android9SingletonINS_15PermissionCacheEE5sLockE;
- _ZN7android9SingletonINS_15PermissionCacheEE9sInstanceE;
- _ZN7android9SingletonINS_15PermissionCacheEEC1Ev;
- _ZN7android9SingletonINS_15PermissionCacheEEC2Ev;
- _ZN7android9SingletonINS_15PermissionCacheEED1Ev;
- _ZN7android9SingletonINS_15PermissionCacheEED2Ev;
- _ZN7androidlsERNS_10TextOutputERKNS_7HexDumpE;
- _ZN7androidlsERNS_10TextOutputERKNS_8TypeCodeE;
- _ZN7androidlsIA15_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA24_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA2_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA34_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA3_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA43_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA4_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA5_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA8_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA9_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIjEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsImEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEERNS_10TextOutputES9_RKT_;
- _ZN7androidlsIPcEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIPvEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIyEERNS_10TextOutputES2_RKT_;
- _ZNK7android10MemoryBase9getMemoryEPlPm;
- _ZNK7android10RpcAddress13writeToParcelEPNS_6ParcelE;
- _ZNK7android10RpcAddress15viewRawEmbeddedEv;
- _ZNK7android10RpcAddress6isZeroEv;
- _ZNK7android10RpcAddress8toStringEv;
- _ZNK7android10RpcAddressltERKS0_;
- _ZNK7android11IMemoryHeap22getInterfaceDescriptorEv;
- _ZNK7android12BpMemoryHeap12assertMappedEv;
- _ZNK7android12BpMemoryHeap18assertReallyMappedEv;
- _ZNK7android12BpMemoryHeap7getBaseEv;
- _ZNK7android12BpMemoryHeap7getSizeEv;
- _ZNK7android12BpMemoryHeap8getFlagsEv;
- _ZNK7android12BpMemoryHeap9getHeapIDEv;
- _ZNK7android12BpMemoryHeap9getOffsetEv;
- _ZNK7android12MemoryDealer4dumpEPKc;
- _ZNK7android12MemoryDealer4heapEv;
- _ZNK7android12MemoryDealer9allocatorEv;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE10do_compareEPKvS5_;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE15do_move_forwardEPvPKvm;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE16do_move_backwardEPvPKvm;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE7do_copyEPvPKvm;
- _ZNK7android12SortedVectorINS_15PermissionCache5EntryEE8do_splatEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_compareEPKvSA_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE15do_move_forwardEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE16do_move_backwardEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE7do_copyEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE8do_splatEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_compareES3_S3_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE15do_move_forwardEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE16do_move_backwardEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE7do_copyEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE8do_splatEPvS3_m;
- _ZNK7android12SortedVectorINS_8String16EE10do_compareEPKvS4_;
- _ZNK7android12SortedVectorINS_8String16EE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_8String16EE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_8String16EE15do_move_forwardEPvPKvm;
- _ZNK7android12SortedVectorINS_8String16EE16do_move_backwardEPvPKvm;
- _ZNK7android12SortedVectorINS_8String16EE7do_copyEPvPKvm;
- _ZNK7android12SortedVectorINS_8String16EE8do_splatEPvPKvm;
- _ZNK7android14IPCThreadState13getCallingPidEv;
- _ZNK7android14IPCThreadState13getCallingSidEv;
- _ZNK7android14IPCThreadState13getCallingUidEv;
- _ZNK7android14IPCThreadState18getCallRestrictionEv;
- _ZNK7android14IPCThreadState19getStrictModePolicyEv;
- _ZNK7android14IPCThreadState22getServingStackPointerEv;
- _ZNK7android14IPCThreadState23getCallingWorkSourceUidEv;
- _ZNK7android14IPCThreadState25shouldPropagateWorkSourceEv;
- _ZNK7android14IPCThreadState29getLastTransactionBinderFlagsEv;
- _ZNK7android14IShellCallback22getInterfaceDescriptorEv;
- _ZNK7android14MemoryHeapBase7getBaseEv;
- _ZNK7android14MemoryHeapBase7getSizeEv;
- _ZNK7android14MemoryHeapBase8getFlagsEv;
- _ZNK7android14MemoryHeapBase9getDeviceEv;
- _ZNK7android14MemoryHeapBase9getHeapIDEv;
- _ZNK7android14MemoryHeapBase9getOffsetEv;
- _ZNK7android15IResultReceiver22getInterfaceDescriptorEv;
- _ZNK7android15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android15PermissionCache5checkEPbRKNS_8String16Ej;
- _ZNK7android18BufferedTextOutput9getBufferEv;
- _ZNK7android18ServiceManagerShim10getServiceERKNS_8String16E;
- _ZNK7android18ServiceManagerShim12checkServiceERKNS_8String16E;
- _ZNK7android21IPermissionController22getInterfaceDescriptorEv;
- _ZNK7android22SimpleBestFitAllocator4dumpEPKc;
- _ZNK7android22SimpleBestFitAllocator4dumpERNS_7String8EPKc;
- _ZNK7android22SimpleBestFitAllocator4sizeEv;
- _ZNK7android22SimpleBestFitAllocator6dump_lEPKc;
- _ZNK7android22SimpleBestFitAllocator6dump_lERNS_7String8EPKc;
- _ZNK7android2os15IClientCallback22getInterfaceDescriptorEv;
- _ZNK7android2os15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android2os16IServiceCallback22getInterfaceDescriptorEv;
- _ZNK7android2os16ParcelableHolder13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os16ServiceDebugInfo13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle10getBooleanERKNS_8String16EPb;
- _ZNK7android2os17PersistableBundle10getIntKeysEv;
- _ZNK7android2os17PersistableBundle11getLongKeysEv;
- _ZNK7android2os17PersistableBundle12getIntVectorERKNS_8String16EPNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZNK7android2os17PersistableBundle13getDoubleKeysEv;
- _ZNK7android2os17PersistableBundle13getLongVectorERKNS_8String16EPNSt3__16vectorIlNS5_9allocatorIlEEEE;
- _ZNK7android2os17PersistableBundle13getStringKeysEv;
- _ZNK7android2os17PersistableBundle13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle14getBooleanKeysEv;
- _ZNK7android2os17PersistableBundle15getDoubleVectorERKNS_8String16EPNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZNK7android2os17PersistableBundle15getStringVectorERKNS_8String16EPNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZNK7android2os17PersistableBundle16getBooleanVectorERKNS_8String16EPNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZNK7android2os17PersistableBundle16getIntVectorKeysEv;
- _ZNK7android2os17PersistableBundle17getLongVectorKeysEv;
- _ZNK7android2os17PersistableBundle18writeToParcelInnerEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle19getDoubleVectorKeysEv;
- _ZNK7android2os17PersistableBundle19getStringVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getBooleanVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getPersistableBundleERKNS_8String16EPS1_;
- _ZNK7android2os17PersistableBundle24getPersistableBundleKeysEv;
- _ZNK7android2os17PersistableBundle4sizeEv;
- _ZNK7android2os17PersistableBundle5emptyEv;
- _ZNK7android2os17PersistableBundle6getIntERKNS_8String16EPi;
- _ZNK7android2os17PersistableBundle7getLongERKNS_8String16EPl;
- _ZNK7android2os17PersistableBundle9getDoubleERKNS_8String16EPd;
- _ZNK7android2os17PersistableBundle9getStringERKNS_8String16EPS2_;
- _ZNK7android2os20ParcelFileDescriptor13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status9toString8Ev;
- _ZNK7android6Parcel10errorCheckEv;
- _ZNK7android6Parcel10ipcObjectsEv;
- _ZNK7android6Parcel10readDoubleEPd;
- _ZNK7android6Parcel10readDoubleEv;
- _ZNK7android6Parcel10readObjectEb;
- _ZNK7android6Parcel10readUint32EPj;
- _ZNK7android6Parcel10readUint32Ev;
- _ZNK7android6Parcel10readUint64EPm;
- _ZNK7android6Parcel10readUint64Ev;
- _ZNK7android6Parcel10scanForFdsEv;
- _ZNK7android6Parcel11ipcDataSizeEv;
- _ZNK7android6Parcel11readCStringEv;
- _ZNK7android6Parcel11readInplaceEm;
- _ZNK7android6Parcel11readPointerEPm;
- _ZNK7android6Parcel11readPointerEv;
- _ZNK7android6Parcel11readString8EPNS_7String8E;
- _ZNK7android6Parcel11readString8Ev;
- _ZNK7android6Parcel12dataCapacityEv;
- _ZNK7android6Parcel12dataPositionEv;
- _ZNK7android6Parcel12objectsCountEv;
- _ZNK7android6Parcel12readString16EPNS_8String16E;
- _ZNK7android6Parcel12readString16EPNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZNK7android6Parcel12readString16EPNSt3__18optionalINS_8String16EEE;
- _ZNK7android6Parcel12readString16Ev;
- _ZNK7android6Parcel13markSensitiveEv;
- _ZNK7android6Parcel14checkInterfaceEPNS_7IBinderE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZNK7android6Parcel14readParcelableEPNS_10ParcelableE;
- _ZNK7android6Parcel15ipcObjectsCountEv;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__110unique_ptrINS1_6vectorIlNS1_9allocatorIlEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__16vectorIlNS1_9allocatorIlEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__18optionalINS1_6vectorIlNS1_9allocatorIlEEEEEE;
- _ZNK7android6Parcel15setDataPositionEm;
- _ZNK7android6Parcel15unflattenBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16enforceInterfaceEPKDsmPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16enforceInterfaceERKNS_8String16EPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZNK7android6Parcel16readNativeHandleEv;
- _ZNK7android6Parcel16readStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16readStrongBinderEv;
- _ZNK7android6Parcel16readStrongBinderINS_2os15IClientCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_2os16IServiceCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_7content2pm22IPackageChangeObserverEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__110unique_ptrINS1_6vectorImNS1_9allocatorImEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__16vectorImNS1_9allocatorImEEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__18optionalINS1_6vectorImNS1_9allocatorImEEEEEE;
- _ZNK7android6Parcel16validateReadDataEm;
- _ZNK7android6Parcel17getBlobAshmemSizeEv;
- _ZNK7android6Parcel17getOpenAshmemSizeEv;
- _ZNK7android6Parcel17readExceptionCodeEv;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZNK7android6Parcel18hasFileDescriptorsEv;
- _ZNK7android6Parcel18readFileDescriptorEv;
- _ZNK7android6Parcel18readString16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZNK7android6Parcel18readString8InplaceEPm;
- _ZNK7android6Parcel19readString16InplaceEPm;
- _ZNK7android6Parcel21finishUnflattenBinderERKNS_2spINS_7IBinderEEEPS3_;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZNK7android6Parcel24readCallingWorkSourceUidEv;
- _ZNK7android6Parcel24readNullableStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel24readParcelFileDescriptorEv;
- _ZNK7android6Parcel24readUniqueFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZNK7android6Parcel30readUniqueParcelFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel37updateWorkSourceRequestHeaderPositionEv;
- _ZNK7android6Parcel4dataEv;
- _ZNK7android6Parcel4readEPvm;
- _ZNK7android6Parcel4readERNS0_26FlattenableHelperInterfaceE;
- _ZNK7android6Parcel5printERNS_10TextOutputEj;
- _ZNK7android6Parcel7ipcDataEv;
- _ZNK7android6Parcel8allowFdsEv;
- _ZNK7android6Parcel8dataSizeEv;
- _ZNK7android6Parcel8isForRpcEv;
- _ZNK7android6Parcel8readBlobEmPNS0_12ReadableBlobE;
- _ZNK7android6Parcel8readBoolEPb;
- _ZNK7android6Parcel8readBoolEv;
- _ZNK7android6Parcel8readByteEPa;
- _ZNK7android6Parcel8readByteEv;
- _ZNK7android6Parcel8readCharEPDs;
- _ZNK7android6Parcel8readCharEv;
- _ZNK7android6Parcel9dataAvailEv;
- _ZNK7android6Parcel9readFloatEPf;
- _ZNK7android6Parcel9readFloatEv;
- _ZNK7android6Parcel9readInt32EPi;
- _ZNK7android6Parcel9readInt32Ev;
- _ZNK7android6Parcel9readInt64EPl;
- _ZNK7android6Parcel9readInt64Ev;
- _ZNK7android6VectorIiE10do_destroyEPvm;
- _ZNK7android6VectorIiE12do_constructEPvm;
- _ZNK7android6VectorIiE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIiE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIiE7do_copyEPvPKvm;
- _ZNK7android6VectorIiE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE10do_destroyEPvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE12do_constructEPvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE10do_destroyEPvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE12do_constructEPvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE10do_destroyEPvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE12do_constructEPvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_8String16EE10do_destroyEPvm;
- _ZNK7android6VectorINS_8String16EE12do_constructEPvm;
- _ZNK7android6VectorINS_8String16EE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_8String16EE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_8String16EE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_8String16EE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7BBinderEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7BBinderEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7RefBaseEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7RefBaseEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE8do_splatEPvPKvm;
- _ZNK7android7BBinder10findObjectEPKv;
- _ZNK7android7BBinder13isBinderAliveEv;
- _ZNK7android7BBinder22getInterfaceDescriptorEv;
- _ZNK7android7content2pm18PackageChangeEvent13writeToParcelEPNS_6ParcelE;
- _ZNK7android7content2pm21IPackageManagerNative22getInterfaceDescriptorEv;
- _ZNK7android7content2pm22IPackageChangeObserver22getInterfaceDescriptorEv;
- _ZNK7android7IBinder13checkSubclassEPKv;
- _ZNK7android7IMemory11fastPointerERKNS_2spINS_7IBinderEEEl;
- _ZNK7android7IMemory15unsecurePointerEv;
- _ZNK7android7IMemory22getInterfaceDescriptorEv;
- _ZNK7android7IMemory4sizeEv;
- _ZNK7android7IMemory6offsetEv;
- _ZNK7android7IMemory7pointerEv;
- _ZNK7android8BpBinder10findObjectEPKv;
- _ZNK7android8BpBinder10rpcAddressEv;
- _ZNK7android8BpBinder10rpcSessionEv;
- _ZNK7android8BpBinder11isRpcBinderEv;
- _ZNK7android8BpBinder12binderHandleEv;
- _ZNK7android8BpBinder13isBinderAliveEv;
- _ZNK7android8BpBinder13ObjectManager4findEPKv;
- _ZNK7android8BpBinder18isDescriptorCachedEv;
- _ZNK7android8BpBinder22getInterfaceDescriptorEv;
- _ZNK7android8BpMemory9getMemoryEPlPm;
- _ZTCN7android10AllocationE0_NS_10IInterfaceE;
- _ZTCN7android10AllocationE0_NS_10MemoryBaseE;
- _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10AllocationE0_NS_7IMemoryE;
- _ZTCN7android10AllocationE0_NS_8BnMemoryE;
- _ZTCN7android10AllocationE8_NS_7BBinderE;
- _ZTCN7android10AllocationE8_NS_7IBinderE;
- _ZTCN7android10MemoryBaseE0_NS_10IInterfaceE;
- _ZTCN7android10MemoryBaseE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10MemoryBaseE0_NS_7IMemoryE;
- _ZTCN7android10MemoryBaseE0_NS_8BnMemoryE;
- _ZTCN7android10MemoryBaseE8_NS_7BBinderE;
- _ZTCN7android10MemoryBaseE8_NS_7IBinderE;
- _ZTCN7android10PoolThreadE0_NS_6ThreadE;
- _ZTCN7android11IMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BnMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BnMemoryHeapE8_NS_7BBinderE;
- _ZTCN7android12BnMemoryHeapE8_NS_7IBinderE;
- _ZTCN7android12BpMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BpMemoryHeapE0_NS_11BpInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BpMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BpMemoryHeapE8_NS_9BpRefBaseE;
- _ZTCN7android14IShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE64_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE64_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android14MemoryHeapBaseE64_NS_11IMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE64_NS_12BnMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE72_NS_7BBinderE;
- _ZTCN7android14MemoryHeapBaseE72_NS_7IBinderE;
- _ZTCN7android15BnShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BnShellCallbackE0_NS_11BnInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BnShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BnShellCallbackE8_NS_7BBinderE;
- _ZTCN7android15BnShellCallbackE8_NS_7IBinderE;
- _ZTCN7android15BpShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BpShellCallbackE0_NS_11BpInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BpShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BpShellCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android15IResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_11BnInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BnResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BnResultReceiverE8_NS_7BBinderE;
- _ZTCN7android16BnResultReceiverE8_NS_7IBinderE;
- _ZTCN7android16BpResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BpResultReceiverE0_NS_11BpInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BpResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BpResultReceiverE8_NS_9BpRefBaseE;
- _ZTCN7android18ServiceManagerShimE0_NS_10IInterfaceE;
- _ZTCN7android18ServiceManagerShimE0_NS_15IServiceManagerE;
- _ZTCN7android21IPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BnPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BnPermissionControllerE0_NS_11BnInterfaceINS_21IPermissionControllerEEE;
- _ZTCN7android22BnPermissionControllerE0_NS_21IPermissionControllerE;
- _ZTCN7android22BnPermissionControllerE8_NS_7BBinderE;
- _ZTCN7android22BnPermissionControllerE8_NS_7IBinderE;
- _ZTCN7android22BpPermissionControllerE0_NS_10IInterfaceE;
- _ZTCN7android22BpPermissionControllerE0_NS_11BpInterfaceINS_21IPermissionControllerEEE;
- _ZTCN7android22BpPermissionControllerE0_NS_21IPermissionControllerE;
- _ZTCN7android22BpPermissionControllerE8_NS_9BpRefBaseE;
- _ZTCN7android2os15IClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BnClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS_11BnInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BnClientCallbackE8_NS_7BBinderE;
- _ZTCN7android2os16BnClientCallbackE8_NS_7IBinderE;
- _ZTCN7android2os16BnServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BnServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnServiceManagerE0_NS_11BnInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BnServiceManagerE8_NS_7BBinderE;
- _ZTCN7android2os16BnServiceManagerE8_NS_7IBinderE;
- _ZTCN7android2os16BpClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BpClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpClientCallbackE0_NS_11BpInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BpClientCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android2os16BpServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BpServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpServiceManagerE0_NS_11BpInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BpServiceManagerE8_NS_9BpRefBaseE;
- _ZTCN7android2os16IServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_11BnInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BnServiceCallbackE8_NS_7BBinderE;
- _ZTCN7android2os17BnServiceCallbackE8_NS_7IBinderE;
- _ZTCN7android2os17BpServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BpServiceCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android7BBinderE0_NS_7IBinderE;
- _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_11BnInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE8_NS_7BBinderE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE8_NS_7IBinderE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_11BpInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE8_NS_9BpRefBaseE;
- _ZTCN7android7content2pm22IPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_11BnInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE8_NS_7BBinderE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE8_NS_7IBinderE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_11BpInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE8_NS_9BpRefBaseE;
- _ZTCN7android7IMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BnMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BnMemoryE8_NS_7BBinderE;
- _ZTCN7android8BnMemoryE8_NS_7IBinderE;
- _ZTCN7android8BpBinderE0_NS_7IBinderE;
- _ZTCN7android8BpMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BpMemoryE0_NS_11BpInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BpMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BpMemoryE8_NS_9BpRefBaseE;
- _ZTCN7android9HeapCacheE0_NS_7IBinder14DeathRecipientE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE;
- _ZThn8_N7android10AllocationD0Ev;
- _ZThn8_N7android10AllocationD1Ev;
- _ZThn8_N7android10MemoryBaseD0Ev;
- _ZThn8_N7android10MemoryBaseD1Ev;
- _ZThn8_N7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android12BnMemoryHeapD0Ev;
- _ZThn8_N7android12BnMemoryHeapD1Ev;
- _ZThn8_N7android12BpMemoryHeapD0Ev;
- _ZThn8_N7android12BpMemoryHeapD1Ev;
- _ZThn8_N7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android22BnPermissionController10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn8_N7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn8_N7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android8BnMemoryD0Ev;
- _ZThn8_N7android8BnMemoryD1Ev;
- _ZThn8_N7android8BpMemoryD0Ev;
- _ZThn8_N7android8BpMemoryD1Ev;
- _ZTTN7android10AllocationE;
- _ZTTN7android10IInterfaceE;
- _ZTTN7android10MemoryBaseE;
- _ZTTN7android10PoolThreadE;
- _ZTTN7android10RpcSessionE;
- _ZTTN7android11IMemoryHeapE;
- _ZTTN7android12BnMemoryHeapE;
- _ZTTN7android12BpMemoryHeapE;
- _ZTTN7android12ProcessStateE;
- _ZTTN7android14IShellCallbackE;
- _ZTTN7android14MemoryHeapBaseE;
- _ZTTN7android15BnShellCallbackE;
- _ZTTN7android15BpShellCallbackE;
- _ZTTN7android15IResultReceiverE;
- _ZTTN7android15IServiceManagerE;
- _ZTTN7android16BnResultReceiverE;
- _ZTTN7android16BpResultReceiverE;
- _ZTTN7android18ServiceManagerShimE;
- _ZTTN7android21IPermissionControllerE;
- _ZTTN7android22BnPermissionControllerE;
- _ZTTN7android22BpPermissionControllerE;
- _ZTTN7android2os15IClientCallbackE;
- _ZTTN7android2os15IServiceManagerE;
- _ZTTN7android2os16BnClientCallbackE;
- _ZTTN7android2os16BnServiceManagerE;
- _ZTTN7android2os16BpClientCallbackE;
- _ZTTN7android2os16BpServiceManagerE;
- _ZTTN7android2os16IServiceCallbackE;
- _ZTTN7android2os17BnServiceCallbackE;
- _ZTTN7android2os17BpServiceCallbackE;
- _ZTTN7android7BBinderE;
- _ZTTN7android7content2pm21IPackageManagerNativeE;
- _ZTTN7android7content2pm22BnPackageManagerNativeE;
- _ZTTN7android7content2pm22BpPackageManagerNativeE;
- _ZTTN7android7content2pm22IPackageChangeObserverE;
- _ZTTN7android7content2pm23BnPackageChangeObserverE;
- _ZTTN7android7content2pm23BpPackageChangeObserverE;
- _ZTTN7android7IBinderE;
- _ZTTN7android7IMemoryE;
- _ZTTN7android8BnMemoryE;
- _ZTTN7android8BpBinderE;
- _ZTTN7android8BpMemoryE;
- _ZTTN7android9BpRefBaseE;
- _ZTTN7android9HeapCacheE;
- _ZTTN7android9RpcServerE;
- _ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
- _ZTv0_n24_N7android10AllocationD0Ev;
- _ZTv0_n24_N7android10AllocationD1Ev;
- _ZTv0_n24_N7android10IInterfaceD0Ev;
- _ZTv0_n24_N7android10IInterfaceD1Ev;
- _ZTv0_n24_N7android10MemoryBaseD0Ev;
- _ZTv0_n24_N7android10MemoryBaseD1Ev;
- _ZTv0_n24_N7android10RpcSessionD0Ev;
- _ZTv0_n24_N7android10RpcSessionD1Ev;
- _ZTv0_n24_N7android11IMemoryHeapD0Ev;
- _ZTv0_n24_N7android11IMemoryHeapD1Ev;
- _ZTv0_n24_N7android12BnMemoryHeapD0Ev;
- _ZTv0_n24_N7android12BnMemoryHeapD1Ev;
- _ZTv0_n24_N7android12BpMemoryHeapD0Ev;
- _ZTv0_n24_N7android12BpMemoryHeapD1Ev;
- _ZTv0_n24_N7android12ProcessStateD0Ev;
- _ZTv0_n24_N7android12ProcessStateD1Ev;
- _ZTv0_n24_N7android14IShellCallbackD0Ev;
- _ZTv0_n24_N7android14IShellCallbackD1Ev;
- _ZTv0_n24_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n24_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n24_N7android15IResultReceiverD0Ev;
- _ZTv0_n24_N7android15IResultReceiverD1Ev;
- _ZTv0_n24_N7android15IServiceManagerD0Ev;
- _ZTv0_n24_N7android15IServiceManagerD1Ev;
- _ZTv0_n24_N7android21IPermissionControllerD0Ev;
- _ZTv0_n24_N7android21IPermissionControllerD1Ev;
- _ZTv0_n24_N7android2os15IClientCallbackD0Ev;
- _ZTv0_n24_N7android2os15IClientCallbackD1Ev;
- _ZTv0_n24_N7android2os15IServiceManagerD0Ev;
- _ZTv0_n24_N7android2os15IServiceManagerD1Ev;
- _ZTv0_n24_N7android2os16IServiceCallbackD0Ev;
- _ZTv0_n24_N7android2os16IServiceCallbackD1Ev;
- _ZTv0_n24_N7android7BBinderD0Ev;
- _ZTv0_n24_N7android7BBinderD1Ev;
- _ZTv0_n24_N7android7content2pm21IPackageManagerNativeD0Ev;
- _ZTv0_n24_N7android7content2pm21IPackageManagerNativeD1Ev;
- _ZTv0_n24_N7android7content2pm22IPackageChangeObserverD0Ev;
- _ZTv0_n24_N7android7content2pm22IPackageChangeObserverD1Ev;
- _ZTv0_n24_N7android7IBinderD0Ev;
- _ZTv0_n24_N7android7IBinderD1Ev;
- _ZTv0_n24_N7android7IMemoryD0Ev;
- _ZTv0_n24_N7android7IMemoryD1Ev;
- _ZTv0_n24_N7android8BnMemoryD0Ev;
- _ZTv0_n24_N7android8BnMemoryD1Ev;
- _ZTv0_n24_N7android8BpBinderD0Ev;
- _ZTv0_n24_N7android8BpBinderD1Ev;
- _ZTv0_n24_N7android8BpMemoryD0Ev;
- _ZTv0_n24_N7android8BpMemoryD1Ev;
- _ZTv0_n24_N7android9BpRefBaseD0Ev;
- _ZTv0_n24_N7android9BpRefBaseD1Ev;
- _ZTv0_n24_N7android9HeapCacheD0Ev;
- _ZTv0_n24_N7android9HeapCacheD1Ev;
- _ZTv0_n24_N7android9RpcServerD0Ev;
- _ZTv0_n24_N7android9RpcServerD1Ev;
- _ZTv0_n32_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n32_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n32_N7android8BpBinder10onFirstRefEv;
- _ZTv0_n32_N7android9BpRefBase10onFirstRefEv;
- _ZTv0_n40_N7android8BpBinder15onLastStrongRefEPKv;
- _ZTv0_n40_N7android9BpRefBase15onLastStrongRefEPKv;
- _ZTv0_n48_N7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZTv0_n48_N7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZTv0_n56_NK7android14MemoryHeapBase9getHeapIDEv;
- _ZTv0_n64_NK7android14MemoryHeapBase7getBaseEv;
- _ZTv0_n72_NK7android14MemoryHeapBase7getSizeEv;
- _ZTv0_n80_NK7android14MemoryHeapBase8getFlagsEv;
- _ZTv0_n88_NK7android14MemoryHeapBase9getOffsetEv;
- _ZTVN7android10AllocationE;
- _ZTVN7android10IInterfaceE;
- _ZTVN7android10MemoryBaseE;
- _ZTVN7android10PoolThreadE;
- _ZTVN7android10RpcSession13RpcConnectionE;
- _ZTVN7android10RpcSessionE;
- _ZTVN7android10TextOutputE;
- _ZTVN7android11IMemoryHeapE;
- _ZTVN7android12BnMemoryHeapE;
- _ZTVN7android12BpMemoryHeapE;
- _ZTVN7android12FdTextOutputE;
- _ZTVN7android12MemoryDealerE;
- _ZTVN7android12ProcessStateE;
- _ZTVN7android12SortedVectorINS_15PermissionCache5EntryEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEEE;
- _ZTVN7android12SortedVectorINS_8String16EEE;
- _ZTVN7android13LogTextOutputE;
- _ZTVN7android14IShellCallbackE;
- _ZTVN7android14MemoryHeapBaseE;
- _ZTVN7android15BnShellCallbackE;
- _ZTVN7android15BpShellCallbackE;
- _ZTVN7android15IResultReceiverE;
- _ZTVN7android15IServiceManagerE;
- _ZTVN7android16BnResultReceiverE;
- _ZTVN7android16BpResultReceiverE;
- _ZTVN7android17InetSocketAddressE;
- _ZTVN7android17UnixSocketAddressE;
- _ZTVN7android18BufferedTextOutput11BufferStateE;
- _ZTVN7android18BufferedTextOutputE;
- _ZTVN7android18ServiceManagerShimE;
- _ZTVN7android18VsockSocketAddressE;
- _ZTVN7android21IPermissionControllerE;
- _ZTVN7android22BnPermissionControllerE;
- _ZTVN7android22BpPermissionControllerE;
- _ZTVN7android2os15IClientCallbackE;
- _ZTVN7android2os15IServiceManagerE;
- _ZTVN7android2os16BnClientCallbackE;
- _ZTVN7android2os16BnServiceManagerE;
- _ZTVN7android2os16BpClientCallbackE;
- _ZTVN7android2os16BpServiceManagerE;
- _ZTVN7android2os16IServiceCallbackE;
- _ZTVN7android2os16ParcelableHolderE;
- _ZTVN7android2os16ServiceDebugInfoE;
- _ZTVN7android2os17BnServiceCallbackE;
- _ZTVN7android2os17BpServiceCallbackE;
- _ZTVN7android2os17PersistableBundleE;
- _ZTVN7android2os20ParcelFileDescriptorE;
- _ZTVN7android6VectorIiEE;
- _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;
- _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE;
- _ZTVN7android6VectorINS_8BpBinder8ObituaryEEE;
- _ZTVN7android6VectorINS_8String16EEE;
- _ZTVN7android6VectorIPNS_7BBinderEEE;
- _ZTVN7android6VectorIPNS_7RefBase12weakref_typeEEE;
- _ZTVN7android6VectorIPNS_7RefBaseEEE;
- _ZTVN7android7BBinderE;
- _ZTVN7android7content2pm18PackageChangeEventE;
- _ZTVN7android7content2pm21IPackageManagerNativeE;
- _ZTVN7android7content2pm22BnPackageManagerNativeE;
- _ZTVN7android7content2pm22BpPackageManagerNativeE;
- _ZTVN7android7content2pm22IPackageChangeObserverE;
- _ZTVN7android7content2pm23BnPackageChangeObserverE;
- _ZTVN7android7content2pm23BpPackageChangeObserverE;
- _ZTVN7android7IBinderE;
- _ZTVN7android7IMemoryE;
- _ZTVN7android8BnMemoryE;
- _ZTVN7android8BpBinderE;
- _ZTVN7android8BpMemoryE;
- _ZTVN7android9BpRefBaseE;
- _ZTVN7android9HeapCacheE;
- _ZTVN7android9RpcServerE;
- _ZTvn8_n32_N7android14MemoryHeapBaseD0Ev;
- _ZTvn8_n32_N7android14MemoryHeapBaseD1Ev;
- local:
- *;
-};
diff --git a/libs/binder/libbinder.arm64.vendor.map b/libs/binder/libbinder.arm64.vendor.map
deleted file mode 100644
index df6aa66..0000000
--- a/libs/binder/libbinder.arm64.vendor.map
+++ /dev/null
@@ -1,1320 +0,0 @@
-# b/190148312: Populate with correct list of ABI symbols
-LIBBINDER {
- global:
- getBinderKernelReferences;
- kDefaultDriver;
- _ZN7android10AllocationC1ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEElm;
- _ZN7android10AllocationC2ERKNS_2spINS_12MemoryDealerEEERKNS1_INS_11IMemoryHeapEEElm;
- _ZN7android10AllocationD0Ev;
- _ZN7android10AllocationD1Ev;
- _ZN7android10AllocationD2Ev;
- _ZN7android10IInterface8asBinderEPKS0_;
- _ZN7android10IInterface8asBinderERKNS_2spIS0_EE;
- _ZN7android10IInterfaceC2Ev;
- _ZN7android10IInterfaceD0Ev;
- _ZN7android10IInterfaceD1Ev;
- _ZN7android10IInterfaceD2Ev;
- _ZN7android10MemoryBaseC1ERKNS_2spINS_11IMemoryHeapEEElm;
- _ZN7android10MemoryBaseC2ERKNS_2spINS_11IMemoryHeapEEElm;
- _ZN7android10MemoryBaseD0Ev;
- _ZN7android10MemoryBaseD1Ev;
- _ZN7android10MemoryBaseD2Ev;
- _ZN7android10RpcAddress14readFromParcelERKNS_6ParcelE;
- _ZN7android10RpcAddress15fromRawEmbeddedEPKNS_14RpcWireAddressE;
- _ZN7android10RpcAddress4zeroEv;
- _ZN7android10RpcAddress6uniqueEv;
- _ZN7android10RpcAddressC1Ev;
- _ZN7android10RpcAddressC2Ev;
- _ZN7android10RpcAddressD1Ev;
- _ZN7android10RpcAddressD2Ev;
- _ZN7android10RpcSession12setForServerERKNS_2wpINS_9RpcServerEEEi;
- _ZN7android10RpcSession13getRootObjectEv;
- _ZN7android10RpcSession13sendDecStrongERKNS_10RpcAddressE;
- _ZN7android10RpcSession15setupInetClientEPKcj;
- _ZN7android10RpcSession15terminateLockedEv;
- _ZN7android10RpcSession16setupVsockClientEjj;
- _ZN7android10RpcSession17setupSocketClientERKNS_16RpcSocketAddressE;
- _ZN7android10RpcSession19addClientConnectionENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession19ExclusiveConnection14findConnectionEiPNS_2spINS0_13RpcConnectionEEES5_RNSt3__16vectorIS4_NS6_9allocatorIS4_EEEEm;
- _ZN7android10RpcSession19ExclusiveConnectionC1ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionC2ERKNS_2spIS0_EENS0_13ConnectionUseE;
- _ZN7android10RpcSession19ExclusiveConnectionD1Ev;
- _ZN7android10RpcSession19ExclusiveConnectionD2Ev;
- _ZN7android10RpcSession19getRemoteMaxThreadsEPm;
- _ZN7android10RpcSession20setupOneSocketClientERKNS_16RpcSocketAddressEi;
- _ZN7android10RpcSession21setupUnixDomainClientEPKc;
- _ZN7android10RpcSession22addNullDebuggingClientEv;
- _ZN7android10RpcSession22removeServerConnectionERKNS_2spINS0_13RpcConnectionEEE;
- _ZN7android10RpcSession24assignServerToThisThreadENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4joinENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android10RpcSession4makeEv;
- _ZN7android10RpcSession6readIdEv;
- _ZN7android10RpcSession6serverEv;
- _ZN7android10RpcSession7preJoinENSt3__16threadE;
- _ZN7android10RpcSession8transactERKNS_10RpcAddressEjRKNS_6ParcelEPS4_j;
- _ZN7android10RpcSessionC1Ev;
- _ZN7android10RpcSessionC2Ev;
- _ZN7android10RpcSessionD0Ev;
- _ZN7android10RpcSessionD1Ev;
- _ZN7android10RpcSessionD2Ev;
- _ZN7android10TextOutputC2Ev;
- _ZN7android10TextOutputD0Ev;
- _ZN7android10TextOutputD1Ev;
- _ZN7android10TextOutputD2Ev;
- _ZN7android10zeroMemoryEPhm;
- _ZN7android11BnInterfaceINS_11IMemoryHeapEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_14IShellCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_15IResultReceiverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IClientCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os15IServiceManagerEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_2os16IServiceCallbackEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm21IPackageManagerNativeEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7content2pm22IPackageChangeObserverEE10onAsBinderEv;
- _ZN7android11BnInterfaceINS_7IMemoryEE10onAsBinderEv;
- _ZN7android11IMemoryHeap10descriptorE;
- _ZN7android11IMemoryHeap11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android11IMemoryHeap12default_implE;
- _ZN7android11IMemoryHeap14getDefaultImplEv;
- _ZN7android11IMemoryHeap14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android11IMemoryHeapC2Ev;
- _ZN7android11IMemoryHeapD0Ev;
- _ZN7android11IMemoryHeapD1Ev;
- _ZN7android11IMemoryHeapD2Ev;
- _ZN7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android12BnMemoryHeapC2Ev;
- _ZN7android12BnMemoryHeapD0Ev;
- _ZN7android12BnMemoryHeapD1Ev;
- _ZN7android12BnMemoryHeapD2Ev;
- _ZN7android12BpMemoryHeapC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android12BpMemoryHeapD0Ev;
- _ZN7android12BpMemoryHeapD1Ev;
- _ZN7android12BpMemoryHeapD2Ev;
- _ZN7android12gTextBuffersE;
- _ZN7android12MemoryDealer10deallocateEm;
- _ZN7android12MemoryDealer22getAllocationAlignmentEv;
- _ZN7android12MemoryDealer8allocateEm;
- _ZN7android12MemoryDealerC1EmPKcj;
- _ZN7android12MemoryDealerC2EmPKcj;
- _ZN7android12MemoryDealerD0Ev;
- _ZN7android12MemoryDealerD1Ev;
- _ZN7android12MemoryDealerD2Ev;
- _ZN7android12printHexDataEiPKvmmimbPFvPvPKcES2_;
- _ZN7android12ProcessState10selfOrNullEv;
- _ZN7android12ProcessState13expungeHandleEiPNS_7IBinderE;
- _ZN7android12ProcessState13getDriverNameEv;
- _ZN7android12ProcessState14initWithDriverEPKc;
- _ZN7android12ProcessState15startThreadPoolEv;
- _ZN7android12ProcessState16getContextObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android12ProcessState17spawnPooledThreadEb;
- _ZN7android12ProcessState18giveThreadPoolNameEv;
- _ZN7android12ProcessState18lookupHandleLockedEi;
- _ZN7android12ProcessState18setCallRestrictionENS0_15CallRestrictionE;
- _ZN7android12ProcessState19getKernelReferencesEmPm;
- _ZN7android12ProcessState20becomeContextManagerEv;
- _ZN7android12ProcessState20makeBinderThreadNameEv;
- _ZN7android12ProcessState23getStrongProxyForHandleEi;
- _ZN7android12ProcessState24getStrongRefCountForNodeERKNS_2spINS_8BpBinderEEE;
- _ZN7android12ProcessState25enableOnewaySpamDetectionEb;
- _ZN7android12ProcessState27setThreadPoolMaxThreadCountEm;
- _ZN7android12ProcessState4initEPKcb;
- _ZN7android12ProcessState4selfEv;
- _ZN7android12ProcessStateC1EPKc;
- _ZN7android12ProcessStateC2EPKc;
- _ZN7android12ProcessStateD0Ev;
- _ZN7android12ProcessStateD1Ev;
- _ZN7android12ProcessStateD2Ev;
- _ZN7android13printTypeCodeEjPFvPvPKcES0_;
- _ZN7android14IPCThreadState10freeBufferEPNS_6ParcelEPKhmPKym;
- _ZN7android14IPCThreadState10selfOrNullEv;
- _ZN7android14IPCThreadState11clearCallerEv;
- _ZN7android14IPCThreadState11stopProcessEb;
- _ZN7android14IPCThreadState12setupPollingEPi;
- _ZN7android14IPCThreadState13decWeakHandleEi;
- _ZN7android14IPCThreadState13expungeHandleEiPNS_7IBinderE;
- _ZN7android14IPCThreadState13flushCommandsEv;
- _ZN7android14IPCThreadState13flushIfNeededEv;
- _ZN7android14IPCThreadState13incWeakHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState14clearLastErrorEv;
- _ZN7android14IPCThreadState14executeCommandEi;
- _ZN7android14IPCThreadState14joinThreadPoolEb;
- _ZN7android14IPCThreadState14talkWithDriverEb;
- _ZN7android14IPCThreadState15decStrongHandleEi;
- _ZN7android14IPCThreadState15incStrongHandleEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi;
- _ZN7android14IPCThreadState16threadDestructorEPv;
- _ZN7android14IPCThreadState18setCallRestrictionENS_12ProcessState15CallRestrictionE;
- _ZN7android14IPCThreadState19setStrictModePolicyEi;
- _ZN7android14IPCThreadState19setTheContextObjectERKNS_2spINS_7BBinderEEE;
- _ZN7android14IPCThreadState20clearCallingIdentityEv;
- _ZN7android14IPCThreadState20getAndExecuteCommandEv;
- _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_;
- _ZN7android14IPCThreadState20handlePolledCommandsEv;
- _ZN7android14IPCThreadState20processPendingDerefsEv;
- _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi;
- _ZN7android14IPCThreadState22attemptIncStrongHandleEi;
- _ZN7android14IPCThreadState22clearCallingWorkSourceEv;
- _ZN7android14IPCThreadState22clearDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState22processPostWriteDerefsEv;
- _ZN7android14IPCThreadState22restoreCallingIdentityEl;
- _ZN7android14IPCThreadState23setCallingWorkSourceUidEj;
- _ZN7android14IPCThreadState24clearPropagateWorkSourceEv;
- _ZN7android14IPCThreadState24requestDeathNotificationEiPNS_8BpBinderE;
- _ZN7android14IPCThreadState24restoreCallingWorkSourceEl;
- _ZN7android14IPCThreadState25blockUntilThreadAvailableEv;
- _ZN7android14IPCThreadState27disableBackgroundSchedulingEb;
- _ZN7android14IPCThreadState28backgroundSchedulingDisabledEv;
- _ZN7android14IPCThreadState29setLastTransactionBinderFlagsEi;
- _ZN7android14IPCThreadState41setCallingWorkSourceUidWithoutPropagationEj;
- _ZN7android14IPCThreadState4selfEv;
- _ZN7android14IPCThreadState6freezeEibj;
- _ZN7android14IPCThreadState7processEv;
- _ZN7android14IPCThreadState8shutdownEv;
- _ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j;
- _ZN7android14IPCThreadState9sendReplyERKNS_6ParcelEj;
- _ZN7android14IPCThreadStateC1Ev;
- _ZN7android14IPCThreadStateC2Ev;
- _ZN7android14IPCThreadStateD1Ev;
- _ZN7android14IPCThreadStateD2Ev;
- _ZN7android14IShellCallback10descriptorE;
- _ZN7android14IShellCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android14IShellCallback12default_implE;
- _ZN7android14IShellCallback14getDefaultImplEv;
- _ZN7android14IShellCallback14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android14IShellCallbackC2Ev;
- _ZN7android14IShellCallbackD0Ev;
- _ZN7android14IShellCallbackD1Ev;
- _ZN7android14IShellCallbackD2Ev;
- _ZN7android14MemoryHeapBase4initEiPvmiPKc;
- _ZN7android14MemoryHeapBase5mapfdEibml;
- _ZN7android14MemoryHeapBase7disposeEv;
- _ZN7android14MemoryHeapBaseC1Eimjl;
- _ZN7android14MemoryHeapBaseC1EmjPKc;
- _ZN7android14MemoryHeapBaseC1EPKcmj;
- _ZN7android14MemoryHeapBaseC1Ev;
- _ZN7android14MemoryHeapBaseC2Eimjl;
- _ZN7android14MemoryHeapBaseC2EmjPKc;
- _ZN7android14MemoryHeapBaseC2EPKcmj;
- _ZN7android14MemoryHeapBaseC2Ev;
- _ZN7android14MemoryHeapBaseD0Ev;
- _ZN7android14MemoryHeapBaseD1Ev;
- _ZN7android14MemoryHeapBaseD2Ev;
- _ZN7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android15IResultReceiver10descriptorE;
- _ZN7android15IResultReceiver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android15IResultReceiver12default_implE;
- _ZN7android15IResultReceiver14getDefaultImplEv;
- _ZN7android15IResultReceiver14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android15IResultReceiverC2Ev;
- _ZN7android15IResultReceiverD0Ev;
- _ZN7android15IResultReceiverD1Ev;
- _ZN7android15IResultReceiverD2Ev;
- _ZN7android15IServiceManagerC2Ev;
- _ZN7android15IServiceManagerD0Ev;
- _ZN7android15IServiceManagerD1Ev;
- _ZN7android15IServiceManagerD2Ev;
- _ZN7android15stringForIndentEi;
- _ZN7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android18BufferedTextOutput10moveIndentEi;
- _ZN7android18BufferedTextOutput10pushBundleEv;
- _ZN7android18BufferedTextOutput5printEPKcm;
- _ZN7android18BufferedTextOutput9popBundleEv;
- _ZN7android18BufferedTextOutputC2Ej;
- _ZN7android18BufferedTextOutputD0Ev;
- _ZN7android18BufferedTextOutputD1Ev;
- _ZN7android18BufferedTextOutputD2Ev;
- _ZN7android18ServiceManagerShim10addServiceERKNS_8String16ERKNS_2spINS_7IBinderEEEbi;
- _ZN7android18ServiceManagerShim10isDeclaredERKNS_8String16E;
- _ZN7android18ServiceManagerShim12listServicesEi;
- _ZN7android18ServiceManagerShim14waitForServiceERKNS_8String16E;
- _ZN7android18ServiceManagerShim16updatableViaApexERKNS_8String16E;
- _ZN7android18ServiceManagerShim20getDeclaredInstancesERKNS_8String16E;
- _ZN7android18ServiceManagerShimC1ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18ServiceManagerShimC2ERKNS_2spINS_2os15IServiceManagerEEE;
- _ZN7android18the_context_objectE;
- _ZN7android21defaultServiceManagerEv;
- _ZN7android22SimpleBestFitAllocator10deallocateEm;
- _ZN7android22SimpleBestFitAllocator12kMemoryAlignE;
- _ZN7android22SimpleBestFitAllocator5allocEmj;
- _ZN7android22SimpleBestFitAllocator7deallocEm;
- _ZN7android22SimpleBestFitAllocator8allocateEmj;
- _ZN7android22SimpleBestFitAllocatorC1Em;
- _ZN7android22SimpleBestFitAllocatorC2Em;
- _ZN7android22SimpleBestFitAllocatorD1Ev;
- _ZN7android22SimpleBestFitAllocatorD2Ev;
- _ZN7android24setDefaultServiceManagerERKNS_2spINS_15IServiceManagerEEE;
- _ZN7android2os15IClientCallback10descriptorE;
- _ZN7android2os15IClientCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IClientCallback12default_implE;
- _ZN7android2os15IClientCallback14getDefaultImplEv;
- _ZN7android2os15IClientCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IClientCallbackC2Ev;
- _ZN7android2os15IClientCallbackD0Ev;
- _ZN7android2os15IClientCallbackD1Ev;
- _ZN7android2os15IClientCallbackD2Ev;
- _ZN7android2os15IServiceManager10descriptorE;
- _ZN7android2os15IServiceManager11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os15IServiceManager12default_implE;
- _ZN7android2os15IServiceManager14getDefaultImplEv;
- _ZN7android2os15IServiceManager14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os15IServiceManagerC2Ev;
- _ZN7android2os15IServiceManagerD0Ev;
- _ZN7android2os15IServiceManagerD1Ev;
- _ZN7android2os15IServiceManagerD2Ev;
- _ZN7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnClientCallbackC2Ev;
- _ZN7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os16BnServiceManagerC2Ev;
- _ZN7android2os16BpClientCallback9onClientsERKNS_2spINS_7IBinderEEEb;
- _ZN7android2os16BpClientCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpClientCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10addServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEEbi;
- _ZN7android2os16BpServiceManager10getServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager10isDeclaredERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPb;
- _ZN7android2os16BpServiceManager12checkServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager12listServicesEiPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEE;
- _ZN7android2os16BpServiceManager16updatableViaApexERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_8optionalIS8_EE;
- _ZN7android2os16BpServiceManager19getServiceDebugInfoEPNSt3__16vectorINS0_16ServiceDebugInfoENS2_9allocatorIS4_EEEE;
- _ZN7android2os16BpServiceManager20getDeclaredInstancesERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPNS2_6vectorIS8_NS6_IS8_EEEE;
- _ZN7android2os16BpServiceManager20tryUnregisterServiceERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManager22registerClientCallbackERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEERKNSB_INS0_15IClientCallbackEEE;
- _ZN7android2os16BpServiceManager24registerForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManager26unregisterForNotificationsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS0_16IServiceCallbackEEE;
- _ZN7android2os16BpServiceManagerC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16BpServiceManagerC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback10descriptorE;
- _ZN7android2os16IServiceCallback11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android2os16IServiceCallback12default_implE;
- _ZN7android2os16IServiceCallback14getDefaultImplEv;
- _ZN7android2os16IServiceCallback14setDefaultImplENSt3__110unique_ptrIS1_NS2_14default_deleteIS1_EEEE;
- _ZN7android2os16IServiceCallbackC2Ev;
- _ZN7android2os16IServiceCallbackD0Ev;
- _ZN7android2os16IServiceCallbackD1Ev;
- _ZN7android2os16IServiceCallbackD2Ev;
- _ZN7android2os16ParcelableHolder14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os16ServiceDebugInfo14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZN7android2os17BnServiceCallbackC2Ev;
- _ZN7android2os17BpServiceCallback14onRegistrationERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17BpServiceCallbackC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android2os17PersistableBundle10putBooleanERKNS_8String16Eb;
- _ZN7android2os17PersistableBundle12putIntVectorERKNS_8String16ERKNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZN7android2os17PersistableBundle13putLongVectorERKNS_8String16ERKNSt3__16vectorIlNS5_9allocatorIlEEEE;
- _ZN7android2os17PersistableBundle14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os17PersistableBundle15putDoubleVectorERKNS_8String16ERKNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZN7android2os17PersistableBundle15putStringVectorERKNS_8String16ERKNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZN7android2os17PersistableBundle16putBooleanVectorERKNS_8String16ERKNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZN7android2os17PersistableBundle19readFromParcelInnerEPKNS_6ParcelEm;
- _ZN7android2os17PersistableBundle20putPersistableBundleERKNS_8String16ERKS1_;
- _ZN7android2os17PersistableBundle5eraseERKNS_8String16E;
- _ZN7android2os17PersistableBundle6putIntERKNS_8String16Ei;
- _ZN7android2os17PersistableBundle7putLongERKNS_8String16El;
- _ZN7android2os17PersistableBundle9putDoubleERKNS_8String16Ed;
- _ZN7android2os17PersistableBundle9putStringERKNS_8String16ES4_;
- _ZN7android2os20ParcelFileDescriptor14readFromParcelEPKNS_6ParcelE;
- _ZN7android2os20ParcelFileDescriptorC1ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC1Ev;
- _ZN7android2os20ParcelFileDescriptorC2ENS_4base14unique_fd_implINS2_13DefaultCloserEEE;
- _ZN7android2os20ParcelFileDescriptorC2Ev;
- _ZN7android2os20ParcelFileDescriptorD0Ev;
- _ZN7android2os20ParcelFileDescriptorD1Ev;
- _ZN7android2os20ParcelFileDescriptorD2Ev;
- _ZN7android4aerrE;
- _ZN7android4alogE;
- _ZN7android4aoutE;
- _ZN7android6binder20LazyServiceRegistrar10reRegisterEv;
- _ZN7android6binder20LazyServiceRegistrar11getInstanceEv;
- _ZN7android6binder20LazyServiceRegistrar12forcePersistEb;
- _ZN7android6binder20LazyServiceRegistrar13tryUnregisterEv;
- _ZN7android6binder20LazyServiceRegistrar15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEbi;
- _ZN7android6binder20LazyServiceRegistrar25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder20LazyServiceRegistrarC1Ev;
- _ZN7android6binder20LazyServiceRegistrarC2Ev;
- _ZN7android6binder6Status11fromStatusTEi;
- _ZN7android6binder6Status12setExceptionEiRKNS_7String8E;
- _ZN7android6binder6Status14readFromParcelERKNS_6ParcelE;
- _ZN7android6binder6Status14setFromStatusTEi;
- _ZN7android6binder6Status17exceptionToStringEi;
- _ZN7android6binder6Status17fromExceptionCodeEi;
- _ZN7android6binder6Status17fromExceptionCodeEiPKc;
- _ZN7android6binder6Status17fromExceptionCodeEiRKNS_7String8E;
- _ZN7android6binder6Status23setServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status24fromServiceSpecificErrorEi;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiPKc;
- _ZN7android6binder6Status24fromServiceSpecificErrorEiRKNS_7String8E;
- _ZN7android6binder6Status2okEv;
- _ZN7android6binder6StatusC1Eii;
- _ZN7android6binder6StatusC1EiiRKNS_7String8E;
- _ZN7android6binder6StatusC2Eii;
- _ZN7android6binder6StatusC2EiiRKNS_7String8E;
- _ZN7android6binder8internal21ClientCounterCallback10reRegisterEv;
- _ZN7android6binder8internal21ClientCounterCallback12forcePersistEb;
- _ZN7android6binder8internal21ClientCounterCallback13tryUnregisterEv;
- _ZN7android6binder8internal21ClientCounterCallback15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi;
- _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;
- _ZN7android6binder8internal21ClientCounterCallbackC1Ev;
- _ZN7android6binder8internal21ClientCounterCallbackC2Ev;
- _ZN7android6Parcel10appendFromEPKS0_mm;
- _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;
- _ZN7android6Parcel10writeFloatEf;
- _ZN7android6Parcel10writeInt32Ei;
- _ZN7android6Parcel10writeInt64El;
- _ZN7android6Parcel11compareDataERKS0_;
- _ZN7android6Parcel11finishWriteEm;
- _ZN7android6Parcel11setDataSizeEm;
- _ZN7android6Parcel11writeDoubleEd;
- _ZN7android6Parcel11writeObjectERK18flat_binder_objectb;
- _ZN7android6Parcel11writeUint32Ej;
- _ZN7android6Parcel11writeUint64Em;
- _ZN7android6Parcel12pushAllowFdsEb;
- _ZN7android6Parcel12restartWriteEm;
- _ZN7android6Parcel12writeCStringEPKc;
- _ZN7android6Parcel12writeInplaceEm;
- _ZN7android6Parcel12writePointerEm;
- _ZN7android6Parcel12writeString8EPKcm;
- _ZN7android6Parcel12writeString8ERKNS_7String8E;
- _ZN7android6Parcel13continueWriteEm;
- _ZN7android6Parcel13flattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13markForBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel13writeString16EPKDsm;
- _ZN7android6Parcel13writeString16ERKNS_8String16E;
- _ZN7android6Parcel13writeString16ERKNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZN7android6Parcel13writeString16ERKNSt3__18optionalINS_8String16EEE;
- _ZN7android6Parcel13writeUnpaddedEPKvm;
- _ZN7android6Parcel14acquireObjectsEv;
- _ZN7android6Parcel14freeDataNoInitEv;
- _ZN7android6Parcel14releaseObjectsEv;
- _ZN7android6Parcel14writeByteArrayEmPKh;
- _ZN7android6Parcel15restoreAllowFdsEb;
- _ZN7android6Parcel15setDataCapacityEm;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZN7android6Parcel15writeBoolVectorERKNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZN7android6Parcel15writeByteVectorERKNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZN7android6Parcel15writeCharVectorERKNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZN7android6Parcel15writeInt32ArrayEmPKi;
- _ZN7android6Parcel15writeParcelableERKNS_10ParcelableE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZN7android6Parcel16writeFloatVectorERKNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZN7android6Parcel16writeInt32VectorERKNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__110unique_ptrINS1_6vectorIlNS1_9allocatorIlEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__16vectorIlNS1_9allocatorIlEEEE;
- _ZN7android6Parcel16writeInt64VectorERKNSt3__18optionalINS1_6vectorIlNS1_9allocatorIlEEEEEE;
- _ZN7android6Parcel16writeNoExceptionEv;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZN7android6Parcel16writeUtf8AsUtf16ERKNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZN7android6Parcel17writeDoubleVectorERKNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZN7android6Parcel17writeNativeHandleEPK13native_handle;
- _ZN7android6Parcel17writeStrongBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__110unique_ptrINS1_6vectorImNS1_9allocatorImEEEENS1_14default_deleteIS6_EEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__16vectorImNS1_9allocatorImEEEE;
- _ZN7android6Parcel17writeUint64VectorERKNSt3__18optionalINS1_6vectorImNS1_9allocatorImEEEEEE;
- _ZN7android6Parcel18getGlobalAllocSizeEv;
- _ZN7android6Parcel19finishFlattenBinderERKNS_2spINS_7IBinderEEE;
- _ZN7android6Parcel19getGlobalAllocCountEv;
- _ZN7android6Parcel19ipcSetDataReferenceEPKhmPKymPFvPS0_S2_mS4_mE;
- _ZN7android6Parcel19writeFileDescriptorEib;
- _ZN7android6Parcel19writeInterfaceTokenEPKDsm;
- _ZN7android6Parcel19writeInterfaceTokenERKNS_8String16E;
- _ZN7android6Parcel19writeString16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZN7android6Parcel19writeString16VectorERKNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZN7android6Parcel20closeFileDescriptorsEv;
- _ZN7android6Parcel22writeDupFileDescriptorEi;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZN7android6Parcel23writeStrongBinderVectorERKNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZN7android6Parcel25writeParcelFileDescriptorEib;
- _ZN7android6Parcel25writeUniqueFileDescriptorERKNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android6Parcel26writeRawNullableParcelableEPKNS_10ParcelableE;
- _ZN7android6Parcel27replaceCallingWorkSourceUidEj;
- _ZN7android6Parcel28writeDupParcelFileDescriptorEi;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZN7android6Parcel28writeUtf8VectorAsUtf16VectorERKNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZN7android6Parcel31writeUniqueFileDescriptorVectorERKNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZN7android6Parcel35writeDupImmutableBlobFileDescriptorEi;
- _ZN7android6Parcel4Blob4initEiPvmb;
- _ZN7android6Parcel4Blob5clearEv;
- _ZN7android6Parcel4Blob7releaseEv;
- _ZN7android6Parcel4BlobC1Ev;
- _ZN7android6Parcel4BlobC2Ev;
- _ZN7android6Parcel4BlobD1Ev;
- _ZN7android6Parcel4BlobD2Ev;
- _ZN7android6Parcel5writeEPKvm;
- _ZN7android6Parcel5writeERKNS0_26FlattenableHelperInterfaceE;
- _ZN7android6Parcel7setDataEPKhm;
- _ZN7android6Parcel8freeDataEv;
- _ZN7android6Parcel8growDataEm;
- _ZN7android6Parcel8setErrorEi;
- _ZN7android6Parcel9initStateEv;
- _ZN7android6Parcel9writeBlobEmbPNS0_12WritableBlobE;
- _ZN7android6Parcel9writeBoolEb;
- _ZN7android6Parcel9writeByteEa;
- _ZN7android6Parcel9writeCharEDs;
- _ZN7android6ParcelC1Ev;
- _ZN7android6ParcelC2Ev;
- _ZN7android6ParcelD1Ev;
- _ZN7android6ParcelD2Ev;
- _ZN7android7BBinder10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinder10pingBinderEv;
- _ZN7android7BBinder11getDebugPidEv;
- _ZN7android7BBinder11isInheritRtEv;
- _ZN7android7BBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android7BBinder11localBinderEv;
- _ZN7android7BBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android7BBinder12detachObjectEPKv;
- _ZN7android7BBinder12getExtensionEv;
- _ZN7android7BBinder12setExtensionERKNS_2spINS_7IBinderEEE;
- _ZN7android7BBinder12setInheritRtEb;
- _ZN7android7BBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android7BBinder15isRequestingSidEv;
- _ZN7android7BBinder16setRequestingSidEb;
- _ZN7android7BBinder17getOrCreateExtrasEv;
- _ZN7android7BBinder21getMinSchedulerPolicyEv;
- _ZN7android7BBinder21setMinSchedulerPolicyEii;
- _ZN7android7BBinder23getMinSchedulerPriorityEv;
- _ZN7android7BBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android7BBinderC1Ev;
- _ZN7android7BBinderC2Ev;
- _ZN7android7BBinderD0Ev;
- _ZN7android7BBinderD1Ev;
- _ZN7android7BBinderD2Ev;
- _ZN7android7content2pm18PackageChangeEvent14readFromParcelEPKNS_6ParcelE;
- _ZN7android7content2pm21IPackageManagerNative10descriptorE;
- _ZN7android7content2pm21IPackageManagerNative11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm21IPackageManagerNative12default_implE;
- _ZN7android7content2pm21IPackageManagerNative14getDefaultImplEv;
- _ZN7android7content2pm21IPackageManagerNative14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm21IPackageManagerNativeC2Ev;
- _ZN7android7content2pm21IPackageManagerNativeD0Ev;
- _ZN7android7content2pm21IPackageManagerNativeD1Ev;
- _ZN7android7content2pm21IPackageManagerNativeD2Ev;
- _ZN7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm22BnPackageManagerNativeC2Ev;
- _ZN7android7content2pm22BpPackageManagerNative14getAllPackagesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative15getNamesForUidsERKNSt3__16vectorIiNS3_9allocatorIiEEEEPNS4_INS3_12basic_stringIcNS3_11char_traitsIcEENS5_IcEEEENS5_ISE_EEEE;
- _ZN7android7content2pm22BpPackageManagerNative16getLocationFlagsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPi;
- _ZN7android7content2pm22BpPackageManagerNative16hasSystemFeatureERKNS_8String16EiPb;
- _ZN7android7content2pm22BpPackageManagerNative19isPackageDebuggableERKNS_8String16EPb;
- _ZN7android7content2pm22BpPackageManagerNative22getInstallerForPackageERKNS_8String16EPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative24getVersionCodeForPackageERKNS_8String16EPl;
- _ZN7android7content2pm22BpPackageManagerNative27hasSha256SigningCertificateERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIhNS7_IhEEEEPb;
- _ZN7android7content2pm22BpPackageManagerNative28getModuleMetadataPackageNameEPNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29getTargetSdkVersionForPackageERKNS_8String16EPi;
- _ZN7android7content2pm22BpPackageManagerNative29isAudioPlaybackCaptureAllowedERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEPNS4_IbNS8_IbEEEE;
- _ZN7android7content2pm22BpPackageManagerNative29registerPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNative31unregisterPackageChangeObserverERKNS_2spINS1_22IPackageChangeObserverEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22BpPackageManagerNativeC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver10descriptorE;
- _ZN7android7content2pm22IPackageChangeObserver11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm22IPackageChangeObserver12default_implE;
- _ZN7android7content2pm22IPackageChangeObserver14getDefaultImplEv;
- _ZN7android7content2pm22IPackageChangeObserver14setDefaultImplENSt3__110unique_ptrIS2_NS3_14default_deleteIS2_EEEE;
- _ZN7android7content2pm22IPackageChangeObserverC2Ev;
- _ZN7android7content2pm22IPackageChangeObserverD0Ev;
- _ZN7android7content2pm22IPackageChangeObserverD1Ev;
- _ZN7android7content2pm22IPackageChangeObserverD2Ev;
- _ZN7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZN7android7content2pm23BnPackageChangeObserverC2Ev;
- _ZN7android7content2pm23BpPackageChangeObserver16onPackageChangedERKNS1_18PackageChangeEventE;
- _ZN7android7content2pm23BpPackageChangeObserverC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android7content2pm23BpPackageChangeObserverC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android7HexDumpC1EPKvmm;
- _ZN7android7HexDumpC2EPKvmm;
- _ZN7android7IBinder11getDebugPidEPi;
- _ZN7android7IBinder11localBinderEv;
- _ZN7android7IBinder12getExtensionEPNS_2spIS0_EE;
- _ZN7android7IBinder12remoteBinderEv;
- _ZN7android7IBinder12shellCommandERKNS_2spIS0_EEiiiRNS_6VectorINS_8String16EEERKNS1_INS_14IShellCallbackEEERKNS1_INS_15IResultReceiverEEE;
- _ZN7android7IBinder19queryLocalInterfaceERKNS_8String16E;
- _ZN7android7IBinderC2Ev;
- _ZN7android7IBinderD0Ev;
- _ZN7android7IBinderD1Ev;
- _ZN7android7IBinderD2Ev;
- _ZN7android7IMemory10descriptorE;
- _ZN7android7IMemory11asInterfaceERKNS_2spINS_7IBinderEEE;
- _ZN7android7IMemory12default_implE;
- _ZN7android7IMemory14getDefaultImplEv;
- _ZN7android7IMemory14setDefaultImplENSt3__110unique_ptrIS0_NS1_14default_deleteIS0_EEEE;
- _ZN7android7IMemoryC2Ev;
- _ZN7android7IMemoryD0Ev;
- _ZN7android7IMemoryD1Ev;
- _ZN7android7IMemoryD2Ev;
- _ZN7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BnMemoryC2Ev;
- _ZN7android8BnMemoryD0Ev;
- _ZN7android8BnMemoryD1Ev;
- _ZN7android8BnMemoryD2Ev;
- _ZN7android8BpBinder10onFirstRefEv;
- _ZN7android8BpBinder10pingBinderEv;
- _ZN7android8BpBinder11linkToDeathERKNS_2spINS_7IBinder14DeathRecipientEEEPvj;
- _ZN7android8BpBinder12attachObjectEPKvPvS3_PFvS2_S3_S3_E;
- _ZN7android8BpBinder12detachObjectEPKv;
- _ZN7android8BpBinder12remoteBinderEv;
- _ZN7android8BpBinder12sendObituaryEv;
- _ZN7android8BpBinder12sTrackingMapE;
- _ZN7android8BpBinder13getCountByUidERNS_6VectorIjEES3_;
- _ZN7android8BpBinder13ObjectManager4killEv;
- _ZN7android8BpBinder13ObjectManager6attachEPKvPvS4_PFvS3_S4_S4_E;
- _ZN7android8BpBinder13ObjectManager6detachEPKv;
- _ZN7android8BpBinder13ObjectManagerC1Ev;
- _ZN7android8BpBinder13ObjectManagerC2Ev;
- _ZN7android8BpBinder13ObjectManagerD1Ev;
- _ZN7android8BpBinder13ObjectManagerD2Ev;
- _ZN7android8BpBinder13sTrackingLockE;
- _ZN7android8BpBinder13unlinkToDeathERKNS_2wpINS_7IBinder14DeathRecipientEEEPvjPS4_;
- _ZN7android8BpBinder14reportOneDeathERKNS0_8ObituaryE;
- _ZN7android8BpBinder14sLimitCallbackE;
- _ZN7android8BpBinder15onLastStrongRefEPKv;
- _ZN7android8BpBinder15sNumTrackedUidsE;
- _ZN7android8BpBinder16enableCountByUidEv;
- _ZN7android8BpBinder16setLimitCallbackEPFviE;
- _ZN7android8BpBinder17disableCountByUidEv;
- _ZN7android8BpBinder18sCountByUidEnabledE;
- _ZN7android8BpBinder19getBinderProxyCountEj;
- _ZN7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZN7android8BpBinder20setCountByUidEnabledEb;
- _ZN7android8BpBinder26sBinderProxyThrottleCreateE;
- _ZN7android8BpBinder29sBinderProxyCountLowWatermarkE;
- _ZN7android8BpBinder29setBinderProxyCountWatermarksEii;
- _ZN7android8BpBinder30sBinderProxyCountHighWatermarkE;
- _ZN7android8BpBinder4dumpEiRKNS_6VectorINS_8String16EEE;
- _ZN7android8BpBinder6createEi;
- _ZN7android8BpBinder6createERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j;
- _ZN7android8BpBinderC1EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC1EONS0_9RpcHandleE;
- _ZN7android8BpBinderC1EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderC2EONS0_12BinderHandleEi;
- _ZN7android8BpBinderC2EONS0_9RpcHandleE;
- _ZN7android8BpBinderC2EONSt3__17variantIJNS0_12BinderHandleENS0_9RpcHandleEEEE;
- _ZN7android8BpBinderD0Ev;
- _ZN7android8BpBinderD1Ev;
- _ZN7android8BpBinderD2Ev;
- _ZN7android8BpMemoryC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android8BpMemoryD0Ev;
- _ZN7android8BpMemoryD1Ev;
- _ZN7android8BpMemoryD2Ev;
- _ZN7android8internal9Stability11getCategoryEPNS_7IBinderE;
- _ZN7android8internal9Stability11levelStringENS1_5LevelE;
- _ZN7android8internal9Stability13getLocalLevelEv;
- _ZN7android8internal9Stability15isDeclaredLevelENS1_5LevelE;
- _ZN7android8internal9Stability17debugLogStabilityERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability19markCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability22tryMarkCompilationUnitEPNS_7IBinderE;
- _ZN7android8internal9Stability24requiresVintfDeclarationERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability25forceDowngradeToStabilityERKNS_2spINS_7IBinderEEENS1_5LevelE;
- _ZN7android8internal9Stability30forceDowngradeToLocalStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToSystemStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability31forceDowngradeToVendorStabilityERKNS_2spINS_7IBinderEEE;
- _ZN7android8internal9Stability5checkENS1_8CategoryENS1_5LevelE;
- _ZN7android8internal9Stability7setReprEPNS_7IBinderEij;
- _ZN7android8internal9Stability8Category11debugStringEv;
- _ZN7android8internal9Stability8markVndkEPNS_7IBinderE;
- _ZN7android8internal9Stability9markVintfEPNS_7IBinderE;
- _ZN7android8RpcState11CommandDataC1Em;
- _ZN7android8RpcState11CommandDataC2Em;
- _ZN7android8RpcState12countBindersEv;
- _ZN7android8RpcState12getSessionIdERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPi;
- _ZN7android8RpcState12waitForReplyERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPNS_6ParcelE;
- _ZN7android8RpcState13getMaxThreadsERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEEPm;
- _ZN7android8RpcState13getRootObjectERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState13sendDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressE;
- _ZN7android8RpcState15onBinderLeavingERKNS_2spINS_10RpcSessionEEERKNS1_INS_7IBinderEEEPNS_10RpcAddressE;
- _ZN7android8RpcState15processTransactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState16onBinderEnteringERKNS_2spINS_10RpcSessionEEERKNS_10RpcAddressE;
- _ZN7android8RpcState16processDecStrongERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState20getAndExecuteCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEE;
- _ZN7android8RpcState20processServerCommandERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEERKNS_13RpcWireHeaderE;
- _ZN7android8RpcState23processTransactInternalERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_2spINS_10RpcSessionEEENS0_11CommandDataE;
- _ZN7android8RpcState4dumpEv;
- _ZN7android8RpcState6rpcRecERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPvm;
- _ZN7android8RpcState7rpcSendERKNS_4base14unique_fd_implINS1_13DefaultCloserEEEPKcPKvm;
- _ZN7android8RpcState8transactERKNS_4base14unique_fd_implINS1_13DefaultCloserEEERKNS_10RpcAddressEjRKNS_6ParcelERKNS_2spINS_10RpcSessionEEEPSA_j;
- _ZN7android8RpcState9terminateEv;
- _ZN7android8RpcStateC1Ev;
- _ZN7android8RpcStateC2Ev;
- _ZN7android8RpcStateD1Ev;
- _ZN7android8RpcStateD2Ev;
- _ZN7android9BpRefBase10onFirstRefEv;
- _ZN7android9BpRefBase15onLastStrongRefEPKv;
- _ZN7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZN7android9BpRefBaseC1ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseC2ERKNS_2spINS_7IBinderEEE;
- _ZN7android9BpRefBaseD0Ev;
- _ZN7android9BpRefBaseD1Ev;
- _ZN7android9BpRefBaseD2Ev;
- _ZN7android9HeapCache10binderDiedERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCache10dump_heapsEv;
- _ZN7android9HeapCache8get_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9find_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2spINS_7IBinderEEE;
- _ZN7android9HeapCache9free_heapERKNS_2wpINS_7IBinderEEE;
- _ZN7android9HeapCacheC1Ev;
- _ZN7android9HeapCacheC2Ev;
- _ZN7android9HeapCacheD0Ev;
- _ZN7android9HeapCacheD1Ev;
- _ZN7android9HeapCacheD2Ev;
- _ZN7android9hexStringEPKvm;
- _ZN7android9RpcServer12listSessionsEv;
- _ZN7android9RpcServer13getMaxThreadsEv;
- _ZN7android9RpcServer13getRootObjectEv;
- _ZN7android9RpcServer13releaseServerEv;
- _ZN7android9RpcServer13setMaxThreadsEm;
- _ZN7android9RpcServer13setRootObjectERKNS_2spINS_7IBinderEEE;
- _ZN7android9RpcServer15setupInetServerEjPj;
- _ZN7android9RpcServer16setupVsockServerEj;
- _ZN7android9RpcServer17setRootObjectWeakERKNS_2wpINS_7IBinderEEE;
- _ZN7android9RpcServer17setupSocketServerERKNS_16RpcSocketAddressE;
- _ZN7android9RpcServer19establishConnectionEONS_2spIS0_EENS_4base14unique_fd_implINS4_13DefaultCloserEEE;
- _ZN7android9RpcServer19setupExternalServerENS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZN7android9RpcServer20onSessionTerminatingERKNS_2spINS_10RpcSessionEEE;
- _ZN7android9RpcServer21setupUnixDomainServerEPKc;
- _ZN7android9RpcServer24numUninitializedSessionsEv;
- _ZN7android9RpcServer4joinEv;
- _ZN7android9RpcServer4makeEv;
- _ZN7android9RpcServer61iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProductionEv;
- _ZN7android9RpcServer9acceptOneEv;
- _ZN7android9RpcServer9hasServerEv;
- _ZN7android9RpcServerC1Ev;
- _ZN7android9RpcServerC2Ev;
- _ZN7android9RpcServerD0Ev;
- _ZN7android9RpcServerD1Ev;
- _ZN7android9RpcServerD2Ev;
- _ZN7androidlsERNS_10TextOutputERKNS_7HexDumpE;
- _ZN7androidlsERNS_10TextOutputERKNS_8TypeCodeE;
- _ZN7androidlsIA15_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA24_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA2_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA34_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA3_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA43_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA4_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA5_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA8_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIA9_cEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIjEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsImEERNS_10TextOutputES2_RKT_;
- _ZN7androidlsINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEERNS_10TextOutputES9_RKT_;
- _ZN7androidlsIPcEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIPvEERNS_10TextOutputES3_RKT_;
- _ZN7androidlsIyEERNS_10TextOutputES2_RKT_;
- _ZNK7android10MemoryBase9getMemoryEPlPm;
- _ZNK7android10RpcAddress13writeToParcelEPNS_6ParcelE;
- _ZNK7android10RpcAddress15viewRawEmbeddedEv;
- _ZNK7android10RpcAddress6isZeroEv;
- _ZNK7android10RpcAddress8toStringEv;
- _ZNK7android10RpcAddressltERKS0_;
- _ZNK7android11IMemoryHeap22getInterfaceDescriptorEv;
- _ZNK7android12BpMemoryHeap12assertMappedEv;
- _ZNK7android12BpMemoryHeap18assertReallyMappedEv;
- _ZNK7android12BpMemoryHeap7getBaseEv;
- _ZNK7android12BpMemoryHeap7getSizeEv;
- _ZNK7android12BpMemoryHeap8getFlagsEv;
- _ZNK7android12BpMemoryHeap9getHeapIDEv;
- _ZNK7android12BpMemoryHeap9getOffsetEv;
- _ZNK7android12MemoryDealer4dumpEPKc;
- _ZNK7android12MemoryDealer4heapEv;
- _ZNK7android12MemoryDealer9allocatorEv;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_compareEPKvSA_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE15do_move_forwardEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE16do_move_backwardEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE7do_copyEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEE8do_splatEPvPKvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_compareES3_S3_;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE10do_destroyEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE12do_constructEPvm;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE15do_move_forwardEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE16do_move_backwardEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE7do_copyEPvS3_m;
- _ZNK7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEE8do_splatEPvS3_m;
- _ZNK7android14IPCThreadState13getCallingPidEv;
- _ZNK7android14IPCThreadState13getCallingSidEv;
- _ZNK7android14IPCThreadState13getCallingUidEv;
- _ZNK7android14IPCThreadState18getCallRestrictionEv;
- _ZNK7android14IPCThreadState19getStrictModePolicyEv;
- _ZNK7android14IPCThreadState22getServingStackPointerEv;
- _ZNK7android14IPCThreadState23getCallingWorkSourceUidEv;
- _ZNK7android14IPCThreadState25shouldPropagateWorkSourceEv;
- _ZNK7android14IPCThreadState29getLastTransactionBinderFlagsEv;
- _ZNK7android14IShellCallback22getInterfaceDescriptorEv;
- _ZNK7android14MemoryHeapBase7getBaseEv;
- _ZNK7android14MemoryHeapBase7getSizeEv;
- _ZNK7android14MemoryHeapBase8getFlagsEv;
- _ZNK7android14MemoryHeapBase9getDeviceEv;
- _ZNK7android14MemoryHeapBase9getHeapIDEv;
- _ZNK7android14MemoryHeapBase9getOffsetEv;
- _ZNK7android15IResultReceiver22getInterfaceDescriptorEv;
- _ZNK7android15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android18BufferedTextOutput9getBufferEv;
- _ZNK7android18ServiceManagerShim10getServiceERKNS_8String16E;
- _ZNK7android18ServiceManagerShim12checkServiceERKNS_8String16E;
- _ZNK7android22SimpleBestFitAllocator4dumpEPKc;
- _ZNK7android22SimpleBestFitAllocator4dumpERNS_7String8EPKc;
- _ZNK7android22SimpleBestFitAllocator4sizeEv;
- _ZNK7android22SimpleBestFitAllocator6dump_lEPKc;
- _ZNK7android22SimpleBestFitAllocator6dump_lERNS_7String8EPKc;
- _ZNK7android2os15IClientCallback22getInterfaceDescriptorEv;
- _ZNK7android2os15IServiceManager22getInterfaceDescriptorEv;
- _ZNK7android2os16IServiceCallback22getInterfaceDescriptorEv;
- _ZNK7android2os16ParcelableHolder13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os16ServiceDebugInfo13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle10getBooleanERKNS_8String16EPb;
- _ZNK7android2os17PersistableBundle10getIntKeysEv;
- _ZNK7android2os17PersistableBundle11getLongKeysEv;
- _ZNK7android2os17PersistableBundle12getIntVectorERKNS_8String16EPNSt3__16vectorIiNS5_9allocatorIiEEEE;
- _ZNK7android2os17PersistableBundle13getDoubleKeysEv;
- _ZNK7android2os17PersistableBundle13getLongVectorERKNS_8String16EPNSt3__16vectorIlNS5_9allocatorIlEEEE;
- _ZNK7android2os17PersistableBundle13getStringKeysEv;
- _ZNK7android2os17PersistableBundle13writeToParcelEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle14getBooleanKeysEv;
- _ZNK7android2os17PersistableBundle15getDoubleVectorERKNS_8String16EPNSt3__16vectorIdNS5_9allocatorIdEEEE;
- _ZNK7android2os17PersistableBundle15getStringVectorERKNS_8String16EPNSt3__16vectorIS2_NS5_9allocatorIS2_EEEE;
- _ZNK7android2os17PersistableBundle16getBooleanVectorERKNS_8String16EPNSt3__16vectorIbNS5_9allocatorIbEEEE;
- _ZNK7android2os17PersistableBundle16getIntVectorKeysEv;
- _ZNK7android2os17PersistableBundle17getLongVectorKeysEv;
- _ZNK7android2os17PersistableBundle18writeToParcelInnerEPNS_6ParcelE;
- _ZNK7android2os17PersistableBundle19getDoubleVectorKeysEv;
- _ZNK7android2os17PersistableBundle19getStringVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getBooleanVectorKeysEv;
- _ZNK7android2os17PersistableBundle20getPersistableBundleERKNS_8String16EPS1_;
- _ZNK7android2os17PersistableBundle24getPersistableBundleKeysEv;
- _ZNK7android2os17PersistableBundle4sizeEv;
- _ZNK7android2os17PersistableBundle5emptyEv;
- _ZNK7android2os17PersistableBundle6getIntERKNS_8String16EPi;
- _ZNK7android2os17PersistableBundle7getLongERKNS_8String16EPl;
- _ZNK7android2os17PersistableBundle9getDoubleERKNS_8String16EPd;
- _ZNK7android2os17PersistableBundle9getStringERKNS_8String16EPS2_;
- _ZNK7android2os20ParcelFileDescriptor13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status13writeToParcelEPNS_6ParcelE;
- _ZNK7android6binder6Status9toString8Ev;
- _ZNK7android6Parcel10errorCheckEv;
- _ZNK7android6Parcel10ipcObjectsEv;
- _ZNK7android6Parcel10readDoubleEPd;
- _ZNK7android6Parcel10readDoubleEv;
- _ZNK7android6Parcel10readObjectEb;
- _ZNK7android6Parcel10readUint32EPj;
- _ZNK7android6Parcel10readUint32Ev;
- _ZNK7android6Parcel10readUint64EPm;
- _ZNK7android6Parcel10readUint64Ev;
- _ZNK7android6Parcel10scanForFdsEv;
- _ZNK7android6Parcel11ipcDataSizeEv;
- _ZNK7android6Parcel11readCStringEv;
- _ZNK7android6Parcel11readInplaceEm;
- _ZNK7android6Parcel11readPointerEPm;
- _ZNK7android6Parcel11readPointerEv;
- _ZNK7android6Parcel11readString8EPNS_7String8E;
- _ZNK7android6Parcel11readString8Ev;
- _ZNK7android6Parcel12dataCapacityEv;
- _ZNK7android6Parcel12dataPositionEv;
- _ZNK7android6Parcel12objectsCountEv;
- _ZNK7android6Parcel12readString16EPNS_8String16E;
- _ZNK7android6Parcel12readString16EPNSt3__110unique_ptrINS_8String16ENS1_14default_deleteIS3_EEEE;
- _ZNK7android6Parcel12readString16EPNSt3__18optionalINS_8String16EEE;
- _ZNK7android6Parcel12readString16Ev;
- _ZNK7android6Parcel13markSensitiveEv;
- _ZNK7android6Parcel14checkInterfaceEPNS_7IBinderE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__110unique_ptrINS1_6vectorIbNS1_9allocatorIbEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__16vectorIbNS1_9allocatorIbEEEE;
- _ZNK7android6Parcel14readBoolVectorEPNSt3__18optionalINS1_6vectorIbNS1_9allocatorIbEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIaNS1_9allocatorIaEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__110unique_ptrINS1_6vectorIhNS1_9allocatorIhEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIaNS1_9allocatorIaEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__16vectorIhNS1_9allocatorIhEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIaNS1_9allocatorIaEEEEEE;
- _ZNK7android6Parcel14readByteVectorEPNSt3__18optionalINS1_6vectorIhNS1_9allocatorIhEEEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__110unique_ptrINS1_6vectorIDsNS1_9allocatorIDsEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__16vectorIDsNS1_9allocatorIDsEEEE;
- _ZNK7android6Parcel14readCharVectorEPNSt3__18optionalINS1_6vectorIDsNS1_9allocatorIDsEEEEEE;
- _ZNK7android6Parcel14readParcelableEPNS_10ParcelableE;
- _ZNK7android6Parcel15ipcObjectsCountEv;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__110unique_ptrINS1_6vectorIfNS1_9allocatorIfEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__16vectorIfNS1_9allocatorIfEEEE;
- _ZNK7android6Parcel15readFloatVectorEPNSt3__18optionalINS1_6vectorIfNS1_9allocatorIfEEEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__110unique_ptrINS1_6vectorIiNS1_9allocatorIiEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__16vectorIiNS1_9allocatorIiEEEE;
- _ZNK7android6Parcel15readInt32VectorEPNSt3__18optionalINS1_6vectorIiNS1_9allocatorIiEEEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__110unique_ptrINS1_6vectorIlNS1_9allocatorIlEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__16vectorIlNS1_9allocatorIlEEEE;
- _ZNK7android6Parcel15readInt64VectorEPNSt3__18optionalINS1_6vectorIlNS1_9allocatorIlEEEEEE;
- _ZNK7android6Parcel15setDataPositionEm;
- _ZNK7android6Parcel15unflattenBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16enforceInterfaceEPKDsmPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16enforceInterfaceERKNS_8String16EPNS_14IPCThreadStateE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__110unique_ptrINS1_6vectorIdNS1_9allocatorIdEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__16vectorIdNS1_9allocatorIdEEEE;
- _ZNK7android6Parcel16readDoubleVectorEPNSt3__18optionalINS1_6vectorIdNS1_9allocatorIdEEEEEE;
- _ZNK7android6Parcel16readNativeHandleEv;
- _ZNK7android6Parcel16readStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel16readStrongBinderEv;
- _ZNK7android6Parcel16readStrongBinderINS_2os15IClientCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_2os16IServiceCallbackEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readStrongBinderINS_7content2pm22IPackageChangeObserverEEEiPNS_2spIT_EE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__110unique_ptrINS1_6vectorImNS1_9allocatorImEEEENS1_14default_deleteIS6_EEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__16vectorImNS1_9allocatorImEEEE;
- _ZNK7android6Parcel16readUint64VectorEPNSt3__18optionalINS1_6vectorImNS1_9allocatorImEEEEEE;
- _ZNK7android6Parcel16validateReadDataEm;
- _ZNK7android6Parcel17getBlobAshmemSizeEv;
- _ZNK7android6Parcel17getOpenAshmemSizeEv;
- _ZNK7android6Parcel17readExceptionCodeEv;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__110unique_ptrINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS8_EEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE;
- _ZNK7android6Parcel17readUtf8FromUtf16EPNSt3__18optionalINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE;
- _ZNK7android6Parcel18hasFileDescriptorsEv;
- _ZNK7android6Parcel18readFileDescriptorEv;
- _ZNK7android6Parcel18readString16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS_8String16ENS1_14default_deleteIS4_EEEENS1_9allocatorIS7_EEEENS5_ISA_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__16vectorINS_8String16ENS1_9allocatorIS3_EEEE;
- _ZNK7android6Parcel18readString16VectorEPNSt3__18optionalINS1_6vectorINS2_INS_8String16EEENS1_9allocatorIS5_EEEEEE;
- _ZNK7android6Parcel18readString8InplaceEPm;
- _ZNK7android6Parcel19readString16InplaceEPm;
- _ZNK7android6Parcel21finishUnflattenBinderERKNS_2spINS_7IBinderEEEPS3_;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__110unique_ptrINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEENS1_14default_deleteIS9_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__16vectorINS_2spINS_7IBinderEEENS1_9allocatorIS5_EEEE;
- _ZNK7android6Parcel22readStrongBinderVectorEPNSt3__18optionalINS1_6vectorINS_2spINS_7IBinderEEENS1_9allocatorIS6_EEEEEE;
- _ZNK7android6Parcel24readCallingWorkSourceUidEv;
- _ZNK7android6Parcel24readNullableStrongBinderEPNS_2spINS_7IBinderEEE;
- _ZNK7android6Parcel24readParcelFileDescriptorEv;
- _ZNK7android6Parcel24readUniqueFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__110unique_ptrINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_14default_deleteIS9_EEEENS7_ISC_EEEENSA_ISE_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEE;
- _ZNK7android6Parcel29readUtf8VectorFromUtf16VectorEPNSt3__18optionalINS1_6vectorINS2_INS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEENS7_ISA_EEEEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__110unique_ptrINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEENS1_14default_deleteISA_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__16vectorINS_4base14unique_fd_implINS3_13DefaultCloserEEENS1_9allocatorIS6_EEEE;
- _ZNK7android6Parcel30readUniqueFileDescriptorVectorEPNSt3__18optionalINS1_6vectorINS_4base14unique_fd_implINS4_13DefaultCloserEEENS1_9allocatorIS7_EEEEEE;
- _ZNK7android6Parcel30readUniqueParcelFileDescriptorEPNS_4base14unique_fd_implINS1_13DefaultCloserEEE;
- _ZNK7android6Parcel37updateWorkSourceRequestHeaderPositionEv;
- _ZNK7android6Parcel4dataEv;
- _ZNK7android6Parcel4readEPvm;
- _ZNK7android6Parcel4readERNS0_26FlattenableHelperInterfaceE;
- _ZNK7android6Parcel5printERNS_10TextOutputEj;
- _ZNK7android6Parcel7ipcDataEv;
- _ZNK7android6Parcel8allowFdsEv;
- _ZNK7android6Parcel8dataSizeEv;
- _ZNK7android6Parcel8isForRpcEv;
- _ZNK7android6Parcel8readBlobEmPNS0_12ReadableBlobE;
- _ZNK7android6Parcel8readBoolEPb;
- _ZNK7android6Parcel8readBoolEv;
- _ZNK7android6Parcel8readByteEPa;
- _ZNK7android6Parcel8readByteEv;
- _ZNK7android6Parcel8readCharEPDs;
- _ZNK7android6Parcel8readCharEv;
- _ZNK7android6Parcel9dataAvailEv;
- _ZNK7android6Parcel9readFloatEPf;
- _ZNK7android6Parcel9readFloatEv;
- _ZNK7android6Parcel9readInt32EPi;
- _ZNK7android6Parcel9readInt32Ev;
- _ZNK7android6Parcel9readInt64EPl;
- _ZNK7android6Parcel9readInt64Ev;
- _ZNK7android6VectorIiE10do_destroyEPvm;
- _ZNK7android6VectorIiE12do_constructEPvm;
- _ZNK7android6VectorIiE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIiE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIiE7do_copyEPvPKvm;
- _ZNK7android6VectorIiE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE10do_destroyEPvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE12do_constructEPvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_12ProcessState12handle_entryEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE10do_destroyEPvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE12do_constructEPvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE10do_destroyEPvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE12do_constructEPvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_8BpBinder8ObituaryEE8do_splatEPvPKvm;
- _ZNK7android6VectorINS_8String16EE10do_destroyEPvm;
- _ZNK7android6VectorINS_8String16EE12do_constructEPvm;
- _ZNK7android6VectorINS_8String16EE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorINS_8String16EE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorINS_8String16EE7do_copyEPvPKvm;
- _ZNK7android6VectorINS_8String16EE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7BBinderEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7BBinderEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7BBinderEE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBase12weakref_typeEE8do_splatEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE10do_destroyEPvm;
- _ZNK7android6VectorIPNS_7RefBaseEE12do_constructEPvm;
- _ZNK7android6VectorIPNS_7RefBaseEE15do_move_forwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE16do_move_backwardEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE7do_copyEPvPKvm;
- _ZNK7android6VectorIPNS_7RefBaseEE8do_splatEPvPKvm;
- _ZNK7android7BBinder10findObjectEPKv;
- _ZNK7android7BBinder13isBinderAliveEv;
- _ZNK7android7BBinder22getInterfaceDescriptorEv;
- _ZNK7android7content2pm18PackageChangeEvent13writeToParcelEPNS_6ParcelE;
- _ZNK7android7content2pm21IPackageManagerNative22getInterfaceDescriptorEv;
- _ZNK7android7content2pm22IPackageChangeObserver22getInterfaceDescriptorEv;
- _ZNK7android7IBinder13checkSubclassEPKv;
- _ZNK7android7IMemory11fastPointerERKNS_2spINS_7IBinderEEEl;
- _ZNK7android7IMemory15unsecurePointerEv;
- _ZNK7android7IMemory22getInterfaceDescriptorEv;
- _ZNK7android7IMemory4sizeEv;
- _ZNK7android7IMemory6offsetEv;
- _ZNK7android7IMemory7pointerEv;
- _ZNK7android8BpBinder10findObjectEPKv;
- _ZNK7android8BpBinder10rpcAddressEv;
- _ZNK7android8BpBinder10rpcSessionEv;
- _ZNK7android8BpBinder11isRpcBinderEv;
- _ZNK7android8BpBinder12binderHandleEv;
- _ZNK7android8BpBinder13isBinderAliveEv;
- _ZNK7android8BpBinder13ObjectManager4findEPKv;
- _ZNK7android8BpBinder18isDescriptorCachedEv;
- _ZNK7android8BpBinder22getInterfaceDescriptorEv;
- _ZNK7android8BpMemory9getMemoryEPlPm;
- _ZTCN7android10AllocationE0_NS_10IInterfaceE;
- _ZTCN7android10AllocationE0_NS_10MemoryBaseE;
- _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10AllocationE0_NS_7IMemoryE;
- _ZTCN7android10AllocationE0_NS_8BnMemoryE;
- _ZTCN7android10AllocationE8_NS_7BBinderE;
- _ZTCN7android10AllocationE8_NS_7IBinderE;
- _ZTCN7android10MemoryBaseE0_NS_10IInterfaceE;
- _ZTCN7android10MemoryBaseE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android10MemoryBaseE0_NS_7IMemoryE;
- _ZTCN7android10MemoryBaseE0_NS_8BnMemoryE;
- _ZTCN7android10MemoryBaseE8_NS_7BBinderE;
- _ZTCN7android10MemoryBaseE8_NS_7IBinderE;
- _ZTCN7android10PoolThreadE0_NS_6ThreadE;
- _ZTCN7android11IMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BnMemoryHeapE0_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BnMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BnMemoryHeapE8_NS_7BBinderE;
- _ZTCN7android12BnMemoryHeapE8_NS_7IBinderE;
- _ZTCN7android12BpMemoryHeapE0_NS_10IInterfaceE;
- _ZTCN7android12BpMemoryHeapE0_NS_11BpInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android12BpMemoryHeapE0_NS_11IMemoryHeapE;
- _ZTCN7android12BpMemoryHeapE8_NS_9BpRefBaseE;
- _ZTCN7android14IShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE64_NS_10IInterfaceE;
- _ZTCN7android14MemoryHeapBaseE64_NS_11BnInterfaceINS_11IMemoryHeapEEE;
- _ZTCN7android14MemoryHeapBaseE64_NS_11IMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE64_NS_12BnMemoryHeapE;
- _ZTCN7android14MemoryHeapBaseE72_NS_7BBinderE;
- _ZTCN7android14MemoryHeapBaseE72_NS_7IBinderE;
- _ZTCN7android15BnShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BnShellCallbackE0_NS_11BnInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BnShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BnShellCallbackE8_NS_7BBinderE;
- _ZTCN7android15BnShellCallbackE8_NS_7IBinderE;
- _ZTCN7android15BpShellCallbackE0_NS_10IInterfaceE;
- _ZTCN7android15BpShellCallbackE0_NS_11BpInterfaceINS_14IShellCallbackEEE;
- _ZTCN7android15BpShellCallbackE0_NS_14IShellCallbackE;
- _ZTCN7android15BpShellCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android15IResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BnResultReceiverE0_NS_11BnInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BnResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BnResultReceiverE8_NS_7BBinderE;
- _ZTCN7android16BnResultReceiverE8_NS_7IBinderE;
- _ZTCN7android16BpResultReceiverE0_NS_10IInterfaceE;
- _ZTCN7android16BpResultReceiverE0_NS_11BpInterfaceINS_15IResultReceiverEEE;
- _ZTCN7android16BpResultReceiverE0_NS_15IResultReceiverE;
- _ZTCN7android16BpResultReceiverE8_NS_9BpRefBaseE;
- _ZTCN7android18ServiceManagerShimE0_NS_10IInterfaceE;
- _ZTCN7android18ServiceManagerShimE0_NS_15IServiceManagerE;
- _ZTCN7android2os15IClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os15IServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BnClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnClientCallbackE0_NS_11BnInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BnClientCallbackE8_NS_7BBinderE;
- _ZTCN7android2os16BnClientCallbackE8_NS_7IBinderE;
- _ZTCN7android2os16BnServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BnServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BnServiceManagerE0_NS_11BnInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BnServiceManagerE8_NS_7BBinderE;
- _ZTCN7android2os16BnServiceManagerE8_NS_7IBinderE;
- _ZTCN7android2os16BpClientCallbackE0_NS0_15IClientCallbackE;
- _ZTCN7android2os16BpClientCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpClientCallbackE0_NS_11BpInterfaceINS0_15IClientCallbackEEE;
- _ZTCN7android2os16BpClientCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android2os16BpServiceManagerE0_NS0_15IServiceManagerE;
- _ZTCN7android2os16BpServiceManagerE0_NS_10IInterfaceE;
- _ZTCN7android2os16BpServiceManagerE0_NS_11BpInterfaceINS0_15IServiceManagerEEE;
- _ZTCN7android2os16BpServiceManagerE8_NS_9BpRefBaseE;
- _ZTCN7android2os16IServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BnServiceCallbackE0_NS_11BnInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BnServiceCallbackE8_NS_7BBinderE;
- _ZTCN7android2os17BnServiceCallbackE8_NS_7IBinderE;
- _ZTCN7android2os17BpServiceCallbackE0_NS0_16IServiceCallbackE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;
- _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;
- _ZTCN7android2os17BpServiceCallbackE8_NS_9BpRefBaseE;
- _ZTCN7android7BBinderE0_NS_7IBinderE;
- _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_11BnInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE8_NS_7BBinderE;
- _ZTCN7android7content2pm22BnPackageManagerNativeE8_NS_7IBinderE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS_11BpInterfaceINS1_21IPackageManagerNativeEEE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE0_NS1_21IPackageManagerNativeE;
- _ZTCN7android7content2pm22BpPackageManagerNativeE8_NS_9BpRefBaseE;
- _ZTCN7android7content2pm22IPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS_11BnInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE8_NS_7BBinderE;
- _ZTCN7android7content2pm23BnPackageChangeObserverE8_NS_7IBinderE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_10IInterfaceE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS_11BpInterfaceINS1_22IPackageChangeObserverEEE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE0_NS1_22IPackageChangeObserverE;
- _ZTCN7android7content2pm23BpPackageChangeObserverE8_NS_9BpRefBaseE;
- _ZTCN7android7IMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BnMemoryE0_NS_11BnInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BnMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BnMemoryE8_NS_7BBinderE;
- _ZTCN7android8BnMemoryE8_NS_7IBinderE;
- _ZTCN7android8BpBinderE0_NS_7IBinderE;
- _ZTCN7android8BpMemoryE0_NS_10IInterfaceE;
- _ZTCN7android8BpMemoryE0_NS_11BpInterfaceINS_7IMemoryEEE;
- _ZTCN7android8BpMemoryE0_NS_7IMemoryE;
- _ZTCN7android8BpMemoryE8_NS_9BpRefBaseE;
- _ZTCN7android9HeapCacheE0_NS_7IBinder14DeathRecipientE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE;
- _ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE;
- _ZThn8_N7android10AllocationD0Ev;
- _ZThn8_N7android10AllocationD1Ev;
- _ZThn8_N7android10MemoryBaseD0Ev;
- _ZThn8_N7android10MemoryBaseD1Ev;
- _ZThn8_N7android12BnMemoryHeap10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android12BnMemoryHeapD0Ev;
- _ZThn8_N7android12BnMemoryHeapD1Ev;
- _ZThn8_N7android12BpMemoryHeapD0Ev;
- _ZThn8_N7android12BpMemoryHeapD1Ev;
- _ZThn8_N7android15BnShellCallback10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android16BnResultReceiver10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android2os16BnClientCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android2os16BnServiceManager10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android2os17BnServiceCallback10onTransactEjRKNS_6ParcelEPS2_j;
- _ZThn8_N7android7content2pm22BnPackageManagerNative10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn8_N7android7content2pm23BnPackageChangeObserver10onTransactEjRKNS_6ParcelEPS3_j;
- _ZThn8_N7android8BnMemory10onTransactEjRKNS_6ParcelEPS1_j;
- _ZThn8_N7android8BnMemoryD0Ev;
- _ZThn8_N7android8BnMemoryD1Ev;
- _ZThn8_N7android8BpMemoryD0Ev;
- _ZThn8_N7android8BpMemoryD1Ev;
- _ZTTN7android10AllocationE;
- _ZTTN7android10IInterfaceE;
- _ZTTN7android10MemoryBaseE;
- _ZTTN7android10PoolThreadE;
- _ZTTN7android10RpcSessionE;
- _ZTTN7android11IMemoryHeapE;
- _ZTTN7android12BnMemoryHeapE;
- _ZTTN7android12BpMemoryHeapE;
- _ZTTN7android12ProcessStateE;
- _ZTTN7android14IShellCallbackE;
- _ZTTN7android14MemoryHeapBaseE;
- _ZTTN7android15BnShellCallbackE;
- _ZTTN7android15BpShellCallbackE;
- _ZTTN7android15IResultReceiverE;
- _ZTTN7android15IServiceManagerE;
- _ZTTN7android16BnResultReceiverE;
- _ZTTN7android16BpResultReceiverE;
- _ZTTN7android18ServiceManagerShimE;
- _ZTTN7android2os15IClientCallbackE;
- _ZTTN7android2os15IServiceManagerE;
- _ZTTN7android2os16BnClientCallbackE;
- _ZTTN7android2os16BnServiceManagerE;
- _ZTTN7android2os16BpClientCallbackE;
- _ZTTN7android2os16BpServiceManagerE;
- _ZTTN7android2os16IServiceCallbackE;
- _ZTTN7android2os17BnServiceCallbackE;
- _ZTTN7android2os17BpServiceCallbackE;
- _ZTTN7android7BBinderE;
- _ZTTN7android7content2pm21IPackageManagerNativeE;
- _ZTTN7android7content2pm22BnPackageManagerNativeE;
- _ZTTN7android7content2pm22BpPackageManagerNativeE;
- _ZTTN7android7content2pm22IPackageChangeObserverE;
- _ZTTN7android7content2pm23BnPackageChangeObserverE;
- _ZTTN7android7content2pm23BpPackageChangeObserverE;
- _ZTTN7android7IBinderE;
- _ZTTN7android7IMemoryE;
- _ZTTN7android8BnMemoryE;
- _ZTTN7android8BpBinderE;
- _ZTTN7android8BpMemoryE;
- _ZTTN7android9BpRefBaseE;
- _ZTTN7android9HeapCacheE;
- _ZTTN7android9RpcServerE;
- _ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
- _ZTv0_n24_N7android10AllocationD0Ev;
- _ZTv0_n24_N7android10AllocationD1Ev;
- _ZTv0_n24_N7android10IInterfaceD0Ev;
- _ZTv0_n24_N7android10IInterfaceD1Ev;
- _ZTv0_n24_N7android10MemoryBaseD0Ev;
- _ZTv0_n24_N7android10MemoryBaseD1Ev;
- _ZTv0_n24_N7android10RpcSessionD0Ev;
- _ZTv0_n24_N7android10RpcSessionD1Ev;
- _ZTv0_n24_N7android11IMemoryHeapD0Ev;
- _ZTv0_n24_N7android11IMemoryHeapD1Ev;
- _ZTv0_n24_N7android12BnMemoryHeapD0Ev;
- _ZTv0_n24_N7android12BnMemoryHeapD1Ev;
- _ZTv0_n24_N7android12BpMemoryHeapD0Ev;
- _ZTv0_n24_N7android12BpMemoryHeapD1Ev;
- _ZTv0_n24_N7android12ProcessStateD0Ev;
- _ZTv0_n24_N7android12ProcessStateD1Ev;
- _ZTv0_n24_N7android14IShellCallbackD0Ev;
- _ZTv0_n24_N7android14IShellCallbackD1Ev;
- _ZTv0_n24_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n24_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n24_N7android15IResultReceiverD0Ev;
- _ZTv0_n24_N7android15IResultReceiverD1Ev;
- _ZTv0_n24_N7android15IServiceManagerD0Ev;
- _ZTv0_n24_N7android15IServiceManagerD1Ev;
- _ZTv0_n24_N7android2os15IClientCallbackD0Ev;
- _ZTv0_n24_N7android2os15IClientCallbackD1Ev;
- _ZTv0_n24_N7android2os15IServiceManagerD0Ev;
- _ZTv0_n24_N7android2os15IServiceManagerD1Ev;
- _ZTv0_n24_N7android2os16IServiceCallbackD0Ev;
- _ZTv0_n24_N7android2os16IServiceCallbackD1Ev;
- _ZTv0_n24_N7android7BBinderD0Ev;
- _ZTv0_n24_N7android7BBinderD1Ev;
- _ZTv0_n24_N7android7content2pm21IPackageManagerNativeD0Ev;
- _ZTv0_n24_N7android7content2pm21IPackageManagerNativeD1Ev;
- _ZTv0_n24_N7android7content2pm22IPackageChangeObserverD0Ev;
- _ZTv0_n24_N7android7content2pm22IPackageChangeObserverD1Ev;
- _ZTv0_n24_N7android7IBinderD0Ev;
- _ZTv0_n24_N7android7IBinderD1Ev;
- _ZTv0_n24_N7android7IMemoryD0Ev;
- _ZTv0_n24_N7android7IMemoryD1Ev;
- _ZTv0_n24_N7android8BnMemoryD0Ev;
- _ZTv0_n24_N7android8BnMemoryD1Ev;
- _ZTv0_n24_N7android8BpBinderD0Ev;
- _ZTv0_n24_N7android8BpBinderD1Ev;
- _ZTv0_n24_N7android8BpMemoryD0Ev;
- _ZTv0_n24_N7android8BpMemoryD1Ev;
- _ZTv0_n24_N7android9BpRefBaseD0Ev;
- _ZTv0_n24_N7android9BpRefBaseD1Ev;
- _ZTv0_n24_N7android9HeapCacheD0Ev;
- _ZTv0_n24_N7android9HeapCacheD1Ev;
- _ZTv0_n24_N7android9RpcServerD0Ev;
- _ZTv0_n24_N7android9RpcServerD1Ev;
- _ZTv0_n32_N7android14MemoryHeapBaseD0Ev;
- _ZTv0_n32_N7android14MemoryHeapBaseD1Ev;
- _ZTv0_n32_N7android8BpBinder10onFirstRefEv;
- _ZTv0_n32_N7android9BpRefBase10onFirstRefEv;
- _ZTv0_n40_N7android8BpBinder15onLastStrongRefEPKv;
- _ZTv0_n40_N7android9BpRefBase15onLastStrongRefEPKv;
- _ZTv0_n48_N7android8BpBinder20onIncStrongAttemptedEjPKv;
- _ZTv0_n48_N7android9BpRefBase20onIncStrongAttemptedEjPKv;
- _ZTv0_n56_NK7android14MemoryHeapBase9getHeapIDEv;
- _ZTv0_n64_NK7android14MemoryHeapBase7getBaseEv;
- _ZTv0_n72_NK7android14MemoryHeapBase7getSizeEv;
- _ZTv0_n80_NK7android14MemoryHeapBase8getFlagsEv;
- _ZTv0_n88_NK7android14MemoryHeapBase9getOffsetEv;
- _ZTVN7android10AllocationE;
- _ZTVN7android10IInterfaceE;
- _ZTVN7android10MemoryBaseE;
- _ZTVN7android10PoolThreadE;
- _ZTVN7android10RpcSession13RpcConnectionE;
- _ZTVN7android10RpcSessionE;
- _ZTVN7android10TextOutputE;
- _ZTVN7android11IMemoryHeapE;
- _ZTVN7android12BnMemoryHeapE;
- _ZTVN7android12BpMemoryHeapE;
- _ZTVN7android12FdTextOutputE;
- _ZTVN7android12MemoryDealerE;
- _ZTVN7android12ProcessStateE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tINS_2wpINS_7IBinderEEENS_9HeapCache11heap_info_tEEEEE;
- _ZTVN7android12SortedVectorINS_16key_value_pair_tIPKvNS_8BpBinder13ObjectManager7entry_tEEEEE;
- _ZTVN7android13LogTextOutputE;
- _ZTVN7android14IShellCallbackE;
- _ZTVN7android14MemoryHeapBaseE;
- _ZTVN7android15BnShellCallbackE;
- _ZTVN7android15BpShellCallbackE;
- _ZTVN7android15IResultReceiverE;
- _ZTVN7android15IServiceManagerE;
- _ZTVN7android16BnResultReceiverE;
- _ZTVN7android16BpResultReceiverE;
- _ZTVN7android17InetSocketAddressE;
- _ZTVN7android17UnixSocketAddressE;
- _ZTVN7android18BufferedTextOutput11BufferStateE;
- _ZTVN7android18BufferedTextOutputE;
- _ZTVN7android18ServiceManagerShimE;
- _ZTVN7android18VsockSocketAddressE;
- _ZTVN7android2os15IClientCallbackE;
- _ZTVN7android2os15IServiceManagerE;
- _ZTVN7android2os16BnClientCallbackE;
- _ZTVN7android2os16BnServiceManagerE;
- _ZTVN7android2os16BpClientCallbackE;
- _ZTVN7android2os16BpServiceManagerE;
- _ZTVN7android2os16IServiceCallbackE;
- _ZTVN7android2os16ParcelableHolderE;
- _ZTVN7android2os16ServiceDebugInfoE;
- _ZTVN7android2os17BnServiceCallbackE;
- _ZTVN7android2os17BpServiceCallbackE;
- _ZTVN7android2os17PersistableBundleE;
- _ZTVN7android2os20ParcelFileDescriptorE;
- _ZTVN7android6VectorIiEE;
- _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;
- _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE;
- _ZTVN7android6VectorINS_8BpBinder8ObituaryEEE;
- _ZTVN7android6VectorINS_8String16EEE;
- _ZTVN7android6VectorIPNS_7BBinderEEE;
- _ZTVN7android6VectorIPNS_7RefBase12weakref_typeEEE;
- _ZTVN7android6VectorIPNS_7RefBaseEEE;
- _ZTVN7android7BBinderE;
- _ZTVN7android7content2pm18PackageChangeEventE;
- _ZTVN7android7content2pm21IPackageManagerNativeE;
- _ZTVN7android7content2pm22BnPackageManagerNativeE;
- _ZTVN7android7content2pm22BpPackageManagerNativeE;
- _ZTVN7android7content2pm22IPackageChangeObserverE;
- _ZTVN7android7content2pm23BnPackageChangeObserverE;
- _ZTVN7android7content2pm23BpPackageChangeObserverE;
- _ZTVN7android7IBinderE;
- _ZTVN7android7IMemoryE;
- _ZTVN7android8BnMemoryE;
- _ZTVN7android8BpBinderE;
- _ZTVN7android8BpMemoryE;
- _ZTVN7android9BpRefBaseE;
- _ZTVN7android9HeapCacheE;
- _ZTVN7android9RpcServerE;
- _ZTvn8_n32_N7android14MemoryHeapBaseD0Ev;
- _ZTvn8_n32_N7android14MemoryHeapBaseD1Ev;
- local:
- *;
-};
diff --git a/libs/binder/libbinder.map b/libs/binder/libbinder.map
new file mode 100644
index 0000000..9ca14bc
--- /dev/null
+++ b/libs/binder/libbinder.map
@@ -0,0 +1,5 @@
+# b/190148312: Populate with correct list of ABI symbols
+LIBBINDER {
+ global:
+ *;
+};
diff --git a/libs/binder/libbinder_rpc_unstable.cpp b/libs/binder/libbinder_rpc_unstable.cpp
new file mode 100644
index 0000000..68ec669
--- /dev/null
+++ b/libs/binder/libbinder_rpc_unstable.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <android/binder_libbinder.h>
+#include <binder/RpcServer.h>
+#include <binder/RpcSession.h>
+
+using android::RpcServer;
+using android::RpcSession;
+
+extern "C" {
+
+bool RunRpcServer(AIBinder* service, unsigned int port) {
+ auto server = RpcServer::make();
+ server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ if (!server->setupVsockServer(port)) {
+ LOG(ERROR) << "Failed to set up vsock server with port " << port;
+ return false;
+ }
+ server->setRootObject(AIBinder_toPlatformBinder(service));
+ server->join();
+
+ // Shutdown any open sessions since server failed.
+ (void)server->shutdown();
+ return true;
+}
+
+AIBinder* RpcClient(unsigned int cid, unsigned int port) {
+ auto session = RpcSession::make();
+ if (!session->setupVsockClient(cid, port)) {
+ LOG(ERROR) << "Failed to set up vsock client with CID " << cid << " and port " << port;
+ return nullptr;
+ }
+ return AIBinder_fromPlatformBinder(session->getRootObject());
+}
+}
diff --git a/libs/binder/libbinder_rpc_unstable.map.txt b/libs/binder/libbinder_rpc_unstable.map.txt
new file mode 100644
index 0000000..3921a4d
--- /dev/null
+++ b/libs/binder/libbinder_rpc_unstable.map.txt
@@ -0,0 +1,7 @@
+LIBBINDER_RPC_UNSTABLE_SHIM { # platform-only
+ global:
+ RunRpcServer;
+ RpcClient;
+ local:
+ *;
+};
diff --git a/libs/binder/ndk/ibinder.cpp b/libs/binder/ndk/ibinder.cpp
index 1dcb41b..785e032 100644
--- a/libs/binder/ndk/ibinder.cpp
+++ b/libs/binder/ndk/ibinder.cpp
@@ -47,7 +47,8 @@
void clean(const void* /*id*/, void* /*obj*/, void* /*cookie*/){/* do nothing */};
static void attach(const sp<IBinder>& binder) {
- binder->attachObject(kId, kValue, nullptr /*cookie*/, clean);
+ // can only attach once
+ CHECK_EQ(nullptr, binder->attachObject(kId, kValue, nullptr /*cookie*/, clean));
}
static bool has(const sp<IBinder>& binder) {
return binder != nullptr && binder->findObject(kId) == kValue;
@@ -57,7 +58,6 @@
namespace ABpBinderTag {
-static std::mutex gLock;
static const void* kId = "ABpBinder";
struct Value {
wp<ABpBinder> binder;
@@ -232,19 +232,16 @@
ABpBinder::~ABpBinder() {}
void ABpBinder::onLastStrongRef(const void* id) {
- {
- std::lock_guard<std::mutex> lock(ABpBinderTag::gLock);
- // Since ABpBinder is OBJECT_LIFETIME_WEAK, we must remove this weak reference in order for
- // the ABpBinder to be deleted. Since a strong reference to this ABpBinder object should no
- // longer be able to exist at the time of this method call, there is no longer a need to
- // recover it.
+ // Since ABpBinder is OBJECT_LIFETIME_WEAK, we must remove this weak reference in order for
+ // the ABpBinder to be deleted. Even though we have no more references on the ABpBinder
+ // (BpRefBase), the remote object may still exist (for instance, if we
+ // receive it from another process, before the ABpBinder is attached).
- ABpBinderTag::Value* value =
- static_cast<ABpBinderTag::Value*>(remote()->findObject(ABpBinderTag::kId));
- if (value != nullptr) {
- value->binder = nullptr;
- }
- }
+ ABpBinderTag::Value* value =
+ static_cast<ABpBinderTag::Value*>(remote()->findObject(ABpBinderTag::kId));
+ CHECK_NE(nullptr, value) << "ABpBinder must always be attached";
+
+ remote()->withLock([&]() { value->binder = nullptr; });
BpRefBase::onLastStrongRef(id);
}
@@ -259,21 +256,29 @@
// The following code ensures that for a given binder object (remote or local), if it is not an
// ABBinder then at most one ABpBinder object exists in a given process representing it.
- std::lock_guard<std::mutex> lock(ABpBinderTag::gLock);
- ABpBinderTag::Value* value =
- static_cast<ABpBinderTag::Value*>(binder->findObject(ABpBinderTag::kId));
+ auto* value = static_cast<ABpBinderTag::Value*>(binder->findObject(ABpBinderTag::kId));
if (value == nullptr) {
value = new ABpBinderTag::Value;
- binder->attachObject(ABpBinderTag::kId, static_cast<void*>(value), nullptr /*cookie*/,
- ABpBinderTag::clean);
+ auto oldValue = static_cast<ABpBinderTag::Value*>(
+ binder->attachObject(ABpBinderTag::kId, static_cast<void*>(value),
+ nullptr /*cookie*/, ABpBinderTag::clean));
+
+ // allocated by another thread
+ if (oldValue) {
+ delete value;
+ value = oldValue;
+ }
}
- sp<ABpBinder> ret = value->binder.promote();
- if (ret == nullptr) {
- ret = new ABpBinder(binder);
- value->binder = ret;
- }
+ sp<ABpBinder> ret;
+ binder->withLock([&]() {
+ ret = value->binder.promote();
+ if (ret == nullptr) {
+ ret = sp<ABpBinder>::make(binder);
+ value->binder = ret;
+ }
+ });
return ret;
}
diff --git a/libs/binder/ndk/ibinder_internal.h b/libs/binder/ndk/ibinder_internal.h
index 6824306..3b515ab 100644
--- a/libs/binder/ndk/ibinder_internal.h
+++ b/libs/binder/ndk/ibinder_internal.h
@@ -105,6 +105,7 @@
ABpBinder* asABpBinder() override { return this; }
private:
+ friend android::sp<ABpBinder>;
explicit ABpBinder(const ::android::sp<::android::IBinder>& binder);
};
diff --git a/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h b/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h
index 83190aa..5092d87 100644
--- a/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h
+++ b/libs/binder/ndk/include_cpp/android/binder_parcel_utils.h
@@ -910,6 +910,9 @@
if (err != STATUS_OK) return err;
if (size < 0) return STATUS_UNEXPECTED_NULL;
+ // TODO(b/188215728): delegate to libbinder_ndk
+ if (size > 1000000) return STATUS_NO_MEMORY;
+
vec->resize(static_cast<size_t>(size));
return STATUS_OK;
}
@@ -931,6 +934,9 @@
return STATUS_OK;
}
+ // TODO(b/188215728): delegate to libbinder_ndk
+ if (size > 1000000) return STATUS_NO_MEMORY;
+
*vec = std::optional<std::vector<T>>(std::vector<T>{});
(*vec)->resize(static_cast<size_t>(size));
return STATUS_OK;
diff --git a/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h b/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h
index 2277148..aa3b978 100644
--- a/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h
+++ b/libs/binder/ndk/include_cpp/android/binder_parcelable_utils.h
@@ -46,7 +46,7 @@
AParcelableHolder() = delete;
explicit AParcelableHolder(parcelable_stability_t stability)
: mParcel(AParcel_create()), mStability(stability) {}
-
+ AParcelableHolder(AParcelableHolder&& other) = default;
virtual ~AParcelableHolder() = default;
binder_status_t writeToParcel(AParcel* parcel) const {
diff --git a/libs/binder/ndk/include_platform/android/binder_parcel_platform.h b/libs/binder/ndk/include_platform/android/binder_parcel_platform.h
index 6372449..b24094e 100644
--- a/libs/binder/ndk/include_platform/android/binder_parcel_platform.h
+++ b/libs/binder/ndk/include_platform/android/binder_parcel_platform.h
@@ -33,7 +33,6 @@
#endif
-#if !defined(__ANDROID_APEX__)
/**
* Data written to the parcel will be zero'd before being deleted or realloced.
*
@@ -44,6 +43,5 @@
* \param parcel The parcel to clear associated data from.
*/
void AParcel_markSensitive(const AParcel* parcel);
-#endif
__END_DECLS
diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt
index 7d4b82e..685ebb5 100644
--- a/libs/binder/ndk/libbinder_ndk.map.txt
+++ b/libs/binder/ndk/libbinder_ndk.map.txt
@@ -117,7 +117,7 @@
ABinderProcess_setupPolling; # apex
AIBinder_getCallingSid; # apex
AIBinder_setRequestingSid; # apex
- AParcel_markSensitive; # llndk
+ AParcel_markSensitive; # systemapi llndk
AServiceManager_forEachDeclaredInstance; # apex llndk
AServiceManager_forceLazyServicesPersist; # llndk
AServiceManager_isDeclared; # apex llndk
diff --git a/libs/binder/ndk/parcel.cpp b/libs/binder/ndk/parcel.cpp
index ec7c7d8..b2f21c7 100644
--- a/libs/binder/ndk/parcel.cpp
+++ b/libs/binder/ndk/parcel.cpp
@@ -46,7 +46,8 @@
template <typename T>
using ArraySetter = void (*)(void* arrayData, size_t index, T value);
-binder_status_t WriteAndValidateArraySize(AParcel* parcel, bool isNullArray, int32_t length) {
+static binder_status_t WriteAndValidateArraySize(AParcel* parcel, bool isNullArray,
+ int32_t length) {
// only -1 can be used to represent a null array
if (length < -1) return STATUS_BAD_VALUE;
@@ -61,12 +62,24 @@
Parcel* rawParcel = parcel->get();
- status_t status = rawParcel->writeInt32(static_cast<int32_t>(length));
+ status_t status = rawParcel->writeInt32(length);
if (status != STATUS_OK) return PruneStatusT(status);
return STATUS_OK;
}
+static binder_status_t ReadAndValidateArraySize(const AParcel* parcel, int32_t* length) {
+ if (status_t status = parcel->get()->readInt32(length); status != STATUS_OK) {
+ return PruneStatusT(status);
+ }
+
+ if (*length < -1) return STATUS_BAD_VALUE; // libbinder_ndk reserves these
+ if (*length <= 0) return STATUS_OK; // null
+ if (static_cast<size_t>(*length) > parcel->get()->dataAvail()) return STATUS_NO_MEMORY;
+
+ return STATUS_OK;
+}
+
template <typename T>
binder_status_t WriteArray(AParcel* parcel, const T* array, int32_t length) {
binder_status_t status = WriteAndValidateArraySize(parcel, array == nullptr, length);
@@ -111,10 +124,9 @@
const Parcel* rawParcel = parcel->get();
int32_t length;
- status_t status = rawParcel->readInt32(&length);
-
- if (status != STATUS_OK) return PruneStatusT(status);
- if (length < -1) return STATUS_BAD_VALUE;
+ if (binder_status_t status = ReadAndValidateArraySize(parcel, &length); status != STATUS_OK) {
+ return status;
+ }
T* array;
if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY;
@@ -140,10 +152,9 @@
const Parcel* rawParcel = parcel->get();
int32_t length;
- status_t status = rawParcel->readInt32(&length);
-
- if (status != STATUS_OK) return PruneStatusT(status);
- if (length < -1) return STATUS_BAD_VALUE;
+ if (binder_status_t status = ReadAndValidateArraySize(parcel, &length); status != STATUS_OK) {
+ return status;
+ }
char16_t* array;
if (!allocator(arrayData, length, &array)) return STATUS_NO_MEMORY;
@@ -155,7 +166,7 @@
if (__builtin_smul_overflow(sizeof(char16_t), length, &size)) return STATUS_NO_MEMORY;
for (int32_t i = 0; i < length; i++) {
- status = rawParcel->readChar(array + i);
+ status_t status = rawParcel->readChar(array + i);
if (status != STATUS_OK) return PruneStatusT(status);
}
@@ -189,10 +200,9 @@
const Parcel* rawParcel = parcel->get();
int32_t length;
- status_t status = rawParcel->readInt32(&length);
-
- if (status != STATUS_OK) return PruneStatusT(status);
- if (length < -1) return STATUS_BAD_VALUE;
+ if (binder_status_t status = ReadAndValidateArraySize(parcel, &length); status != STATUS_OK) {
+ return status;
+ }
if (!allocator(arrayData, length)) return STATUS_NO_MEMORY;
@@ -200,7 +210,7 @@
for (int32_t i = 0; i < length; i++) {
T readTarget;
- status = (rawParcel->*read)(&readTarget);
+ status_t status = (rawParcel->*read)(&readTarget);
if (status != STATUS_OK) return PruneStatusT(status);
setter(arrayData, i, readTarget);
@@ -402,13 +412,10 @@
binder_status_t AParcel_readStringArray(const AParcel* parcel, void* arrayData,
AParcel_stringArrayAllocator allocator,
AParcel_stringArrayElementAllocator elementAllocator) {
- const Parcel* rawParcel = parcel->get();
-
int32_t length;
- status_t status = rawParcel->readInt32(&length);
-
- if (status != STATUS_OK) return PruneStatusT(status);
- if (length < -1) return STATUS_BAD_VALUE;
+ if (binder_status_t status = ReadAndValidateArraySize(parcel, &length); status != STATUS_OK) {
+ return status;
+ }
if (!allocator(arrayData, length)) return STATUS_NO_MEMORY;
@@ -449,13 +456,10 @@
binder_status_t AParcel_readParcelableArray(const AParcel* parcel, void* arrayData,
AParcel_parcelableArrayAllocator allocator,
AParcel_readParcelableElement elementReader) {
- const Parcel* rawParcel = parcel->get();
-
int32_t length;
- status_t status = rawParcel->readInt32(&length);
-
- if (status != STATUS_OK) return PruneStatusT(status);
- if (length < -1) return STATUS_BAD_VALUE;
+ if (binder_status_t status = ReadAndValidateArraySize(parcel, &length); status != STATUS_OK) {
+ return status;
+ }
if (!allocator(arrayData, length)) return STATUS_NO_MEMORY;
diff --git a/libs/binder/ndk/tests/Android.bp b/libs/binder/ndk/tests/Android.bp
index ede4873..488009f 100644
--- a/libs/binder/ndk/tests/Android.bp
+++ b/libs/binder/ndk/tests/Android.bp
@@ -73,7 +73,10 @@
"IBinderNdkUnitTest-cpp",
"IBinderNdkUnitTest-ndk_platform",
],
- test_suites: ["general-tests", "vts"],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
require_root: true,
}
@@ -115,4 +118,12 @@
"IBinderNdkUnitTest.aidl",
"IEmpty.aidl",
],
+ backend: {
+ java: {
+ enabled: false,
+ },
+ ndk: {
+ apps_enabled: false,
+ },
+ },
}
diff --git a/libs/binder/ndk/tests/IBinderNdkUnitTest.aidl b/libs/binder/ndk/tests/IBinderNdkUnitTest.aidl
index ecbd649..a626d39 100644
--- a/libs/binder/ndk/tests/IBinderNdkUnitTest.aidl
+++ b/libs/binder/ndk/tests/IBinderNdkUnitTest.aidl
@@ -21,6 +21,7 @@
import IEmpty;
+@SensitiveData
interface IBinderNdkUnitTest {
int repeatInt(int a);
diff --git a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
index 62db3cf..ce12ccf 100644
--- a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
+++ b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
@@ -39,6 +39,7 @@
#include <condition_variable>
#include <iostream>
#include <mutex>
+#include <thread>
#include "android/binder_ibinder.h"
using namespace android;
@@ -270,6 +271,27 @@
EXPECT_EQ(2, out);
}
+TEST(NdkBinder, GetTestServiceStressTest) {
+ // libbinder has some complicated logic to make sure only one instance of
+ // ABpBinder is associated with each binder.
+
+ constexpr size_t kNumThreads = 10;
+ constexpr size_t kNumCalls = 1000;
+ std::vector<std::thread> threads;
+
+ for (size_t i = 0; i < kNumThreads; i++) {
+ threads.push_back(std::thread([&]() {
+ for (size_t j = 0; j < kNumCalls; j++) {
+ auto binder =
+ ndk::SpAIBinder(AServiceManager_checkService(IFoo::kSomeInstanceName));
+ EXPECT_EQ(STATUS_OK, AIBinder_ping(binder.get()));
+ }
+ }));
+ }
+
+ for (auto& thread : threads) thread.join();
+}
+
void defaultInstanceCounter(const char* instance, void* context) {
if (strcmp(instance, "default") == 0) {
++*(size_t*)(context);
diff --git a/libs/binder/rust/Android.bp b/libs/binder/rust/Android.bp
index 49d3401..8d27eed 100644
--- a/libs/binder/rust/Android.bp
+++ b/libs/binder/rust/Android.bp
@@ -26,6 +26,7 @@
},
apex_available: [
"//apex_available:platform",
+ "com.android.compos",
"com.android.virt",
],
}
@@ -48,6 +49,7 @@
},
apex_available: [
"//apex_available:platform",
+ "com.android.compos",
"com.android.virt",
],
lints: "none",
@@ -99,6 +101,22 @@
},
apex_available: [
"//apex_available:platform",
+ "com.android.compos",
+ "com.android.virt",
+ ],
+}
+
+// TODO(b/184872979): remove once the Rust API is created.
+rust_bindgen {
+ name: "libbinder_rpc_unstable_bindgen",
+ wrapper_src: "src/binder_rpc_unstable.hpp",
+ crate_name: "binder_rpc_unstable_bindgen",
+ source_stem: "bindings",
+ shared_libs: [
+ "libutils",
+ ],
+ apex_available: [
+ "com.android.compos",
"com.android.virt",
],
}
diff --git a/libs/binder/rust/src/binder.rs b/libs/binder/rust/src/binder.rs
index 695a83e..dd0c7b8 100644
--- a/libs/binder/rust/src/binder.rs
+++ b/libs/binder/rust/src/binder.rs
@@ -25,6 +25,7 @@
use std::cmp::Ordering;
use std::ffi::{c_void, CStr, CString};
use std::fmt;
+use std::fs::File;
use std::marker::PhantomData;
use std::ops::Deref;
use std::os::raw::c_char;
@@ -49,11 +50,19 @@
/// interfaces) must implement this trait.
///
/// This is equivalent `IInterface` in C++.
-pub trait Interface: Send {
+pub trait Interface: Send + Sync {
/// Convert this binder object into a generic [`SpIBinder`] reference.
fn as_binder(&self) -> SpIBinder {
panic!("This object was not a Binder object and cannot be converted into an SpIBinder.")
}
+
+ /// Dump transaction handler for this Binder object.
+ ///
+ /// This handler is a no-op by default and should be implemented for each
+ /// Binder service struct that wishes to respond to dump transactions.
+ fn dump(&self, _file: &File, _args: &[&CStr]) -> Result<()> {
+ Ok(())
+ }
}
/// Interface stability promise
@@ -98,6 +107,10 @@
/// `reply` may be [`None`] if the sender does not expect a reply.
fn on_transact(&self, code: TransactionCode, data: &Parcel, reply: &mut Parcel) -> Result<()>;
+ /// Handle a request to invoke the dump transaction on this
+ /// object.
+ fn on_dump(&self, file: &File, args: &[&CStr]) -> Result<()>;
+
/// Retrieve the class of this remote object.
///
/// This method should always return the same InterfaceClass for the same
@@ -218,7 +231,7 @@
if class.is_null() {
panic!("Expected non-null class pointer from AIBinder_Class_define!");
}
- sys::AIBinder_Class_setOnDump(class, None);
+ sys::AIBinder_Class_setOnDump(class, Some(I::on_dump));
sys::AIBinder_Class_setHandleShellCommand(class, None);
class
};
@@ -492,6 +505,16 @@
/// returned by `on_create` for this class. This function takes ownership of
/// the provided pointer and destroys it.
unsafe extern "C" fn on_destroy(object: *mut c_void);
+
+ /// Called to handle the `dump` transaction.
+ ///
+ /// # Safety
+ ///
+ /// Must be called with a non-null, valid pointer to a local `AIBinder` that
+ /// contains a `T` pointer in its user data. fd should be a non-owned file
+ /// descriptor, and args must be an array of null-terminated string
+ /// poiinters with length num_args.
+ unsafe extern "C" fn on_dump(binder: *mut sys::AIBinder, fd: i32, args: *mut *const c_char, num_args: u32) -> status_t;
}
/// Interface for transforming a generic SpIBinder into a specific remote
@@ -778,6 +801,10 @@
}
}
+ fn on_dump(&self, file: &std::fs::File, args: &[&std::ffi::CStr]) -> $crate::Result<()> {
+ self.0.dump(file, args)
+ }
+
fn get_class() -> $crate::InterfaceClass {
static CLASS_INIT: std::sync::Once = std::sync::Once::new();
static mut CLASS: Option<$crate::InterfaceClass> = None;
@@ -870,7 +897,7 @@
#[macro_export]
macro_rules! declare_binder_enum {
{
- $enum:ident : $backing:ty {
+ $enum:ident : [$backing:ty; $size:expr] {
$( $name:ident = $value:expr, )*
}
} => {
@@ -878,6 +905,11 @@
pub struct $enum(pub $backing);
impl $enum {
$( pub const $name: Self = Self($value); )*
+
+ #[inline(always)]
+ pub const fn enum_values() -> [Self; $size] {
+ [$(Self::$name),*]
+ }
}
impl $crate::parcel::Serialize for $enum {
diff --git a/libs/binder/rust/src/binder_rpc_unstable.hpp b/libs/binder/rust/src/binder_rpc_unstable.hpp
new file mode 100644
index 0000000..7932d0f
--- /dev/null
+++ b/libs/binder/rust/src/binder_rpc_unstable.hpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+extern "C" {
+
+struct AIBinder;
+
+bool RunRpcServer(AIBinder* service, unsigned int port);
+AIBinder* RpcClient(unsigned int cid, unsigned int port);
+
+}
diff --git a/libs/binder/rust/src/lib.rs b/libs/binder/rust/src/lib.rs
index 2694cba..cb330a6 100644
--- a/libs/binder/rust/src/lib.rs
+++ b/libs/binder/rust/src/lib.rs
@@ -115,14 +115,21 @@
pub use native::add_service;
pub use native::Binder;
pub use parcel::Parcel;
-pub use proxy::{get_interface, get_service};
+pub use proxy::{get_interface, get_service, wait_for_interface, wait_for_service};
pub use proxy::{AssociateClass, DeathRecipient, Proxy, SpIBinder, WpIBinder};
pub use state::{ProcessState, ThreadState};
+/// Unstable, in-development API that only allowlisted clients are allowed to use.
+pub mod unstable_api {
+ pub use crate::binder::AsNative;
+ pub use crate::proxy::unstable_api::new_spibinder;
+ pub use crate::sys::AIBinder;
+}
+
/// The public API usable outside AIDL-generated interface crates.
pub mod public_api {
pub use super::parcel::ParcelFileDescriptor;
- pub use super::{add_service, get_interface};
+ pub use super::{add_service, get_interface, wait_for_interface};
pub use super::{
BinderFeatures, DeathRecipient, ExceptionCode, IBinder, Interface, ProcessState, SpIBinder,
Status, StatusCode, Strong, ThreadState, Weak, WpIBinder,
diff --git a/libs/binder/rust/src/native.rs b/libs/binder/rust/src/native.rs
index 3920129..a0dfeec 100644
--- a/libs/binder/rust/src/native.rs
+++ b/libs/binder/rust/src/native.rs
@@ -21,9 +21,13 @@
use crate::sys;
use std::convert::TryFrom;
-use std::ffi::{c_void, CString};
+use std::ffi::{c_void, CStr, CString};
+use std::fs::File;
use std::mem::ManuallyDrop;
use std::ops::Deref;
+use std::os::raw::c_char;
+use std::os::unix::io::FromRawFd;
+use std::slice;
/// Rust wrapper around Binder remotable objects.
///
@@ -47,6 +51,25 @@
/// to how `Box<T>` is `Send` if `T` is `Send`.
unsafe impl<T: Remotable> Send for Binder<T> {}
+/// # Safety
+///
+/// A `Binder<T>` is a pair of unique owning pointers to two values:
+/// * a C++ ABBinder which is thread-safe, i.e. `Send + Sync`
+/// * a Rust object which implements `Remotable`; this trait requires `Send + Sync`
+///
+/// `ABBinder` contains an immutable `mUserData` pointer, which is actually a
+/// pointer to a boxed `T: Remotable`, which is `Sync`. `ABBinder` also contains
+/// a mutable pointer to its class, but mutation of this field is controlled by
+/// a mutex and it is only allowed to be set once, therefore we can concurrently
+/// access this field safely. `ABBinder` inherits from `BBinder`, which is also
+/// thread-safe. Thus `ABBinder` is thread-safe.
+///
+/// Both pointers are unique (never escape the `Binder<T>` object and are not copied)
+/// so we can essentially treat `Binder<T>` as a box-like containing the two objects;
+/// the box-like object inherits `Sync` from the two inner values, similarly
+/// to how `Box<T>` is `Sync` if `T` is `Sync`.
+unsafe impl<T: Remotable> Sync for Binder<T> {}
+
impl<T: Remotable> Binder<T> {
/// Create a new Binder remotable object with default stability
///
@@ -289,6 +312,37 @@
// object created by Box.
args
}
+
+ /// Called to handle the `dump` transaction.
+ ///
+ /// # Safety
+ ///
+ /// Must be called with a non-null, valid pointer to a local `AIBinder` that
+ /// contains a `T` pointer in its user data. fd should be a non-owned file
+ /// descriptor, and args must be an array of null-terminated string
+ /// poiinters with length num_args.
+ unsafe extern "C" fn on_dump(binder: *mut sys::AIBinder, fd: i32, args: *mut *const c_char, num_args: u32) -> status_t {
+ if fd < 0 {
+ return StatusCode::UNEXPECTED_NULL as status_t;
+ }
+ // We don't own this file, so we need to be careful not to drop it.
+ let file = ManuallyDrop::new(File::from_raw_fd(fd));
+
+ if args.is_null() {
+ return StatusCode::UNEXPECTED_NULL as status_t;
+ }
+ let args = slice::from_raw_parts(args, num_args as usize);
+ let args: Vec<_> = args.iter().map(|s| CStr::from_ptr(*s)).collect();
+
+ let object = sys::AIBinder_getUserData(binder);
+ let binder: &T = &*(object as *const T);
+ let res = binder.on_dump(&file, &args);
+
+ match res {
+ Ok(()) => 0,
+ Err(e) => e as status_t,
+ }
+ }
}
impl<T: Remotable> Drop for Binder<T> {
@@ -409,6 +463,10 @@
Ok(())
}
+ fn on_dump(&self, _file: &File, _args: &[&CStr]) -> Result<()> {
+ Ok(())
+ }
+
binder_fn_get_class!(Binder::<Self>);
}
diff --git a/libs/binder/rust/src/parcel.rs b/libs/binder/rust/src/parcel.rs
index 6c34824..a0e991c 100644
--- a/libs/binder/rust/src/parcel.rs
+++ b/libs/binder/rust/src/parcel.rs
@@ -184,11 +184,17 @@
}
}
+ /// Returns the total size of the parcel.
+ pub fn get_data_size(&self) -> i32 {
+ unsafe {
+ // Safety: `Parcel` always contains a valid pointer to an `AParcel`,
+ // and this call is otherwise safe.
+ sys::AParcel_getDataSize(self.as_native())
+ }
+ }
+
/// Move the current read/write position in the parcel.
///
- /// The new position must be a position previously returned by
- /// `self.get_data_position()`.
- ///
/// # Safety
///
/// This method is safe if `pos` is less than the current size of the parcel
@@ -219,6 +225,72 @@
D::deserialize(self)
}
+ /// Attempt to read a type that implements [`Deserialize`] from this
+ /// `Parcel` onto an existing value. This operation will overwrite the old
+ /// value partially or completely, depending on how much data is available.
+ pub fn read_onto<D: Deserialize>(&self, x: &mut D) -> Result<()> {
+ x.deserialize_from(self)
+ }
+
+ /// Safely read a sized parcelable.
+ ///
+ /// Read the size of a parcelable, compute the end position
+ /// of that parcelable, then build a sized readable sub-parcel
+ /// and call a closure with the sub-parcel as its parameter.
+ /// The closure can keep reading data from the sub-parcel
+ /// until it runs out of input data. The closure is responsible
+ /// for calling [`ReadableSubParcel::has_more_data`] to check for
+ /// more data before every read, at least until Rust generators
+ /// are stabilized.
+ /// After the closure returns, skip to the end of the current
+ /// parcelable regardless of how much the closure has read.
+ ///
+ /// # Examples
+ ///
+ /// ```no_run
+ /// let mut parcelable = Default::default();
+ /// parcel.sized_read(|subparcel| {
+ /// if subparcel.has_more_data() {
+ /// parcelable.a = subparcel.read()?;
+ /// }
+ /// if subparcel.has_more_data() {
+ /// parcelable.b = subparcel.read()?;
+ /// }
+ /// Ok(())
+ /// });
+ /// ```
+ ///
+ pub fn sized_read<F>(&self, mut f: F) -> Result<()>
+ where
+ for<'a> F: FnMut(ReadableSubParcel<'a>) -> Result<()>
+ {
+ let start = self.get_data_position();
+ let parcelable_size: i32 = self.read()?;
+ if parcelable_size < 0 {
+ return Err(StatusCode::BAD_VALUE);
+ }
+
+ let end = start.checked_add(parcelable_size)
+ .ok_or(StatusCode::BAD_VALUE)?;
+ if end > self.get_data_size() {
+ return Err(StatusCode::NOT_ENOUGH_DATA);
+ }
+
+ let subparcel = ReadableSubParcel {
+ parcel: self,
+ end_position: end,
+ };
+ f(subparcel)?;
+
+ // Advance the data position to the actual end,
+ // in case the closure read less data than was available
+ unsafe {
+ self.set_data_position(end)?;
+ }
+
+ Ok(())
+ }
+
/// Read a vector size from the `Parcel` and resize the given output vector
/// to be correctly sized for that amount of data.
///
@@ -264,6 +336,27 @@
}
}
+/// A segment of a readable parcel, used for [`Parcel::sized_read`].
+pub struct ReadableSubParcel<'a> {
+ parcel: &'a Parcel,
+ end_position: i32,
+}
+
+impl<'a> ReadableSubParcel<'a> {
+ /// Read a type that implements [`Deserialize`] from the sub-parcel.
+ pub fn read<D: Deserialize>(&self) -> Result<D> {
+ // The caller should have checked this,
+ // but it can't hurt to double-check
+ assert!(self.has_more_data());
+ D::deserialize(self.parcel)
+ }
+
+ /// Check if the sub-parcel has more data to read
+ pub fn has_more_data(&self) -> bool {
+ self.parcel.get_data_position() < self.end_position
+ }
+}
+
// Internal APIs
impl Parcel {
pub(crate) fn write_binder(&mut self, binder: Option<&SpIBinder>) -> Result<()> {
@@ -400,7 +493,7 @@
assert_eq!(parcel.read::<i32>().unwrap(), 15);
let start = parcel.get_data_position();
- assert_eq!(parcel.read::<bool>().unwrap(), true);
+ assert!(parcel.read::<bool>().unwrap());
unsafe {
assert!(parcel.set_data_position(start).is_ok());
diff --git a/libs/binder/rust/src/parcel/parcelable.rs b/libs/binder/rust/src/parcel/parcelable.rs
index f57788b..956ecfe 100644
--- a/libs/binder/rust/src/parcel/parcelable.rs
+++ b/libs/binder/rust/src/parcel/parcelable.rs
@@ -39,6 +39,14 @@
pub trait Deserialize: Sized {
/// Deserialize an instance from the given [`Parcel`].
fn deserialize(parcel: &Parcel) -> Result<Self>;
+
+ /// Deserialize an instance from the given [`Parcel`] onto the
+ /// current object. This operation will overwrite the old value
+ /// partially or completely, depending on how much data is available.
+ fn deserialize_from(&mut self, parcel: &Parcel) -> Result<()> {
+ *self = Self::deserialize(parcel)?;
+ Ok(())
+ }
}
/// Helper trait for types that can be serialized as arrays.
@@ -184,6 +192,14 @@
parcel.read().map(Some)
}
}
+
+ /// Deserialize an Option of this type from the given [`Parcel`] onto the
+ /// current object. This operation will overwrite the current value
+ /// partially or completely, depending on how much data is available.
+ fn deserialize_option_from(this: &mut Option<Self>, parcel: &Parcel) -> Result<()> {
+ *this = Self::deserialize_option(parcel)?;
+ Ok(())
+ }
}
/// Callback to allocate a vector for parcel array read functions.
@@ -677,6 +693,75 @@
fn deserialize(parcel: &Parcel) -> Result<Self> {
DeserializeOption::deserialize_option(parcel)
}
+
+ fn deserialize_from(&mut self, parcel: &Parcel) -> Result<()> {
+ DeserializeOption::deserialize_option_from(self, parcel)
+ }
+}
+
+/// Implement `Deserialize` trait and friends for a parcelable
+///
+/// This is an internal macro used by the AIDL compiler to implement
+/// `Deserialize`, `DeserializeArray` and `DeserializeOption` for
+/// structured parcelables. The target type must implement a
+/// `deserialize_parcelable` method with the following signature:
+/// ```no_run
+/// fn deserialize_parcelable(
+/// &mut self,
+/// parcel: &binder::parcel::Parcelable,
+/// ) -> binder::Result<()> {
+/// // ...
+/// }
+/// ```
+#[macro_export]
+macro_rules! impl_deserialize_for_parcelable {
+ ($parcelable:ident) => {
+ impl $crate::parcel::Deserialize for $parcelable {
+ fn deserialize(
+ parcel: &$crate::parcel::Parcel,
+ ) -> $crate::Result<Self> {
+ $crate::parcel::DeserializeOption::deserialize_option(parcel)
+ .transpose()
+ .unwrap_or(Err($crate::StatusCode::UNEXPECTED_NULL))
+ }
+ fn deserialize_from(
+ &mut self,
+ parcel: &$crate::parcel::Parcel,
+ ) -> $crate::Result<()> {
+ let status: i32 = parcel.read()?;
+ if status == 0 {
+ Err($crate::StatusCode::UNEXPECTED_NULL)
+ } else {
+ self.deserialize_parcelable(parcel)
+ }
+ }
+ }
+
+ impl $crate::parcel::DeserializeArray for $parcelable {}
+
+ impl $crate::parcel::DeserializeOption for $parcelable {
+ fn deserialize_option(
+ parcel: &$crate::parcel::Parcel,
+ ) -> $crate::Result<Option<Self>> {
+ let mut result = None;
+ Self::deserialize_option_from(&mut result, parcel)?;
+ Ok(result)
+ }
+ fn deserialize_option_from(
+ this: &mut Option<Self>,
+ parcel: &$crate::parcel::Parcel,
+ ) -> $crate::Result<()> {
+ let status: i32 = parcel.read()?;
+ if status == 0 {
+ *this = None;
+ Ok(())
+ } else {
+ this.get_or_insert_with(Self::default)
+ .deserialize_parcelable(parcel)
+ }
+ }
+ }
+ }
}
#[test]
diff --git a/libs/binder/rust/src/proxy.rs b/libs/binder/rust/src/proxy.rs
index 52036f5..cdd7c08 100644
--- a/libs/binder/rust/src/proxy.rs
+++ b/libs/binder/rust/src/proxy.rs
@@ -48,9 +48,14 @@
/// # Safety
///
-/// An `SpIBinder` is a handle to a C++ IBinder, which is thread-safe
+/// An `SpIBinder` is an immutable handle to a C++ IBinder, which is thread-safe
unsafe impl Send for SpIBinder {}
+/// # Safety
+///
+/// An `SpIBinder` is an immutable handle to a C++ IBinder, which is thread-safe
+unsafe impl Sync for SpIBinder {}
+
impl SpIBinder {
/// Create an `SpIBinder` wrapper object from a raw `AIBinder` pointer.
///
@@ -125,6 +130,21 @@
}
}
+pub mod unstable_api {
+ use super::{sys, SpIBinder};
+
+ /// A temporary API to allow the client to create a `SpIBinder` from a `sys::AIBinder`. This is
+ /// needed to bridge RPC binder, which doesn't have Rust API yet.
+ /// TODO(b/184872979): remove once the Rust API is created.
+ ///
+ /// # Safety
+ ///
+ /// See `SpIBinder::from_raw`.
+ pub unsafe fn new_spibinder(ptr: *mut sys::AIBinder) -> Option<SpIBinder> {
+ SpIBinder::from_raw(ptr)
+ }
+}
+
/// An object that can be associate with an [`InterfaceClass`].
pub trait AssociateClass {
/// Check if this object is a valid object for the given interface class
@@ -433,9 +453,14 @@
/// # Safety
///
-/// A `WpIBinder` is a handle to a C++ IBinder, which is thread-safe.
+/// A `WpIBinder` is an immutable handle to a C++ IBinder, which is thread-safe.
unsafe impl Send for WpIBinder {}
+/// # Safety
+///
+/// A `WpIBinder` is an immutable handle to a C++ IBinder, which is thread-safe.
+unsafe impl Sync for WpIBinder {}
+
impl WpIBinder {
/// Create a new weak reference from an object that can be converted into a
/// raw `AIBinder` pointer.
@@ -653,6 +678,18 @@
}
}
+/// Retrieve an existing service, or start it if it is configured as a dynamic
+/// service and isn't yet started.
+pub fn wait_for_service(name: &str) -> Option<SpIBinder> {
+ let name = CString::new(name).ok()?;
+ unsafe {
+ // Safety: `AServiceManager_waitforService` returns either a null
+ // pointer or a valid pointer to an owned `AIBinder`. Either of these
+ // values is safe to pass to `SpIBinder::from_raw`.
+ SpIBinder::from_raw(sys::AServiceManager_waitForService(name.as_ptr()))
+ }
+}
+
/// Retrieve an existing service for a particular interface, blocking for a few
/// seconds if it doesn't yet exist.
pub fn get_interface<T: FromIBinder + ?Sized>(name: &str) -> Result<Strong<T>> {
@@ -663,6 +700,16 @@
}
}
+/// Retrieve an existing service for a particular interface, or start it if it
+/// is configured as a dynamic service and isn't yet started.
+pub fn wait_for_interface<T: FromIBinder + ?Sized>(name: &str) -> Result<Strong<T>> {
+ let service = wait_for_service(name);
+ match service {
+ Some(service) => FromIBinder::try_from(service),
+ None => Err(StatusCode::NAME_NOT_FOUND),
+ }
+}
+
/// # Safety
///
/// `SpIBinder` guarantees that `binder` always contains a valid pointer to an
diff --git a/libs/binder/rust/tests/integration.rs b/libs/binder/rust/tests/integration.rs
index 0332007..da8907d 100644
--- a/libs/binder/rust/tests/integration.rs
+++ b/libs/binder/rust/tests/integration.rs
@@ -23,6 +23,9 @@
FIRST_CALL_TRANSACTION,
};
use std::convert::{TryFrom, TryInto};
+use std::ffi::CStr;
+use std::fs::File;
+use std::sync::Mutex;
/// Name of service runner.
///
@@ -50,13 +53,11 @@
let extension_name = args.next();
{
- let mut service = Binder::new(BnTest(Box::new(TestService {
- s: service_name.clone(),
- })));
+ let mut service = Binder::new(BnTest(Box::new(TestService::new(&service_name))));
service.set_requesting_sid(true);
if let Some(extension_name) = extension_name {
let extension =
- BnTest::new_binder(TestService { s: extension_name }, BinderFeatures::default());
+ BnTest::new_binder(TestService::new(&extension_name), BinderFeatures::default());
service
.set_extension(&mut extension.as_binder())
.expect("Could not add extension");
@@ -80,14 +81,24 @@
));
}
-#[derive(Clone)]
struct TestService {
s: String,
+ dump_args: Mutex<Vec<String>>,
+}
+
+impl TestService {
+ fn new(s: &str) -> Self {
+ Self {
+ s: s.to_string(),
+ dump_args: Mutex::new(Vec::new()),
+ }
+ }
}
#[repr(u32)]
enum TestTransactionCode {
Test = FIRST_CALL_TRANSACTION,
+ GetDumpArgs,
GetSelinuxContext,
}
@@ -97,6 +108,7 @@
fn try_from(c: u32) -> Result<Self, Self::Error> {
match c {
_ if c == TestTransactionCode::Test as u32 => Ok(TestTransactionCode::Test),
+ _ if c == TestTransactionCode::GetDumpArgs as u32 => Ok(TestTransactionCode::GetDumpArgs),
_ if c == TestTransactionCode::GetSelinuxContext as u32 => {
Ok(TestTransactionCode::GetSelinuxContext)
}
@@ -105,13 +117,24 @@
}
}
-impl Interface for TestService {}
+impl Interface for TestService {
+ fn dump(&self, _file: &File, args: &[&CStr]) -> binder::Result<()> {
+ let mut dump_args = self.dump_args.lock().unwrap();
+ dump_args.extend(args.iter().map(|s| s.to_str().unwrap().to_owned()));
+ Ok(())
+ }
+}
impl ITest for TestService {
fn test(&self) -> binder::Result<String> {
Ok(self.s.clone())
}
+ fn get_dump_args(&self) -> binder::Result<Vec<String>> {
+ let args = self.dump_args.lock().unwrap().clone();
+ Ok(args)
+ }
+
fn get_selinux_context(&self) -> binder::Result<String> {
let sid =
ThreadState::with_calling_sid(|sid| sid.map(|s| s.to_string_lossy().into_owned()));
@@ -124,6 +147,9 @@
/// Returns a test string
fn test(&self) -> binder::Result<String>;
+ /// Return the arguments sent via dump
+ fn get_dump_args(&self) -> binder::Result<Vec<String>>;
+
/// Returns the caller's SELinux context
fn get_selinux_context(&self) -> binder::Result<String>;
}
@@ -145,6 +171,7 @@
) -> binder::Result<()> {
match code.try_into()? {
TestTransactionCode::Test => reply.write(&service.test()?),
+ TestTransactionCode::GetDumpArgs => reply.write(&service.get_dump_args()?),
TestTransactionCode::GetSelinuxContext => reply.write(&service.get_selinux_context()?),
}
}
@@ -157,6 +184,13 @@
reply.read()
}
+ fn get_dump_args(&self) -> binder::Result<Vec<String>> {
+ let reply =
+ self.binder
+ .transact(TestTransactionCode::GetDumpArgs as TransactionCode, 0, |_| Ok(()))?;
+ reply.read()
+ }
+
fn get_selinux_context(&self) -> binder::Result<String> {
let reply = self.binder.transact(
TestTransactionCode::GetSelinuxContext as TransactionCode,
@@ -172,6 +206,10 @@
self.0.test()
}
+ fn get_dump_args(&self) -> binder::Result<Vec<String>> {
+ self.0.get_dump_args()
+ }
+
fn get_selinux_context(&self) -> binder::Result<String> {
self.0.get_selinux_context()
}
@@ -274,6 +312,20 @@
}
#[test]
+ fn check_wait_for_service() {
+ let mut sm =
+ binder::wait_for_service("manager").expect("Did not get manager binder service");
+ assert!(sm.is_binder_alive());
+ assert!(sm.ping_binder().is_ok());
+
+ // The service manager service isn't an ITest, so this must fail.
+ assert_eq!(
+ binder::wait_for_interface::<dyn ITest>("manager").err(),
+ Some(StatusCode::BAD_TYPE)
+ );
+ }
+
+ #[test]
fn trivial_client() {
let service_name = "trivial_client_test";
let _process = ScopedServiceProcess::new(service_name);
@@ -283,6 +335,15 @@
}
#[test]
+ fn wait_for_trivial_client() {
+ let service_name = "wait_for_trivial_client_test";
+ let _process = ScopedServiceProcess::new(service_name);
+ let test_client: Strong<dyn ITest> =
+ binder::wait_for_interface(service_name).expect("Did not get manager binder service");
+ assert_eq!(test_client.test().unwrap(), "wait_for_trivial_client_test");
+ }
+
+ #[test]
fn get_selinux_context() {
let service_name = "get_selinux_context";
let _process = ScopedServiceProcess::new(service_name);
@@ -409,18 +470,22 @@
{
let _process = ScopedServiceProcess::new(service_name);
- let mut remote = binder::get_service(service_name);
+ let test_client: Strong<dyn ITest> =
+ binder::get_interface(service_name)
+ .expect("Did not get test binder service");
+ let mut remote = test_client.as_binder();
assert!(remote.is_binder_alive());
remote.ping_binder().expect("Could not ping remote service");
- // We're not testing the output of dump here, as that's really a
- // property of the C++ implementation. There is the risk that the
- // method just does nothing, but we don't want to depend on any
- // particular output from the underlying library.
+ let dump_args = ["dump", "args", "for", "testing"];
+
let null_out = File::open("/dev/null").expect("Could not open /dev/null");
remote
- .dump(&null_out, &[])
+ .dump(&null_out, &dump_args)
.expect("Could not dump remote service");
+
+ let remote_args = test_client.get_dump_args().expect("Could not fetched dumped args");
+ assert_eq!(dump_args, remote_args[..], "Remote args don't match call to dump");
}
// get/set_extensions is tested in test_extensions()
@@ -481,9 +546,7 @@
/// rust_ndk_interop.rs
#[test]
fn associate_existing_class() {
- let service = Binder::new(BnTest(Box::new(TestService {
- s: "testing_service".to_string(),
- })));
+ let service = Binder::new(BnTest(Box::new(TestService::new("testing_service"))));
// This should succeed although we will have to treat the service as
// remote.
@@ -497,9 +560,7 @@
fn reassociate_rust_binder() {
let service_name = "testing_service";
let service_ibinder = BnTest::new_binder(
- TestService {
- s: service_name.to_string(),
- },
+ TestService::new(service_name),
BinderFeatures::default(),
)
.as_binder();
@@ -515,9 +576,7 @@
fn weak_binder_upgrade() {
let service_name = "testing_service";
let service = BnTest::new_binder(
- TestService {
- s: service_name.to_string(),
- },
+ TestService::new(service_name),
BinderFeatures::default(),
);
@@ -533,9 +592,7 @@
let service_name = "testing_service";
let weak = {
let service = BnTest::new_binder(
- TestService {
- s: service_name.to_string(),
- },
+ TestService::new(service_name),
BinderFeatures::default(),
);
@@ -549,9 +606,7 @@
fn weak_binder_clone() {
let service_name = "testing_service";
let service = BnTest::new_binder(
- TestService {
- s: service_name.to_string(),
- },
+ TestService::new(service_name),
BinderFeatures::default(),
);
@@ -570,15 +625,11 @@
#[allow(clippy::eq_op)]
fn binder_ord() {
let service1 = BnTest::new_binder(
- TestService {
- s: "testing_service1".to_string(),
- },
+ TestService::new("testing_service1"),
BinderFeatures::default(),
);
let service2 = BnTest::new_binder(
- TestService {
- s: "testing_service2".to_string(),
- },
+ TestService::new("testing_service2"),
BinderFeatures::default(),
);
diff --git a/libs/binder/servicedispatcher.cpp b/libs/binder/servicedispatcher.cpp
new file mode 100644
index 0000000..62df9b7
--- /dev/null
+++ b/libs/binder/servicedispatcher.cpp
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sysexits.h>
+#include <unistd.h>
+
+#include <iostream>
+
+#include <android-base/file.h>
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/stringprintf.h>
+#include <android/os/BnServiceManager.h>
+#include <android/os/IServiceManager.h>
+#include <binder/IServiceManager.h>
+#include <binder/RpcServer.h>
+
+using android::BBinder;
+using android::defaultServiceManager;
+using android::OK;
+using android::RpcServer;
+using android::sp;
+using android::statusToString;
+using android::String16;
+using android::base::Basename;
+using android::base::GetBoolProperty;
+using android::base::InitLogging;
+using android::base::LogdLogger;
+using android::base::LogId;
+using android::base::LogSeverity;
+using android::base::StdioLogger;
+using android::base::StringPrintf;
+using std::string_view_literals::operator""sv;
+
+namespace {
+
+using ServiceRetriever = decltype(&android::IServiceManager::checkService);
+
+int Usage(const char* program) {
+ auto basename = Basename(program);
+ auto format = R"(dispatch calls to RPC service.
+Usage:
+ %s [-g] <service_name>
+ <service_name>: the service to connect to.
+ %s [-g] manager
+ Runs an RPC-friendly service that redirects calls to servicemanager.
+
+ -g: use getService() instead of checkService().
+
+ If successful, writes port number and a new line character to stdout, and
+ blocks until killed.
+ Otherwise, writes error message to stderr and exits with non-zero code.
+)";
+ LOG(ERROR) << StringPrintf(format, basename.c_str(), basename.c_str());
+ return EX_USAGE;
+}
+
+int Dispatch(const char* name, const ServiceRetriever& serviceRetriever) {
+ auto sm = defaultServiceManager();
+ if (nullptr == sm) {
+ LOG(ERROR) << "No servicemanager";
+ return EX_SOFTWARE;
+ }
+ auto binder = std::invoke(serviceRetriever, defaultServiceManager(), String16(name));
+ if (nullptr == binder) {
+ LOG(ERROR) << "No service \"" << name << "\"";
+ return EX_SOFTWARE;
+ }
+ auto rpcServer = RpcServer::make();
+ if (nullptr == rpcServer) {
+ LOG(ERROR) << "Cannot create RpcServer";
+ return EX_SOFTWARE;
+ }
+ rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ unsigned int port;
+ if (!rpcServer->setupInetServer(0, &port)) {
+ LOG(ERROR) << "setupInetServer failed";
+ return EX_SOFTWARE;
+ }
+ auto socket = rpcServer->releaseServer();
+ auto keepAliveBinder = sp<BBinder>::make();
+ auto status = binder->setRpcClientDebug(std::move(socket), keepAliveBinder);
+ if (status != OK) {
+ LOG(ERROR) << "setRpcClientDebug failed with " << statusToString(status);
+ return EX_SOFTWARE;
+ }
+ LOG(INFO) << "Finish setting up RPC on service " << name << " on port " << port;
+
+ std::cout << port << std::endl;
+
+ TEMP_FAILURE_RETRY(pause());
+
+ PLOG(FATAL) << "TEMP_FAILURE_RETRY(pause()) exits; this should not happen!";
+ __builtin_unreachable();
+}
+
+// Wrapper that wraps a BpServiceManager as a BnServiceManager.
+class ServiceManagerProxyToNative : public android::os::BnServiceManager {
+public:
+ ServiceManagerProxyToNative(const sp<android::os::IServiceManager>& impl) : mImpl(impl) {}
+ android::binder::Status getService(const std::string&,
+ android::sp<android::IBinder>*) override {
+ // We can't send BpBinder for regular binder over RPC.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status checkService(const std::string&,
+ android::sp<android::IBinder>*) override {
+ // We can't send BpBinder for regular binder over RPC.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status addService(const std::string&, const android::sp<android::IBinder>&,
+ bool, int32_t) override {
+ // We can't send BpBinder for RPC over regular binder.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status listServices(int32_t dumpPriority,
+ std::vector<std::string>* _aidl_return) override {
+ return mImpl->listServices(dumpPriority, _aidl_return);
+ }
+ android::binder::Status registerForNotifications(
+ const std::string&, const android::sp<android::os::IServiceCallback>&) override {
+ // We can't send BpBinder for RPC over regular binder.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status unregisterForNotifications(
+ const std::string&, const android::sp<android::os::IServiceCallback>&) override {
+ // We can't send BpBinder for RPC over regular binder.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status isDeclared(const std::string& name, bool* _aidl_return) override {
+ return mImpl->isDeclared(name, _aidl_return);
+ }
+ android::binder::Status getDeclaredInstances(const std::string& iface,
+ std::vector<std::string>* _aidl_return) override {
+ return mImpl->getDeclaredInstances(iface, _aidl_return);
+ }
+ android::binder::Status updatableViaApex(const std::string& name,
+ std::optional<std::string>* _aidl_return) override {
+ return mImpl->updatableViaApex(name, _aidl_return);
+ }
+ android::binder::Status registerClientCallback(
+ const std::string&, const android::sp<android::IBinder>&,
+ const android::sp<android::os::IClientCallback>&) override {
+ // We can't send BpBinder for RPC over regular binder.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status tryUnregisterService(const std::string&,
+ const android::sp<android::IBinder>&) override {
+ // We can't send BpBinder for RPC over regular binder.
+ return android::binder::Status::fromStatusT(android::INVALID_OPERATION);
+ }
+ android::binder::Status getServiceDebugInfo(
+ std::vector<android::os::ServiceDebugInfo>* _aidl_return) override {
+ return mImpl->getServiceDebugInfo(_aidl_return);
+ }
+
+private:
+ sp<android::os::IServiceManager> mImpl;
+};
+
+// Workaround for b/191059588.
+// TODO(b/191059588): Once we can run RpcServer on single-threaded services,
+// `servicedispatcher manager` should call Dispatch("manager") directly.
+int wrapServiceManager(const ServiceRetriever& serviceRetriever) {
+ auto sm = defaultServiceManager();
+ if (nullptr == sm) {
+ LOG(ERROR) << "No servicemanager";
+ return EX_SOFTWARE;
+ }
+ auto service = std::invoke(serviceRetriever, defaultServiceManager(), String16("manager"));
+ if (nullptr == service) {
+ LOG(ERROR) << "No service called `manager`";
+ return EX_SOFTWARE;
+ }
+ auto interface = android::os::IServiceManager::asInterface(service);
+ if (nullptr == interface) {
+ LOG(ERROR) << "Cannot cast service called `manager` to IServiceManager";
+ return EX_SOFTWARE;
+ }
+
+ // Work around restriction that doesn't allow us to send proxy over RPC.
+ interface = sp<ServiceManagerProxyToNative>::make(interface);
+ service = ServiceManagerProxyToNative::asBinder(interface);
+
+ auto rpcServer = RpcServer::make();
+ rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ rpcServer->setRootObject(service);
+ unsigned int port;
+ if (!rpcServer->setupInetServer(0, &port)) {
+ LOG(ERROR) << "Unable to set up inet server";
+ return EX_SOFTWARE;
+ }
+ LOG(INFO) << "Finish wrapping servicemanager with RPC on port " << port;
+ std::cout << port << std::endl;
+ rpcServer->join();
+
+ LOG(FATAL) << "Wrapped servicemanager exits; this should not happen!";
+ __builtin_unreachable();
+}
+
+// Log to logd. For warning and more severe messages, also log to stderr.
+class ServiceDispatcherLogger {
+public:
+ void operator()(LogId id, LogSeverity severity, const char* tag, const char* file,
+ unsigned int line, const char* message) {
+ mLogdLogger(id, severity, tag, file, line, message);
+ if (severity >= LogSeverity::WARNING) {
+ std::cout << std::flush;
+ std::cerr << Basename(getprogname()) << ": " << message << std::endl;
+ }
+ }
+
+private:
+ LogdLogger mLogdLogger{};
+};
+
+} // namespace
+
+int main(int argc, char* argv[]) {
+ InitLogging(argv, ServiceDispatcherLogger());
+
+ if (!GetBoolProperty("ro.debuggable", false)) {
+ LOG(ERROR) << "servicedispatcher is only allowed on debuggable builds.";
+ return EX_NOPERM;
+ }
+ LOG(WARNING) << "WARNING: servicedispatcher is debug only. Use with caution.";
+
+ int opt;
+ ServiceRetriever serviceRetriever = &android::IServiceManager::checkService;
+ while (-1 != (opt = getopt(argc, argv, "g"))) {
+ switch (opt) {
+ case 'g': {
+ serviceRetriever = &android::IServiceManager::getService;
+ } break;
+ default: {
+ return Usage(argv[0]);
+ }
+ }
+ }
+
+ if (optind + 1 != argc) return Usage(argv[0]);
+ auto name = argv[optind];
+
+ if (name == "manager"sv) {
+ return wrapServiceManager(serviceRetriever);
+ }
+ return Dispatch(name, serviceRetriever);
+}
diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp
index fb84f04..24afcf6 100644
--- a/libs/binder/tests/Android.bp
+++ b/libs/binder/tests/Android.bp
@@ -60,7 +60,9 @@
defaults: ["binder_test_defaults"],
srcs: ["binderLibTest.cpp"],
shared_libs: [
+ "libbase",
"libbinder",
+ "liblog",
"libutils",
],
static_libs: [
@@ -75,14 +77,14 @@
// unit test only, which can run on host and doesn't use /dev/binder
cc_test {
- name: "binderParcelTest",
+ name: "binderUnitTest",
host_supported: true,
target: {
darwin: {
enabled: false,
},
},
- srcs: ["binderParcelTest.cpp"],
+ srcs: ["binderParcelUnitTest.cpp", "binderBinderUnitTest.cpp"],
shared_libs: [
"libbinder",
"libutils",
@@ -101,7 +103,9 @@
srcs: ["binderLibTest.cpp"],
shared_libs: [
+ "libbase",
"libbinder",
+ "liblog",
"libutils",
],
static_libs: [
@@ -116,6 +120,7 @@
host_supported: true,
unstable: true,
srcs: [
+ "IBinderRpcCallback.aidl",
"IBinderRpcSession.aidl",
"IBinderRpcTest.aidl",
],
@@ -133,6 +138,9 @@
darwin: {
enabled: false,
},
+ android: {
+ test_suites: ["vts"],
+ },
},
defaults: [
"binder_test_defaults",
@@ -156,10 +164,6 @@
],
test_suites: ["general-tests"],
require_root: true,
- // Prevent the unit test target from running on sc-dev as it's not ready.
- test_options: {
- unit_test: false,
- },
}
cc_benchmark {
@@ -325,3 +329,68 @@
"libutils",
],
}
+
+cc_test_host {
+ name: "binderUtilsHostTest",
+ defaults: ["binder_test_defaults"],
+ srcs: ["binderUtilsHostTest.cpp"],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ ],
+ static_libs: [
+ "libgmock",
+ ],
+ test_suites: ["general-tests"],
+ target: {
+ darwin: {
+ enabled: false,
+ },
+ },
+}
+
+cc_test_host {
+ name: "binderHostDeviceTest",
+ defaults: ["binder_test_defaults"],
+ srcs: ["binderHostDeviceTest.cpp"],
+ test_config: "binderHostDeviceTest.xml",
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "liblog",
+ "libutils",
+ ],
+ static_libs: [
+ "libgmock",
+ ],
+ target_required: [
+ "binderHostDeviceTestService",
+ ],
+ test_suites: ["general-tests"],
+ target: {
+ darwin: {
+ enabled: false,
+ },
+ },
+ test_options: {
+ unit_test: false,
+ },
+}
+
+cc_test {
+ name: "binderHostDeviceTestService",
+ // The binary is named differently from the module so that PushFilePreparer pushes the binary
+ // directly, not the test module directory.
+ stem: "binderHostDeviceTest-service",
+ defaults: ["binder_test_defaults"],
+ gtest: false,
+ auto_gen_config: false,
+ srcs: ["binderHostDeviceTestService.cpp"],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "liblog",
+ "libutils",
+ ],
+ test_suites: ["general-tests"],
+}
diff --git a/libs/binder/tests/IBinderRpcCallback.aidl b/libs/binder/tests/IBinderRpcCallback.aidl
new file mode 100644
index 0000000..0336961
--- /dev/null
+++ b/libs/binder/tests/IBinderRpcCallback.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+interface IBinderRpcCallback {
+ void sendCallback(@utf8InCpp String str);
+ oneway void sendOnewayCallback(@utf8InCpp String str);
+}
diff --git a/libs/binder/tests/IBinderRpcTest.aidl b/libs/binder/tests/IBinderRpcTest.aidl
index ef4198d..9e10788 100644
--- a/libs/binder/tests/IBinderRpcTest.aidl
+++ b/libs/binder/tests/IBinderRpcTest.aidl
@@ -54,5 +54,11 @@
void sleepMs(int ms);
oneway void sleepMsAsync(int ms);
+ void doCallback(IBinderRpcCallback callback, boolean isOneway, boolean delayed, @utf8InCpp String value);
+ oneway void doCallbackAsync(IBinderRpcCallback callback, boolean isOneway, boolean delayed, @utf8InCpp String value);
+
void die(boolean cleanup);
+ void scheduleShutdown();
+
+ void useKernelBinderCallingId();
}
diff --git a/libs/binder/tests/binderBinderUnitTest.cpp b/libs/binder/tests/binderBinderUnitTest.cpp
new file mode 100644
index 0000000..1be0c59
--- /dev/null
+++ b/libs/binder/tests/binderBinderUnitTest.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/Binder.h>
+#include <binder/IBinder.h>
+#include <gtest/gtest.h>
+
+using android::BBinder;
+using android::OK;
+using android::sp;
+
+const void* kObjectId1 = reinterpret_cast<const void*>(1);
+const void* kObjectId2 = reinterpret_cast<const void*>(2);
+void* kObject1 = reinterpret_cast<void*>(101);
+void* kObject2 = reinterpret_cast<void*>(102);
+void* kObject3 = reinterpret_cast<void*>(103);
+
+TEST(Binder, AttachObject) {
+ auto binder = sp<BBinder>::make();
+ EXPECT_EQ(nullptr, binder->attachObject(kObjectId1, kObject1, nullptr, nullptr));
+ EXPECT_EQ(nullptr, binder->attachObject(kObjectId2, kObject2, nullptr, nullptr));
+ EXPECT_EQ(kObject1, binder->attachObject(kObjectId1, kObject3, nullptr, nullptr));
+}
+
+TEST(Binder, DetachObject) {
+ auto binder = sp<BBinder>::make();
+ EXPECT_EQ(nullptr, binder->attachObject(kObjectId1, kObject1, nullptr, nullptr));
+ EXPECT_EQ(kObject1, binder->detachObject(kObjectId1));
+ EXPECT_EQ(nullptr, binder->attachObject(kObjectId1, kObject2, nullptr, nullptr));
+}
diff --git a/libs/binder/tests/binderHostDeviceTest.cpp b/libs/binder/tests/binderHostDeviceTest.cpp
new file mode 100644
index 0000000..5dd9212
--- /dev/null
+++ b/libs/binder/tests/binderHostDeviceTest.cpp
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Integration test for servicedispatcher + adb forward. Requires ADB.
+
+#include <stdlib.h>
+
+#include <vector>
+
+#include <android-base/parsebool.h>
+#include <android-base/result-gmock.h>
+#include <android-base/strings.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include <binder/IServiceManager.h>
+#include <binder/RpcSession.h>
+
+#include "../UtilsHost.h"
+
+using ::android::setDefaultServiceManager;
+using ::android::base::EndsWith;
+using ::android::base::Join;
+using ::android::base::ParseBool;
+using ::android::base::ParseBoolResult;
+using ::android::base::Split;
+using ::android::base::StartsWith;
+using ::android::base::StringReplace;
+using ::android::base::Trim;
+using ::android::base::testing::Ok;
+using ::std::chrono_literals::operator""ms;
+using ::std::string_literals::operator""s;
+using ::testing::AllOf;
+using ::testing::Contains;
+using ::testing::ContainsRegex;
+using ::testing::ExplainMatchResult;
+using ::testing::InitGoogleMock;
+
+namespace android {
+
+namespace {
+
+constexpr const char* kServiceBinary = "/data/local/tmp/binderHostDeviceTest-service";
+constexpr const char* kServiceName = "binderHostDeviceTestService";
+constexpr const char* kDescriptor = "android.binderHostDeviceTestService";
+
+// e.g. EXPECT_THAT(expr, StatusEq(OK)) << "additional message";
+MATCHER_P(StatusEq, expected, (negation ? "not " : "") + statusToString(expected)) {
+ *result_listener << statusToString(arg);
+ return expected == arg;
+}
+
+void initHostRpcServiceManagerOnce() {
+ static std::once_flag gSmOnce;
+ std::call_once(gSmOnce, [] { setDefaultServiceManager(createRpcDelegateServiceManager()); });
+}
+
+// Test for host service manager.
+class HostDeviceTest : public ::testing::Test {
+public:
+ void SetUp() override {
+ auto debuggableResult = execute(Split("adb shell getprop ro.debuggable", " "), nullptr);
+ ASSERT_THAT(debuggableResult, Ok());
+ ASSERT_EQ(0, debuggableResult->exitCode) << *debuggableResult;
+ auto debuggableBool = ParseBool(Trim(debuggableResult->stdout));
+ ASSERT_NE(ParseBoolResult::kError, debuggableBool) << Trim(debuggableResult->stdout);
+ if (debuggableBool == ParseBoolResult::kFalse) {
+ GTEST_SKIP() << "ro.debuggable=" << Trim(debuggableResult->stdout);
+ }
+
+ auto lsResult = execute(Split("adb shell which servicedispatcher", " "), nullptr);
+ ASSERT_THAT(lsResult, Ok());
+ if (lsResult->exitCode != 0) {
+ GTEST_SKIP() << "b/182914638: until feature is fully enabled, skip test on devices "
+ "without servicedispatcher";
+ }
+
+ initHostRpcServiceManagerOnce();
+ ASSERT_NE(nullptr, defaultServiceManager()) << "No defaultServiceManager() over RPC";
+
+ auto service = execute({"adb", "shell", kServiceBinary, kServiceName, kDescriptor},
+ &CommandResult::stdoutEndsWithNewLine);
+ ASSERT_THAT(service, Ok());
+ ASSERT_EQ(std::nullopt, service->exitCode) << *service;
+ mService = std::move(*service);
+ }
+ void TearDown() override { mService.reset(); }
+
+ [[nodiscard]] static sp<IBinder> get(unsigned int hostPort) {
+ auto rpcSession = RpcSession::make();
+ if (!rpcSession->setupInetClient("127.0.0.1", hostPort)) {
+ ADD_FAILURE() << "Failed to setupInetClient on " << hostPort;
+ return nullptr;
+ }
+ return rpcSession->getRootObject();
+ }
+
+private:
+ std::optional<CommandResult> mService;
+};
+
+TEST_F(HostDeviceTest, List) {
+ auto sm = defaultServiceManager();
+
+ auto services = sm->listServices();
+ ASSERT_THAT(services, Contains(String16(kServiceName)));
+}
+
+TEST_F(HostDeviceTest, CheckService) {
+ auto sm = defaultServiceManager();
+
+ auto rpcBinder = sm->checkService(String16(kServiceName));
+ ASSERT_NE(nullptr, rpcBinder);
+
+ EXPECT_THAT(rpcBinder->pingBinder(), StatusEq(OK));
+ EXPECT_EQ(String16(kDescriptor), rpcBinder->getInterfaceDescriptor());
+}
+
+TEST_F(HostDeviceTest, GetService) {
+ auto sm = defaultServiceManager();
+
+ auto rpcBinder = sm->getService(String16(kServiceName));
+ ASSERT_NE(nullptr, rpcBinder);
+
+ EXPECT_THAT(rpcBinder->pingBinder(), StatusEq(OK));
+ EXPECT_EQ(String16(kDescriptor), rpcBinder->getInterfaceDescriptor());
+}
+
+TEST_F(HostDeviceTest, WaitForService) {
+ auto sm = defaultServiceManager();
+
+ auto rpcBinder = sm->waitForService(String16(kServiceName));
+ ASSERT_NE(nullptr, rpcBinder);
+
+ EXPECT_THAT(rpcBinder->pingBinder(), StatusEq(OK));
+ EXPECT_EQ(String16(kDescriptor), rpcBinder->getInterfaceDescriptor());
+}
+
+TEST_F(HostDeviceTest, TenClients) {
+ auto sm = defaultServiceManager();
+
+ auto threadFn = [&] {
+ auto rpcBinder = sm->checkService(String16(kServiceName));
+ ASSERT_NE(nullptr, rpcBinder);
+
+ EXPECT_THAT(rpcBinder->pingBinder(), StatusEq(OK));
+ EXPECT_EQ(String16(kDescriptor), rpcBinder->getInterfaceDescriptor());
+ };
+
+ std::vector<std::thread> threads;
+ for (size_t i = 0; i < 10; ++i) threads.emplace_back(threadFn);
+ for (auto& thread : threads) thread.join();
+}
+
+} // namespace
+
+} // namespace android
diff --git a/libs/binder/tests/binderHostDeviceTest.xml b/libs/binder/tests/binderHostDeviceTest.xml
new file mode 100644
index 0000000..250ed3a
--- /dev/null
+++ b/libs/binder/tests/binderHostDeviceTest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs binderHostDeviceTest.">
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+ <option name="cleanup" value="true" />
+ <option name="push-file" key="binderHostDeviceTest-service"
+ value="/data/local/tmp/binderHostDeviceTest-service"/>
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.binary.ExecutableHostTest">
+ <option name="binary" value="binderHostDeviceTest"/>
+ </test>
+</configuration>
diff --git a/libs/binder/tests/binderHostDeviceTestService.cpp b/libs/binder/tests/binderHostDeviceTestService.cpp
new file mode 100644
index 0000000..6ddd2e7
--- /dev/null
+++ b/libs/binder/tests/binderHostDeviceTestService.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sysexits.h>
+
+#include <android-base/logging.h>
+#include <binder/IBinder.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
+
+namespace {
+class Service : public android::BBinder {
+public:
+ Service(std::string_view descriptor) : mDescriptor(descriptor.data(), descriptor.size()) {}
+ const android::String16& getInterfaceDescriptor() const override { return mDescriptor; }
+
+private:
+ android::String16 mDescriptor;
+};
+} // namespace
+
+int main(int argc, char** argv) {
+ if (argc != 3) {
+ std::cerr << "usage: " << argv[0] << " <service-name> <interface-descriptor>" << std::endl;
+ return EX_USAGE;
+ }
+ auto name = argv[1];
+ auto descriptor = argv[2];
+
+ auto sm = android::defaultServiceManager();
+ CHECK(sm != nullptr);
+ auto service = android::sp<Service>::make(descriptor);
+ auto status = sm->addService(android::String16(name), service);
+ CHECK_EQ(android::OK, status) << android::statusToString(status);
+ std::cout << "running..." << std::endl;
+ android::ProcessState::self()->startThreadPool();
+ android::IPCThreadState::self()->joinThreadPool();
+ LOG(ERROR) << "joinThreadPool exits";
+ return EX_SOFTWARE;
+}
diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp
index 5612d1d..4c3225f 100644
--- a/libs/binder/tests/binderLibTest.cpp
+++ b/libs/binder/tests/binderLibTest.cpp
@@ -15,25 +15,36 @@
*/
#include <errno.h>
-#include <fcntl.h>
-#include <fstream>
#include <poll.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
+
+#include <chrono>
+#include <fstream>
#include <thread>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
+#include <android-base/properties.h>
+#include <android-base/result-gmock.h>
+#include <android-base/result.h>
+#include <android-base/strings.h>
+#include <android-base/unique_fd.h>
#include <binder/Binder.h>
+#include <binder/BpBinder.h>
#include <binder/IBinder.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
+#include <binder/RpcServer.h>
+#include <binder/RpcSession.h>
#include <linux/sched.h>
#include <sys/epoll.h>
#include <sys/prctl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#include "../binder_module.h"
#include "binderAbiHelper.h"
@@ -41,7 +52,13 @@
#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
using namespace android;
+using namespace std::string_literals;
+using namespace std::chrono_literals;
+using android::base::testing::HasValue;
+using android::base::testing::Ok;
+using testing::ExplainMatchResult;
using testing::Not;
+using testing::WithParamInterface;
// e.g. EXPECT_THAT(expr, StatusEq(OK)) << "additional message";
MATCHER_P(StatusEq, expected, (negation ? "not " : "") + statusToString(expected)) {
@@ -72,6 +89,7 @@
BINDER_LIB_TEST_REGISTER_SERVER,
BINDER_LIB_TEST_ADD_SERVER,
BINDER_LIB_TEST_ADD_POLL_SERVER,
+ BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION,
BINDER_LIB_TEST_CALL_BACK,
BINDER_LIB_TEST_CALL_BACK_VERIFY_BUF,
BINDER_LIB_TEST_DELAYED_CALL_BACK,
@@ -156,6 +174,20 @@
return pid;
}
+android::base::Result<int32_t> GetId(sp<IBinder> service) {
+ using android::base::Error;
+ Parcel data, reply;
+ data.markForBinder(service);
+ const char *prefix = data.isForRpc() ? "On RPC server, " : "On binder server, ";
+ status_t status = service->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply);
+ if (status != OK)
+ return Error(status) << prefix << "transact(GET_ID): " << statusToString(status);
+ int32_t result = 0;
+ status = reply.readInt32(&result);
+ if (status != OK) return Error(status) << prefix << "readInt32: " << statusToString(status);
+ return result;
+}
+
class BinderLibTestEnv : public ::testing::Environment {
public:
BinderLibTestEnv() {}
@@ -404,6 +436,14 @@
};
};
+TEST_F(BinderLibTest, WasParceled) {
+ auto binder = sp<BBinder>::make();
+ EXPECT_FALSE(binder->wasParceled());
+ Parcel data;
+ data.writeStrongBinder(binder);
+ EXPECT_TRUE(binder->wasParceled());
+}
+
TEST_F(BinderLibTest, NopTransaction) {
Parcel data, reply;
EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply),
@@ -475,12 +515,7 @@
}
TEST_F(BinderLibTest, GetId) {
- int32_t id;
- Parcel data, reply;
- EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GET_ID_TRANSACTION, data, &reply),
- StatusEq(NO_ERROR));
- EXPECT_THAT(reply.readInt32(&id), StatusEq(NO_ERROR));
- EXPECT_EQ(0, id);
+ EXPECT_THAT(GetId(m_server), HasValue(0));
}
TEST_F(BinderLibTest, PtrSize) {
@@ -603,6 +638,13 @@
EXPECT_THAT(callBack->getResult(), StatusEq(NO_ERROR));
}
+TEST_F(BinderLibTest, BinderCallContextGuard) {
+ sp<IBinder> binder = addServer();
+ Parcel data, reply;
+ EXPECT_THAT(binder->transact(BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION, data, &reply),
+ StatusEq(DEAD_OBJECT));
+}
+
TEST_F(BinderLibTest, AddServer)
{
sp<IBinder> server = addServer();
@@ -1134,39 +1176,116 @@
EXPECT_THAT(server->transact(BINDER_LIB_TEST_CAN_GET_SID, data, nullptr), StatusEq(OK));
}
-class BinderLibTestService : public BBinder
-{
- public:
- explicit BinderLibTestService(int32_t id)
- : m_id(id)
- , m_nextServerId(id + 1)
- , m_serverStartRequested(false)
- , m_callback(nullptr)
- {
- pthread_mutex_init(&m_serverWaitMutex, nullptr);
- pthread_cond_init(&m_serverWaitCond, nullptr);
+class BinderLibRpcTestBase : public BinderLibTest {
+public:
+ void SetUp() override {
+ if (!base::GetBoolProperty("ro.debuggable", false)) {
+ GTEST_SKIP() << "Binder RPC is only enabled on debuggable builds, skipping test on "
+ "non-debuggable builds.";
}
- ~BinderLibTestService()
- {
- exit(EXIT_SUCCESS);
- }
+ BinderLibTest::SetUp();
+ }
- void processPendingCall() {
- if (m_callback != nullptr) {
- Parcel data;
- data.writeInt32(NO_ERROR);
- m_callback->transact(BINDER_LIB_TEST_CALL_BACK, data, nullptr, TF_ONE_WAY);
- m_callback = nullptr;
- }
+ std::tuple<android::base::unique_fd, unsigned int> CreateSocket() {
+ auto rpcServer = RpcServer::make();
+ EXPECT_NE(nullptr, rpcServer);
+ if (rpcServer == nullptr) return {};
+ rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ unsigned int port;
+ if (!rpcServer->setupInetServer(0, &port)) {
+ ADD_FAILURE() << "setupInetServer failed";
+ return {};
}
+ return {rpcServer->releaseServer(), port};
+ }
+};
- virtual status_t onTransact(uint32_t code,
- const Parcel& data, Parcel* reply,
- uint32_t flags = 0) {
- if (getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) {
- return PERMISSION_DENIED;
- }
- switch (code) {
+class BinderLibRpcTest : public BinderLibRpcTestBase {};
+
+TEST_F(BinderLibRpcTest, SetRpcClientDebug) {
+ auto binder = addServer();
+ ASSERT_TRUE(binder != nullptr);
+ auto [socket, port] = CreateSocket();
+ ASSERT_TRUE(socket.ok());
+ EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), sp<BBinder>::make()), StatusEq(OK));
+}
+
+// Tests for multiple RpcServer's on the same binder object.
+TEST_F(BinderLibRpcTest, SetRpcClientDebugTwice) {
+ auto binder = addServer();
+ ASSERT_TRUE(binder != nullptr);
+
+ auto [socket1, port1] = CreateSocket();
+ ASSERT_TRUE(socket1.ok());
+ auto keepAliveBinder1 = sp<BBinder>::make();
+ EXPECT_THAT(binder->setRpcClientDebug(std::move(socket1), keepAliveBinder1), StatusEq(OK));
+
+ auto [socket2, port2] = CreateSocket();
+ ASSERT_TRUE(socket2.ok());
+ auto keepAliveBinder2 = sp<BBinder>::make();
+ EXPECT_THAT(binder->setRpcClientDebug(std::move(socket2), keepAliveBinder2), StatusEq(OK));
+}
+
+// Negative tests for RPC APIs on IBinder. Call should fail in the same way on both remote and
+// local binders.
+class BinderLibRpcTestP : public BinderLibRpcTestBase, public WithParamInterface<bool> {
+public:
+ sp<IBinder> GetService() {
+ return GetParam() ? sp<IBinder>(addServer()) : sp<IBinder>(sp<BBinder>::make());
+ }
+ static std::string ParamToString(const testing::TestParamInfo<ParamType> &info) {
+ return info.param ? "remote" : "local";
+ }
+};
+
+TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoFd) {
+ auto binder = GetService();
+ ASSERT_TRUE(binder != nullptr);
+ EXPECT_THAT(binder->setRpcClientDebug(android::base::unique_fd(), sp<BBinder>::make()),
+ StatusEq(BAD_VALUE));
+}
+
+TEST_P(BinderLibRpcTestP, SetRpcClientDebugNoKeepAliveBinder) {
+ auto binder = GetService();
+ ASSERT_TRUE(binder != nullptr);
+ auto [socket, port] = CreateSocket();
+ ASSERT_TRUE(socket.ok());
+ EXPECT_THAT(binder->setRpcClientDebug(std::move(socket), nullptr), StatusEq(UNEXPECTED_NULL));
+}
+INSTANTIATE_TEST_CASE_P(BinderLibTest, BinderLibRpcTestP, testing::Bool(),
+ BinderLibRpcTestP::ParamToString);
+
+class BinderLibTestService : public BBinder {
+public:
+ explicit BinderLibTestService(int32_t id, bool exitOnDestroy = true)
+ : m_id(id),
+ m_nextServerId(id + 1),
+ m_serverStartRequested(false),
+ m_callback(nullptr),
+ m_exitOnDestroy(exitOnDestroy) {
+ pthread_mutex_init(&m_serverWaitMutex, nullptr);
+ pthread_cond_init(&m_serverWaitCond, nullptr);
+ }
+ ~BinderLibTestService() {
+ if (m_exitOnDestroy) exit(EXIT_SUCCESS);
+ }
+
+ void processPendingCall() {
+ if (m_callback != nullptr) {
+ Parcel data;
+ data.writeInt32(NO_ERROR);
+ m_callback->transact(BINDER_LIB_TEST_CALL_BACK, data, nullptr, TF_ONE_WAY);
+ m_callback = nullptr;
+ }
+ }
+
+ virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply,
+ uint32_t flags = 0) {
+ // TODO(b/182914638): also checks getCallingUid() for RPC
+ if (!data.isForRpc() && getuid() != (uid_t)IPCThreadState::self()->getCallingUid()) {
+ return PERMISSION_DENIED;
+ }
+ switch (code) {
case BINDER_LIB_TEST_REGISTER_SERVER: {
int32_t id;
sp<IBinder> binder;
@@ -1176,8 +1295,7 @@
return BAD_VALUE;
}
- if (m_id != 0)
- return INVALID_OPERATION;
+ if (m_id != 0) return INVALID_OPERATION;
pthread_mutex_lock(&m_serverWaitMutex);
if (m_serverStartRequested) {
@@ -1231,6 +1349,21 @@
pthread_mutex_unlock(&m_serverWaitMutex);
return ret;
}
+ case BINDER_LIB_TEST_USE_CALLING_GUARD_TRANSACTION: {
+ IPCThreadState::SpGuard spGuard{
+ .address = __builtin_frame_address(0),
+ .context = "GuardInBinderTransaction",
+ };
+ const IPCThreadState::SpGuard *origGuard =
+ IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
+
+ // if the guard works, this should abort
+ (void)IPCThreadState::self()->getCallingPid();
+
+ IPCThreadState::self()->restoreGetCallingSpGuard(origGuard);
+ return NO_ERROR;
+ }
+
case BINDER_LIB_TEST_GETPID:
reply->writeInt32(getpid());
return NO_ERROR;
@@ -1347,8 +1480,7 @@
return BAD_VALUE;
}
ret = target->linkToDeath(testDeathRecipient);
- if (ret == NO_ERROR)
- ret = testDeathRecipient->waitEvent(5);
+ if (ret == NO_ERROR) ret = testDeathRecipient->waitEvent(5);
data2.writeInt32(ret);
callback->transact(BINDER_LIB_TEST_CALL_BACK, data2, &reply2);
return NO_ERROR;
@@ -1372,8 +1504,7 @@
return BAD_VALUE;
}
ret = write(fd, buf, size);
- if (ret != size)
- return UNKNOWN_ERROR;
+ if (ret != size) return UNKNOWN_ERROR;
return NO_ERROR;
}
case BINDER_LIB_TEST_WRITE_PARCEL_FILE_DESCRIPTOR_TRANSACTION: {
@@ -1428,8 +1559,7 @@
case BINDER_LIB_TEST_ECHO_VECTOR: {
std::vector<uint64_t> vector;
auto err = data.readUint64Vector(&vector);
- if (err != NO_ERROR)
- return err;
+ if (err != NO_ERROR) return err;
reply->writeUint64Vector(vector);
return NO_ERROR;
}
@@ -1441,23 +1571,33 @@
}
default:
return UNKNOWN_TRANSACTION;
- };
- }
- private:
- int32_t m_id;
- int32_t m_nextServerId;
- pthread_mutex_t m_serverWaitMutex;
- pthread_cond_t m_serverWaitCond;
- bool m_serverStartRequested;
- sp<IBinder> m_serverStarted;
- sp<IBinder> m_strongRef;
- sp<IBinder> m_callback;
+ };
+ }
+
+private:
+ int32_t m_id;
+ int32_t m_nextServerId;
+ pthread_mutex_t m_serverWaitMutex;
+ pthread_cond_t m_serverWaitCond;
+ bool m_serverStartRequested;
+ sp<IBinder> m_serverStarted;
+ sp<IBinder> m_strongRef;
+ sp<IBinder> m_callback;
+ bool m_exitOnDestroy;
};
int run_server(int index, int readypipefd, bool usePoll)
{
binderLibTestServiceName += String16(binderserversuffix);
+ // Testing to make sure that calls that we are serving can use getCallin*
+ // even though we don't here.
+ IPCThreadState::SpGuard spGuard{
+ .address = __builtin_frame_address(0),
+ .context = "main server thread",
+ };
+ (void)IPCThreadState::self()->pushGetCallingSpGuard(&spGuard);
+
status_t ret;
sp<IServiceManager> sm = defaultServiceManager();
BinderLibTestService* testServicePtr;
diff --git a/libs/binder/tests/binderParcelTest.cpp b/libs/binder/tests/binderParcelUnitTest.cpp
similarity index 100%
rename from libs/binder/tests/binderParcelTest.cpp
rename to libs/binder/tests/binderParcelUnitTest.cpp
diff --git a/libs/binder/tests/binderRpcBenchmark.cpp b/libs/binder/tests/binderRpcBenchmark.cpp
index a457e67..5f4a7b5 100644
--- a/libs/binder/tests/binderRpcBenchmark.cpp
+++ b/libs/binder/tests/binderRpcBenchmark.cpp
@@ -18,21 +18,31 @@
#include <android-base/logging.h>
#include <benchmark/benchmark.h>
#include <binder/Binder.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
#include <binder/RpcServer.h>
#include <binder/RpcSession.h>
#include <thread>
+#include <signal.h>
+#include <sys/prctl.h>
#include <sys/types.h>
#include <unistd.h>
using android::BBinder;
+using android::defaultServiceManager;
using android::IBinder;
using android::interface_cast;
+using android::IPCThreadState;
+using android::IServiceManager;
using android::OK;
+using android::ProcessState;
using android::RpcServer;
using android::RpcSession;
using android::sp;
+using android::String16;
using android::binder::Status;
class MyBinderRpcBenchmark : public BnBinderRpcBenchmark {
@@ -46,28 +56,51 @@
}
};
-static sp<RpcSession> gSession = RpcSession::make();
+enum Transport {
+ KERNEL,
+ RPC,
+};
-void BM_getRootObject(benchmark::State& state) {
- while (state.KeepRunning()) {
- CHECK(gSession->getRootObject() != nullptr);
+static void EachTransport(benchmark::internal::Benchmark* b) {
+#ifdef __BIONIC__
+ b->Args({Transport::KERNEL});
+#endif
+ b->Args({Transport::RPC});
+}
+
+static sp<RpcSession> gSession = RpcSession::make();
+#ifdef __BIONIC__
+static const String16 kKernelBinderInstance = String16(u"binderRpcBenchmark-control");
+static sp<IBinder> gKernelBinder;
+#endif
+
+static sp<IBinder> getBinderForOptions(benchmark::State& state) {
+ Transport transport = static_cast<Transport>(state.range(0));
+ switch (transport) {
+#ifdef __BIONIC__
+ case KERNEL:
+ return gKernelBinder;
+#endif
+ case RPC:
+ return gSession->getRootObject();
+ default:
+ LOG(FATAL) << "Unknown transport value: " << transport;
+ return nullptr;
}
}
-BENCHMARK(BM_getRootObject);
void BM_pingTransaction(benchmark::State& state) {
- sp<IBinder> binder = gSession->getRootObject();
- CHECK(binder != nullptr);
+ sp<IBinder> binder = getBinderForOptions(state);
while (state.KeepRunning()) {
CHECK_EQ(OK, binder->pingBinder());
}
}
-BENCHMARK(BM_pingTransaction);
+BENCHMARK(BM_pingTransaction)->Apply(EachTransport);
void BM_repeatString(benchmark::State& state) {
- sp<IBinder> binder = gSession->getRootObject();
- CHECK(binder != nullptr);
+ sp<IBinder> binder = getBinderForOptions(state);
+
sp<IBinderRpcBenchmark> iface = interface_cast<IBinderRpcBenchmark>(binder);
CHECK(iface != nullptr);
@@ -92,7 +125,7 @@
CHECK(ret.isOk()) << ret;
}
}
-BENCHMARK(BM_repeatString);
+BENCHMARK(BM_repeatString)->Apply(EachTransport);
void BM_repeatBinder(benchmark::State& state) {
sp<IBinder> binder = gSession->getRootObject();
@@ -109,7 +142,7 @@
CHECK(ret.isOk()) << ret;
}
}
-BENCHMARK(BM_repeatBinder);
+BENCHMARK(BM_repeatBinder)->Apply(EachTransport);
int main(int argc, char** argv) {
::benchmark::Initialize(&argc, argv);
@@ -118,13 +151,36 @@
std::string addr = std::string(getenv("TMPDIR") ?: "/tmp") + "/binderRpcBenchmark";
(void)unlink(addr.c_str());
- std::thread([addr]() {
+ std::cerr << "Tests suffixes:" << std::endl;
+ std::cerr << "\t\\" << Transport::KERNEL << " is KERNEL" << std::endl;
+ std::cerr << "\t\\" << Transport::RPC << " is RPC" << std::endl;
+
+ if (0 == fork()) {
+ prctl(PR_SET_PDEATHSIG, SIGHUP); // racey, okay
sp<RpcServer> server = RpcServer::make();
server->setRootObject(sp<MyBinderRpcBenchmark>::make());
server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
CHECK(server->setupUnixDomainServer(addr.c_str()));
server->join();
- }).detach();
+ exit(1);
+ }
+
+#ifdef __BIONIC__
+ if (0 == fork()) {
+ prctl(PR_SET_PDEATHSIG, SIGHUP); // racey, okay
+ CHECK_EQ(OK,
+ defaultServiceManager()->addService(kKernelBinderInstance,
+ sp<MyBinderRpcBenchmark>::make()));
+ IPCThreadState::self()->joinThreadPool();
+ exit(1);
+ }
+
+ ProcessState::self()->setThreadPoolMaxThreadCount(1);
+ ProcessState::self()->startThreadPool();
+
+ gKernelBinder = defaultServiceManager()->waitForService(kKernelBinderInstance);
+ CHECK_NE(nullptr, gKernelBinder.get());
+#endif
for (size_t tries = 0; tries < 5; tries++) {
usleep(10000);
diff --git a/libs/binder/tests/binderRpcTest.cpp b/libs/binder/tests/binderRpcTest.cpp
index a96deb5..d5786bc 100644
--- a/libs/binder/tests/binderRpcTest.cpp
+++ b/libs/binder/tests/binderRpcTest.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#include <BnBinderRpcCallback.h>
#include <BnBinderRpcSession.h>
#include <BnBinderRpcTest.h>
#include <aidl/IBinderRpcTest.h>
@@ -23,6 +24,7 @@
#include <android/binder_libbinder.h>
#include <binder/Binder.h>
#include <binder/BpBinder.h>
+#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/ProcessState.h>
#include <binder/RpcServer.h>
@@ -33,6 +35,7 @@
#include <cstdlib>
#include <iostream>
#include <thread>
+#include <type_traits>
#include <sys/prctl.h>
#include <unistd.h>
@@ -40,8 +43,13 @@
#include "../RpcState.h" // for debugging
#include "../vm_sockets.h" // for VMADDR_*
+using namespace std::chrono_literals;
+
namespace android {
+static_assert(RPC_WIRE_PROTOCOL_VERSION + 1 == RPC_WIRE_PROTOCOL_VERSION_NEXT ||
+ RPC_WIRE_PROTOCOL_VERSION == RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL);
+
TEST(BinderRpcParcel, EntireParcelFormatted) {
Parcel p;
p.writeInt32(3);
@@ -62,6 +70,19 @@
ASSERT_EQ(sinkFd, retrieved.get());
}
+TEST(BinderRpc, CannotUseNextWireVersion) {
+ auto session = RpcSession::make();
+ EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT));
+ EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 1));
+ EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 2));
+ EXPECT_FALSE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_NEXT + 15));
+}
+
+TEST(BinderRpc, CanUseExperimentalWireVersion) {
+ auto session = RpcSession::make();
+ EXPECT_TRUE(session->setProtocolVersion(RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL));
+}
+
using android::binder::Status;
#define EXPECT_OK(status) \
@@ -86,6 +107,22 @@
};
std::atomic<int32_t> MyBinderRpcSession::gNum;
+class MyBinderRpcCallback : public BnBinderRpcCallback {
+ Status sendCallback(const std::string& value) {
+ std::unique_lock _l(mMutex);
+ mValues.push_back(value);
+ _l.unlock();
+ mCv.notify_one();
+ return Status::ok();
+ }
+ Status sendOnewayCallback(const std::string& value) { return sendCallback(value); }
+
+public:
+ std::mutex mMutex;
+ std::condition_variable mCv;
+ std::vector<std::string> mValues;
+};
+
class MyBinderRpcTest : public BnBinderRpcTest {
public:
wp<RpcServer> server;
@@ -106,11 +143,6 @@
out->clear();
for (auto session : spServer->listSessions()) {
size_t count = session->state()->countBinders();
- if (count != 1) {
- // this is called when there is only one binder held remaining,
- // so to aid debugging
- session->state()->dump();
- }
out->push_back(count);
}
return Status::ok();
@@ -184,6 +216,33 @@
return sleepMs(ms);
}
+ Status doCallback(const sp<IBinderRpcCallback>& callback, bool oneway, bool delayed,
+ const std::string& value) override {
+ if (callback == nullptr) {
+ return Status::fromExceptionCode(Status::EX_NULL_POINTER);
+ }
+
+ if (delayed) {
+ std::thread([=]() {
+ ALOGE("Executing delayed callback: '%s'", value.c_str());
+ Status status = doCallback(callback, oneway, false, value);
+ ALOGE("Delayed callback status: '%s'", status.toString8().c_str());
+ }).detach();
+ return Status::ok();
+ }
+
+ if (oneway) {
+ return callback->sendOnewayCallback(value);
+ }
+
+ return callback->sendCallback(value);
+ }
+
+ Status doCallbackAsync(const sp<IBinderRpcCallback>& callback, bool oneway, bool delayed,
+ const std::string& value) override {
+ return doCallback(callback, oneway, delayed, value);
+ }
+
Status die(bool cleanup) override {
if (cleanup) {
exit(1);
@@ -191,42 +250,53 @@
_exit(1);
}
}
+
+ Status scheduleShutdown() override {
+ sp<RpcServer> strongServer = server.promote();
+ if (strongServer == nullptr) {
+ return Status::fromExceptionCode(Status::EX_NULL_POINTER);
+ }
+ std::thread([=] {
+ LOG_ALWAYS_FATAL_IF(!strongServer->shutdown(), "Could not shutdown");
+ }).detach();
+ return Status::ok();
+ }
+
+ Status useKernelBinderCallingId() override {
+ // this is WRONG! It does not make sense when using RPC binder, and
+ // because it is SO wrong, and so much code calls this, it should abort!
+
+ (void)IPCThreadState::self()->getCallingPid();
+ return Status::ok();
+ }
};
sp<IBinder> MyBinderRpcTest::mHeldBinder;
-class Pipe {
-public:
- Pipe() { CHECK(android::base::Pipe(&mRead, &mWrite)); }
- Pipe(Pipe&&) = default;
- android::base::borrowed_fd readEnd() { return mRead; }
- android::base::borrowed_fd writeEnd() { return mWrite; }
-
-private:
- android::base::unique_fd mRead;
- android::base::unique_fd mWrite;
-};
-
class Process {
public:
Process(Process&&) = default;
- Process(const std::function<void(Pipe*)>& f) {
+ Process(const std::function<void(android::base::borrowed_fd /* writeEnd */)>& f) {
+ android::base::unique_fd writeEnd;
+ CHECK(android::base::Pipe(&mReadEnd, &writeEnd)) << strerror(errno);
if (0 == (mPid = fork())) {
// racey: assume parent doesn't crash before this is set
prctl(PR_SET_PDEATHSIG, SIGHUP);
- f(&mPipe);
+ f(writeEnd);
+
+ exit(0);
}
}
~Process() {
if (mPid != 0) {
- kill(mPid, SIGKILL);
+ waitpid(mPid, nullptr, 0);
}
}
- Pipe* getPipe() { return &mPipe; }
+ android::base::borrowed_fd readEnd() { return mReadEnd; }
private:
pid_t mPid = 0;
- Pipe mPipe;
+ android::base::unique_fd mReadEnd;
};
static std::string allocateSocketAddress() {
@@ -235,6 +305,11 @@
return temp + "/binderRpcTest_" + std::to_string(id++);
};
+static unsigned int allocateVsockPort() {
+ static unsigned int vsockPort = 3456;
+ return vsockPort++;
+}
+
struct ProcessSession {
// reference to process hosting a socket server
Process host;
@@ -280,11 +355,14 @@
sp<IBinderRpcTest> rootIface;
// whether session should be invalidated by end of run
- bool expectInvalid = false;
+ bool expectAlreadyShutdown = false;
BinderRpcTestProcessSession(BinderRpcTestProcessSession&&) = default;
~BinderRpcTestProcessSession() {
- if (!expectInvalid) {
+ EXPECT_NE(nullptr, rootIface);
+ if (rootIface == nullptr) return;
+
+ if (!expectAlreadyShutdown) {
std::vector<int32_t> remoteCounts;
// calling over any sessions counts across all sessions
EXPECT_OK(rootIface->countBinders(&remoteCounts));
@@ -292,6 +370,12 @@
for (auto remoteCount : remoteCounts) {
EXPECT_EQ(remoteCount, 1);
}
+
+ // even though it is on another thread, shutdown races with
+ // the transaction reply being written
+ if (auto status = rootIface->scheduleShutdown(); !status.isOk()) {
+ EXPECT_EQ(DEAD_OBJECT, status.transactionError()) << status;
+ }
}
rootIface = nullptr;
@@ -317,28 +401,33 @@
return "";
}
}
+
class BinderRpc : public ::testing::TestWithParam<SocketType> {
public:
+ struct Options {
+ size_t numThreads = 1;
+ size_t numSessions = 1;
+ size_t numIncomingConnections = 0;
+ };
+
// This creates a new process serving an interface on a certain number of
// threads.
ProcessSession createRpcTestSocketServerProcess(
- size_t numThreads, size_t numSessions,
- const std::function<void(const sp<RpcServer>&)>& configure) {
- CHECK_GE(numSessions, 1) << "Must have at least one session to a server";
+ const Options& options, const std::function<void(const sp<RpcServer>&)>& configure) {
+ CHECK_GE(options.numSessions, 1) << "Must have at least one session to a server";
SocketType socketType = GetParam();
+ unsigned int vsockPort = allocateVsockPort();
std::string addr = allocateSocketAddress();
unlink(addr.c_str());
- static unsigned int vsockPort = 3456;
- vsockPort++;
auto ret = ProcessSession{
- .host = Process([&](Pipe* pipe) {
+ .host = Process([&](android::base::borrowed_fd writeEnd) {
sp<RpcServer> server = RpcServer::make();
server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
- server->setMaxThreads(numThreads);
+ server->setMaxThreads(options.numThreads);
unsigned int outPort = 0;
@@ -358,23 +447,28 @@
LOG_ALWAYS_FATAL("Unknown socket type");
}
- CHECK(android::base::WriteFully(pipe->writeEnd(), &outPort, sizeof(outPort)));
+ CHECK(android::base::WriteFully(writeEnd, &outPort, sizeof(outPort)));
configure(server);
server->join();
+
+ // Another thread calls shutdown. Wait for it to complete.
+ (void)server->shutdown();
}),
};
// always read socket, so that we have waited for the server to start
unsigned int outPort = 0;
- CHECK(android::base::ReadFully(ret.host.getPipe()->readEnd(), &outPort, sizeof(outPort)));
+ CHECK(android::base::ReadFully(ret.host.readEnd(), &outPort, sizeof(outPort)));
if (socketType == SocketType::INET) {
CHECK_NE(0, outPort);
}
- for (size_t i = 0; i < numSessions; i++) {
+ for (size_t i = 0; i < options.numSessions; i++) {
sp<RpcSession> session = RpcSession::make();
+ session->setMaxThreads(options.numIncomingConnections);
+
switch (socketType) {
case SocketType::UNIX:
if (session->setupUnixDomainClient(addr.c_str())) goto success;
@@ -395,10 +489,9 @@
return ret;
}
- BinderRpcTestProcessSession createRpcTestSocketServerProcess(size_t numThreads,
- size_t numSessions = 1) {
+ BinderRpcTestProcessSession createRpcTestSocketServerProcess(const Options& options) {
BinderRpcTestProcessSession ret{
- .proc = createRpcTestSocketServerProcess(numThreads, numSessions,
+ .proc = createRpcTestSocketServerProcess(options,
[&](const sp<RpcServer>& server) {
sp<MyBinderRpcTest> service =
new MyBinderRpcTest;
@@ -414,29 +507,20 @@
}
};
-TEST_P(BinderRpc, RootObjectIsNull) {
- auto proc = createRpcTestSocketServerProcess(1, 1, [](const sp<RpcServer>& server) {
- // this is the default, but to be explicit
- server->setRootObject(nullptr);
- });
-
- EXPECT_EQ(nullptr, proc.sessions.at(0).root);
-}
-
TEST_P(BinderRpc, Ping) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
ASSERT_NE(proc.rootBinder, nullptr);
EXPECT_EQ(OK, proc.rootBinder->pingBinder());
}
TEST_P(BinderRpc, GetInterfaceDescriptor) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
ASSERT_NE(proc.rootBinder, nullptr);
EXPECT_EQ(IBinderRpcTest::descriptor, proc.rootBinder->getInterfaceDescriptor());
}
TEST_P(BinderRpc, MultipleSessions) {
- auto proc = createRpcTestSocketServerProcess(1 /*threads*/, 5 /*sessions*/);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = 1, .numSessions = 5});
for (auto session : proc.proc.sessions) {
ASSERT_NE(nullptr, session.root);
EXPECT_EQ(OK, session.root->pingBinder());
@@ -444,14 +528,14 @@
}
TEST_P(BinderRpc, TransactionsMustBeMarkedRpc) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
Parcel data;
Parcel reply;
EXPECT_EQ(BAD_TYPE, proc.rootBinder->transact(IBinder::PING_TRANSACTION, data, &reply, 0));
}
TEST_P(BinderRpc, AppendSeparateFormats) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
Parcel p1;
p1.markForBinder(proc.rootBinder);
@@ -464,7 +548,7 @@
}
TEST_P(BinderRpc, UnknownTransaction) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
Parcel data;
data.markForBinder(proc.rootBinder);
Parcel reply;
@@ -472,19 +556,19 @@
}
TEST_P(BinderRpc, SendSomethingOneway) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
EXPECT_OK(proc.rootIface->sendString("asdf"));
}
TEST_P(BinderRpc, SendAndGetResultBack) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
std::string doubled;
EXPECT_OK(proc.rootIface->doubleString("cool ", &doubled));
EXPECT_EQ("cool cool ", doubled);
}
TEST_P(BinderRpc, SendAndGetResultBackBig) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
std::string single = std::string(1024, 'a');
std::string doubled;
EXPECT_OK(proc.rootIface->doubleString(single, &doubled));
@@ -492,7 +576,7 @@
}
TEST_P(BinderRpc, CallMeBack) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
int32_t pingResult;
EXPECT_OK(proc.rootIface->pingMe(new MyBinderRpcSession("foo"), &pingResult));
@@ -502,7 +586,7 @@
}
TEST_P(BinderRpc, RepeatBinder) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> inBinder = new MyBinderRpcSession("foo");
sp<IBinder> outBinder;
@@ -524,7 +608,7 @@
}
TEST_P(BinderRpc, RepeatTheirBinder) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinderRpcSession> session;
EXPECT_OK(proc.rootIface->openSession("aoeu", &session));
@@ -548,7 +632,7 @@
}
TEST_P(BinderRpc, RepeatBinderNull) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> outBinder;
EXPECT_OK(proc.rootIface->repeatBinder(nullptr, &outBinder));
@@ -556,7 +640,7 @@
}
TEST_P(BinderRpc, HoldBinder) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
IBinder* ptr = nullptr;
{
@@ -582,8 +666,8 @@
// aren't supported.
TEST_P(BinderRpc, CannotMixBindersBetweenUnrelatedSocketSessions) {
- auto proc1 = createRpcTestSocketServerProcess(1);
- auto proc2 = createRpcTestSocketServerProcess(1);
+ auto proc1 = createRpcTestSocketServerProcess({});
+ auto proc2 = createRpcTestSocketServerProcess({});
sp<IBinder> outBinder;
EXPECT_EQ(INVALID_OPERATION,
@@ -591,7 +675,7 @@
}
TEST_P(BinderRpc, CannotMixBindersBetweenTwoSessionsToTheSameServer) {
- auto proc = createRpcTestSocketServerProcess(1 /*threads*/, 2 /*sessions*/);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = 1, .numSessions = 2});
sp<IBinder> outBinder;
EXPECT_EQ(INVALID_OPERATION,
@@ -600,7 +684,7 @@
}
TEST_P(BinderRpc, CannotSendRegularBinderOverSocketBinder) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> someRealBinder = IInterface::asBinder(defaultServiceManager());
sp<IBinder> outBinder;
@@ -609,7 +693,7 @@
}
TEST_P(BinderRpc, CannotSendSocketBinderOverRegularBinder) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
// for historical reasons, IServiceManager interface only returns the
// exception code
@@ -620,7 +704,7 @@
// END TESTS FOR LIMITATIONS OF SOCKET BINDER
TEST_P(BinderRpc, RepeatRootObject) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> outBinder;
EXPECT_OK(proc.rootIface->repeatBinder(proc.rootBinder, &outBinder));
@@ -628,7 +712,7 @@
}
TEST_P(BinderRpc, NestedTransactions) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
auto nastyNester = sp<MyBinderRpcTest>::make();
EXPECT_OK(proc.rootIface->nestMe(nastyNester, 10));
@@ -639,7 +723,7 @@
}
TEST_P(BinderRpc, SameBinderEquality) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> a;
EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&a));
@@ -651,7 +735,7 @@
}
TEST_P(BinderRpc, SameBinderEqualityWeak) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinder> a;
EXPECT_OK(proc.rootIface->alwaysGiveMeTheSameBinder(&a));
@@ -683,7 +767,7 @@
} while (false)
TEST_P(BinderRpc, SingleSession) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
sp<IBinderRpcSession> session;
EXPECT_OK(proc.rootIface->openSession("aoeu", &session));
@@ -697,7 +781,7 @@
}
TEST_P(BinderRpc, ManySessions) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
std::vector<sp<IBinderRpcSession>> sessions;
@@ -733,7 +817,7 @@
TEST_P(BinderRpc, ThreadPoolGreaterThanEqualRequested) {
constexpr size_t kNumThreads = 10;
- auto proc = createRpcTestSocketServerProcess(kNumThreads);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = kNumThreads});
EXPECT_OK(proc.rootIface->lock());
@@ -767,7 +851,7 @@
constexpr size_t kNumCalls = kNumThreads + 3;
constexpr size_t kSleepMs = 500;
- auto proc = createRpcTestSocketServerProcess(kNumThreads);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = kNumThreads});
size_t epochMsBefore = epochMillis();
@@ -791,7 +875,7 @@
constexpr size_t kNumServerThreads = 10;
constexpr size_t kNumCalls = 100;
- auto proc = createRpcTestSocketServerProcess(kNumServerThreads);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = kNumServerThreads});
std::vector<std::thread> threads;
for (size_t i = 0; i < kNumClientThreads; i++) {
@@ -810,9 +894,9 @@
TEST_P(BinderRpc, OnewayStressTest) {
constexpr size_t kNumClientThreads = 10;
constexpr size_t kNumServerThreads = 10;
- constexpr size_t kNumCalls = 100;
+ constexpr size_t kNumCalls = 500;
- auto proc = createRpcTestSocketServerProcess(kNumServerThreads);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = kNumServerThreads});
std::vector<std::thread> threads;
for (size_t i = 0; i < kNumClientThreads; i++) {
@@ -833,8 +917,7 @@
constexpr size_t kReallyLongTimeMs = 100;
constexpr size_t kSleepMs = kReallyLongTimeMs * 5;
- // more than one thread, just so this doesn't deadlock
- auto proc = createRpcTestSocketServerProcess(2);
+ auto proc = createRpcTestSocketServerProcess({});
size_t epochMsBefore = epochMillis();
@@ -850,7 +933,7 @@
constexpr size_t kSleepMs = 50;
// make sure calls to the same object happen on the same thread
- auto proc = createRpcTestSocketServerProcess(1 + kNumExtraServerThreads);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = 1 + kNumExtraServerThreads});
EXPECT_OK(proc.rootIface->lock());
@@ -866,11 +949,113 @@
size_t epochMsAfter = epochMillis();
EXPECT_GT(epochMsAfter, epochMsBefore + kSleepMs * kNumSleeps);
+
+ // pending oneway transactions hold ref, make sure we read data on all
+ // sockets
+ std::vector<std::thread> threads;
+ for (size_t i = 0; i < 1 + kNumExtraServerThreads; i++) {
+ threads.push_back(std::thread([&] { EXPECT_OK(proc.rootIface->sleepMs(250)); }));
+ }
+ for (auto& t : threads) t.join();
+}
+
+TEST_P(BinderRpc, OnewayCallExhaustion) {
+ constexpr size_t kNumClients = 2;
+ constexpr size_t kTooLongMs = 1000;
+
+ auto proc = createRpcTestSocketServerProcess({.numThreads = kNumClients, .numSessions = 2});
+
+ // Build up oneway calls on the second session to make sure it terminates
+ // and shuts down. The first session should be unaffected (proc destructor
+ // checks the first session).
+ auto iface = interface_cast<IBinderRpcTest>(proc.proc.sessions.at(1).root);
+
+ std::vector<std::thread> threads;
+ for (size_t i = 0; i < kNumClients; i++) {
+ // one of these threads will get stuck queueing a transaction once the
+ // socket fills up, the other will be able to fill up transactions on
+ // this object
+ threads.push_back(std::thread([&] {
+ while (iface->sleepMsAsync(kTooLongMs).isOk()) {
+ }
+ }));
+ }
+ for (auto& t : threads) t.join();
+
+ Status status = iface->sleepMsAsync(kTooLongMs);
+ EXPECT_EQ(DEAD_OBJECT, status.transactionError()) << status;
+
+ // now that it has died, wait for the remote session to shutdown
+ std::vector<int32_t> remoteCounts;
+ do {
+ EXPECT_OK(proc.rootIface->countBinders(&remoteCounts));
+ } while (remoteCounts.size() == kNumClients);
+
+ // the second session should be shutdown in the other process by the time we
+ // are able to join above (it'll only be hung up once it finishes processing
+ // any pending commands). We need to erase this session from the record
+ // here, so that the destructor for our session won't check that this
+ // session is valid, but we still want it to test the other session.
+ proc.proc.sessions.erase(proc.proc.sessions.begin() + 1);
+}
+
+TEST_P(BinderRpc, Callbacks) {
+ const static std::string kTestString = "good afternoon!";
+
+ for (bool callIsOneway : {true, false}) {
+ for (bool callbackIsOneway : {true, false}) {
+ for (bool delayed : {true, false}) {
+ auto proc = createRpcTestSocketServerProcess(
+ {.numThreads = 1, .numSessions = 1, .numIncomingConnections = 1});
+ auto cb = sp<MyBinderRpcCallback>::make();
+
+ if (callIsOneway) {
+ EXPECT_OK(proc.rootIface->doCallbackAsync(cb, callbackIsOneway, delayed,
+ kTestString));
+ } else {
+ EXPECT_OK(
+ proc.rootIface->doCallback(cb, callbackIsOneway, delayed, kTestString));
+ }
+
+ using std::literals::chrono_literals::operator""s;
+ std::unique_lock<std::mutex> _l(cb->mMutex);
+ cb->mCv.wait_for(_l, 1s, [&] { return !cb->mValues.empty(); });
+
+ EXPECT_EQ(cb->mValues.size(), 1)
+ << "callIsOneway: " << callIsOneway
+ << " callbackIsOneway: " << callbackIsOneway << " delayed: " << delayed;
+ if (cb->mValues.empty()) continue;
+ EXPECT_EQ(cb->mValues.at(0), kTestString)
+ << "callIsOneway: " << callIsOneway
+ << " callbackIsOneway: " << callbackIsOneway << " delayed: " << delayed;
+
+ // since we are severing the connection, we need to go ahead and
+ // tell the server to shutdown and exit so that waitpid won't hang
+ if (auto status = proc.rootIface->scheduleShutdown(); !status.isOk()) {
+ EXPECT_EQ(DEAD_OBJECT, status.transactionError()) << status;
+ }
+
+ // since this session has an incoming connection w/ a threadpool, we
+ // need to manually shut it down
+ EXPECT_TRUE(proc.proc.sessions.at(0).session->shutdownAndWait(true));
+
+ proc.expectAlreadyShutdown = true;
+ }
+ }
+ }
+}
+
+TEST_P(BinderRpc, OnewayCallbackWithNoThread) {
+ auto proc = createRpcTestSocketServerProcess({});
+ auto cb = sp<MyBinderRpcCallback>::make();
+
+ Status status = proc.rootIface->doCallback(cb, true /*oneway*/, false /*delayed*/, "anything");
+ EXPECT_EQ(WOULD_BLOCK, status.transactionError());
}
TEST_P(BinderRpc, Die) {
for (bool doDeathCleanup : {true, false}) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
// make sure there is some state during crash
// 1. we hold their binder
@@ -883,12 +1068,25 @@
EXPECT_EQ(DEAD_OBJECT, proc.rootIface->die(doDeathCleanup).transactionError())
<< "Do death cleanup: " << doDeathCleanup;
- proc.expectInvalid = true;
+ proc.expectAlreadyShutdown = true;
}
}
+TEST_P(BinderRpc, UseKernelBinderCallingId) {
+ auto proc = createRpcTestSocketServerProcess({});
+
+ // we can't allocate IPCThreadState so actually the first time should
+ // succeed :(
+ EXPECT_OK(proc.rootIface->useKernelBinderCallingId());
+
+ // second time! we catch the error :)
+ EXPECT_EQ(DEAD_OBJECT, proc.rootIface->useKernelBinderCallingId().transactionError());
+
+ proc.expectAlreadyShutdown = true;
+}
+
TEST_P(BinderRpc, WorksWithLibbinderNdkPing) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
ndk::SpAIBinder binder = ndk::SpAIBinder(AIBinder_fromPlatformBinder(proc.rootBinder));
ASSERT_NE(binder, nullptr);
@@ -897,7 +1095,7 @@
}
TEST_P(BinderRpc, WorksWithLibbinderNdkUserTransaction) {
- auto proc = createRpcTestSocketServerProcess(1);
+ auto proc = createRpcTestSocketServerProcess({});
ndk::SpAIBinder binder = ndk::SpAIBinder(AIBinder_fromPlatformBinder(proc.rootBinder));
ASSERT_NE(binder, nullptr);
@@ -925,21 +1123,39 @@
ssize_t beforeFds = countFds();
ASSERT_GE(beforeFds, 0);
{
- auto proc = createRpcTestSocketServerProcess(10);
+ auto proc = createRpcTestSocketServerProcess({.numThreads = 10});
ASSERT_EQ(OK, proc.rootBinder->pingBinder());
}
ASSERT_EQ(beforeFds, countFds()) << (system("ls -l /proc/self/fd/"), "fd leak?");
}
-INSTANTIATE_TEST_CASE_P(PerSocket, BinderRpc,
- ::testing::ValuesIn({
- SocketType::UNIX,
-// TODO(b/185269356): working on host
-#ifdef __BIONIC__
- SocketType::VSOCK,
-#endif
- SocketType::INET,
- }),
+static bool testSupportVsockLoopback() {
+ unsigned int vsockPort = allocateVsockPort();
+ sp<RpcServer> server = RpcServer::make();
+ server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ CHECK(server->setupVsockServer(vsockPort));
+ server->start();
+
+ sp<RpcSession> session = RpcSession::make();
+ bool okay = session->setupVsockClient(VMADDR_CID_LOCAL, vsockPort);
+ while (!server->shutdown()) usleep(10000);
+ ALOGE("Detected vsock loopback supported: %d", okay);
+ return okay;
+}
+
+static std::vector<SocketType> testSocketTypes() {
+ std::vector<SocketType> ret = {SocketType::UNIX, SocketType::INET};
+
+ static bool hasVsockLoopback = testSupportVsockLoopback();
+
+ if (hasVsockLoopback) {
+ ret.push_back(SocketType::VSOCK);
+ }
+
+ return ret;
+}
+
+INSTANTIATE_TEST_CASE_P(PerSocket, BinderRpc, ::testing::ValuesIn(testSocketTypes()),
PrintSocketType);
class BinderRpcServerRootObject : public ::testing::TestWithParam<std::tuple<bool, bool>> {};
@@ -970,6 +1186,91 @@
INSTANTIATE_TEST_CASE_P(BinderRpc, BinderRpcServerRootObject,
::testing::Combine(::testing::Bool(), ::testing::Bool()));
+class OneOffSignal {
+public:
+ // If notify() was previously called, or is called within |duration|, return true; else false.
+ template <typename R, typename P>
+ bool wait(std::chrono::duration<R, P> duration) {
+ std::unique_lock<std::mutex> lock(mMutex);
+ return mCv.wait_for(lock, duration, [this] { return mValue; });
+ }
+ void notify() {
+ std::unique_lock<std::mutex> lock(mMutex);
+ mValue = true;
+ lock.unlock();
+ mCv.notify_all();
+ }
+
+private:
+ std::mutex mMutex;
+ std::condition_variable mCv;
+ bool mValue = false;
+};
+
+TEST(BinderRpc, Shutdown) {
+ auto addr = allocateSocketAddress();
+ unlink(addr.c_str());
+ auto server = RpcServer::make();
+ server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ ASSERT_TRUE(server->setupUnixDomainServer(addr.c_str()));
+ auto joinEnds = std::make_shared<OneOffSignal>();
+
+ // If things are broken and the thread never stops, don't block other tests. Because the thread
+ // may run after the test finishes, it must not access the stack memory of the test. Hence,
+ // shared pointers are passed.
+ std::thread([server, joinEnds] {
+ server->join();
+ joinEnds->notify();
+ }).detach();
+
+ bool shutdown = false;
+ for (int i = 0; i < 10 && !shutdown; i++) {
+ usleep(300 * 1000); // 300ms; total 3s
+ if (server->shutdown()) shutdown = true;
+ }
+ ASSERT_TRUE(shutdown) << "server->shutdown() never returns true";
+
+ ASSERT_TRUE(joinEnds->wait(2s))
+ << "After server->shutdown() returns true, join() did not stop after 2s";
+}
+
+TEST(BinderRpc, Java) {
+#if !defined(__ANDROID__)
+ GTEST_SKIP() << "This test is only run on Android. Though it can technically run on host on"
+ "createRpcDelegateServiceManager() with a device attached, such test belongs "
+ "to binderHostDeviceTest. Hence, just disable this test on host.";
+#endif // !__ANDROID__
+ sp<IServiceManager> sm = defaultServiceManager();
+ ASSERT_NE(nullptr, sm);
+ // Any Java service with non-empty getInterfaceDescriptor() would do.
+ // Let's pick batteryproperties.
+ auto binder = sm->checkService(String16("batteryproperties"));
+ ASSERT_NE(nullptr, binder);
+ auto descriptor = binder->getInterfaceDescriptor();
+ ASSERT_GE(descriptor.size(), 0);
+ ASSERT_EQ(OK, binder->pingBinder());
+
+ auto rpcServer = RpcServer::make();
+ rpcServer->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
+ unsigned int port;
+ ASSERT_TRUE(rpcServer->setupInetServer(0, &port));
+ auto socket = rpcServer->releaseServer();
+
+ auto keepAlive = sp<BBinder>::make();
+ ASSERT_EQ(OK, binder->setRpcClientDebug(std::move(socket), keepAlive));
+
+ auto rpcSession = RpcSession::make();
+ ASSERT_TRUE(rpcSession->setupInetClient("127.0.0.1", port));
+ auto rpcBinder = rpcSession->getRootObject();
+ ASSERT_NE(nullptr, rpcBinder);
+
+ ASSERT_EQ(OK, rpcBinder->pingBinder());
+
+ ASSERT_EQ(descriptor, rpcBinder->getInterfaceDescriptor())
+ << "getInterfaceDescriptor should not crash system_server";
+ ASSERT_EQ(OK, rpcBinder->pingBinder());
+}
+
} // namespace android
int main(int argc, char** argv) {
diff --git a/libs/binder/tests/binderStabilityTest.cpp b/libs/binder/tests/binderStabilityTest.cpp
index 2ce13df..6c3b3d9 100644
--- a/libs/binder/tests/binderStabilityTest.cpp
+++ b/libs/binder/tests/binderStabilityTest.cpp
@@ -102,7 +102,7 @@
return Status::ok();
}
Status sendAndCallBinder(const sp<IBinder>& binder) override {
- Stability::debugLogStability("sendAndCallBinder got binder", binder);
+ ALOGI("Debug log stability: %s", Stability::debugToString(binder).c_str());
return Status::fromExceptionCode(BadStableBinder::doUserTransaction(binder));
}
Status returnNoStabilityBinder(sp<IBinder>* _aidl_return) override {
diff --git a/libs/binder/tests/binderUtilsHostTest.cpp b/libs/binder/tests/binderUtilsHostTest.cpp
new file mode 100644
index 0000000..fb24836
--- /dev/null
+++ b/libs/binder/tests/binderUtilsHostTest.cpp
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sysexits.h>
+
+#include <chrono>
+
+#include <android-base/result-gmock.h>
+#include <android-base/strings.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "../UtilsHost.h"
+
+using android::base::testing::Ok;
+using testing::Optional;
+
+namespace android {
+
+TEST(UtilsHost, ExecuteImmediately) {
+ auto result = execute({"echo", "foo"}, nullptr);
+ ASSERT_THAT(result, Ok());
+ EXPECT_THAT(result->exitCode, Optional(EX_OK));
+ EXPECT_EQ(result->stdout, "foo\n");
+}
+
+TEST(UtilsHost, ExecuteLongRunning) {
+ auto now = std::chrono::system_clock::now();
+
+ {
+ std::vector<std::string> args{"sh", "-c",
+ "sleep 0.5 && echo -n f && sleep 0.5 && echo oo && sleep 1"};
+ auto result = execute(std::move(args), [](const CommandResult& commandResult) {
+ return android::base::EndsWith(commandResult.stdout, "\n");
+ });
+ auto elapsed = std::chrono::system_clock::now() - now;
+ auto elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
+ EXPECT_GE(elapsedMs, 1000);
+ EXPECT_LT(elapsedMs, 2000);
+
+ ASSERT_THAT(result, Ok());
+ EXPECT_EQ(std::nullopt, result->exitCode);
+ EXPECT_EQ(result->stdout, "foo\n");
+ }
+
+ // ~CommandResult() called, child process is killed.
+ // Assert that the second sleep does not finish.
+ auto elapsed = std::chrono::system_clock::now() - now;
+ auto elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
+ EXPECT_LT(elapsedMs, 2000);
+}
+
+TEST(UtilsHost, ExecuteLongRunning2) {
+ auto now = std::chrono::system_clock::now();
+
+ {
+ std::vector<std::string> args{"sh", "-c",
+ "sleep 2 && echo -n f && sleep 2 && echo oo && sleep 2"};
+ auto result = execute(std::move(args), [](const CommandResult& commandResult) {
+ return android::base::EndsWith(commandResult.stdout, "\n");
+ });
+ auto elapsed = std::chrono::system_clock::now() - now;
+ auto elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
+ EXPECT_GE(elapsedMs, 4000);
+ EXPECT_LT(elapsedMs, 6000);
+
+ ASSERT_THAT(result, Ok());
+ EXPECT_EQ(std::nullopt, result->exitCode);
+ EXPECT_EQ(result->stdout, "foo\n");
+ }
+
+ // ~CommandResult() called, child process is killed.
+ // Assert that the second sleep does not finish.
+ auto elapsed = std::chrono::system_clock::now() - now;
+ auto elapsedMs = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
+ EXPECT_LT(elapsedMs, 6000);
+}
+
+TEST(UtilsHost, KillWithSigKill) {
+ std::vector<std::string> args{"sh", "-c", "echo foo && sleep 10"};
+ auto result = execute(std::move(args), [](const CommandResult& commandResult) {
+ // FOR TEST PURPOSE ONLY. DON'T DO THIS!
+ if (commandResult.pid.has_value()) {
+ (void)kill(*commandResult.pid, SIGKILL);
+ }
+ // FOR TEST PURPOSE ONLY. DON'T DO THIS!
+ return false;
+ });
+
+ ASSERT_THAT(result, Ok());
+ EXPECT_EQ(std::nullopt, result->exitCode);
+ EXPECT_THAT(result->signal, Optional(SIGKILL));
+}
+
+} // namespace android
diff --git a/libs/binder/tests/parcel_fuzzer/binder.cpp b/libs/binder/tests/parcel_fuzzer/binder.cpp
index 624def1..a717ce9 100644
--- a/libs/binder/tests/parcel_fuzzer/binder.cpp
+++ b/libs/binder/tests/parcel_fuzzer/binder.cpp
@@ -66,6 +66,10 @@
int32_t mValue = 0;
};
+struct BigStruct {
+ uint8_t data[1337];
+};
+
#define PARCEL_READ_WITH_STATUS(T, FUN) \
[] (const ::android::Parcel& p, uint8_t /*data*/) {\
FUZZ_LOG() << "about to read " #T " using " #FUN " with status";\
@@ -165,22 +169,20 @@
PARCEL_READ_WITH_STATUS(android::sp<android::IBinder>, readStrongBinder),
PARCEL_READ_WITH_STATUS(android::sp<android::IBinder>, readNullableStrongBinder),
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // PARCEL_READ_WITH_STATUS(std::vector<ByteEnum>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<ByteEnum>>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<ByteEnum>>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::vector<IntEnum>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<IntEnum>>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<IntEnum>>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::vector<LongEnum>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<LongEnum>>, readEnumVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<LongEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::vector<ByteEnum>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<ByteEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<ByteEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::vector<IntEnum>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<IntEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<IntEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::vector<LongEnum>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<LongEnum>>, readEnumVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<LongEnum>>, readEnumVector),
// only reading one parcelable type for now
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<ExampleParcelable>>>, readParcelableVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<ExampleParcelable>>>, readParcelableVector),
- // PARCEL_READ_WITH_STATUS(std::vector<ExampleParcelable>, readParcelableVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<ExampleParcelable>>>, readParcelableVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<ExampleParcelable>>>, readParcelableVector),
+ PARCEL_READ_WITH_STATUS(std::vector<ExampleParcelable>, readParcelableVector),
PARCEL_READ_WITH_STATUS(ExampleParcelable, readParcelable),
PARCEL_READ_WITH_STATUS(std::unique_ptr<ExampleParcelable>, readParcelable),
PARCEL_READ_WITH_STATUS(std::optional<ExampleParcelable>, readParcelable),
@@ -189,45 +191,43 @@
PARCEL_READ_WITH_STATUS(android::sp<android::os::IServiceManager>, readStrongBinder),
PARCEL_READ_WITH_STATUS(android::sp<android::os::IServiceManager>, readNullableStrongBinder),
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // PARCEL_READ_WITH_STATUS(::std::unique_ptr<std::vector<android::sp<android::IBinder>>>, readStrongBinderVector),
- // PARCEL_READ_WITH_STATUS(::std::optional<std::vector<android::sp<android::IBinder>>>, readStrongBinderVector),
- // PARCEL_READ_WITH_STATUS(std::vector<android::sp<android::IBinder>>, readStrongBinderVector),
+ PARCEL_READ_WITH_STATUS(::std::unique_ptr<std::vector<android::sp<android::IBinder>>>, readStrongBinderVector),
+ PARCEL_READ_WITH_STATUS(::std::optional<std::vector<android::sp<android::IBinder>>>, readStrongBinderVector),
+ PARCEL_READ_WITH_STATUS(std::vector<android::sp<android::IBinder>>, readStrongBinderVector),
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int8_t>>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<int8_t>>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::vector<int8_t>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<uint8_t>>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<uint8_t>>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::vector<uint8_t>, readByteVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int32_t>>, readInt32Vector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<int32_t>>, readInt32Vector),
- // PARCEL_READ_WITH_STATUS(std::vector<int32_t>, readInt32Vector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int64_t>>, readInt64Vector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<int64_t>>, readInt64Vector),
- // PARCEL_READ_WITH_STATUS(std::vector<int64_t>, readInt64Vector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<uint64_t>>, readUint64Vector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<uint64_t>>, readUint64Vector),
- // PARCEL_READ_WITH_STATUS(std::vector<uint64_t>, readUint64Vector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<float>>, readFloatVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<float>>, readFloatVector),
- // PARCEL_READ_WITH_STATUS(std::vector<float>, readFloatVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<double>>, readDoubleVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<double>>, readDoubleVector),
- // PARCEL_READ_WITH_STATUS(std::vector<double>, readDoubleVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<bool>>, readBoolVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<bool>>, readBoolVector),
- // PARCEL_READ_WITH_STATUS(std::vector<bool>, readBoolVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<char16_t>>, readCharVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<char16_t>>, readCharVector),
- // PARCEL_READ_WITH_STATUS(std::vector<char16_t>, readCharVector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<android::String16>>>, readString16Vector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<android::String16>>>, readString16Vector),
- // PARCEL_READ_WITH_STATUS(std::vector<android::String16>, readString16Vector),
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<std::string>>>, readUtf8VectorFromUtf16Vector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<std::string>>>, readUtf8VectorFromUtf16Vector),
- // PARCEL_READ_WITH_STATUS(std::vector<std::string>, readUtf8VectorFromUtf16Vector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int8_t>>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<int8_t>>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::vector<int8_t>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<uint8_t>>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<uint8_t>>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::vector<uint8_t>, readByteVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int32_t>>, readInt32Vector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<int32_t>>, readInt32Vector),
+ PARCEL_READ_WITH_STATUS(std::vector<int32_t>, readInt32Vector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<int64_t>>, readInt64Vector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<int64_t>>, readInt64Vector),
+ PARCEL_READ_WITH_STATUS(std::vector<int64_t>, readInt64Vector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<uint64_t>>, readUint64Vector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<uint64_t>>, readUint64Vector),
+ PARCEL_READ_WITH_STATUS(std::vector<uint64_t>, readUint64Vector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<float>>, readFloatVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<float>>, readFloatVector),
+ PARCEL_READ_WITH_STATUS(std::vector<float>, readFloatVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<double>>, readDoubleVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<double>>, readDoubleVector),
+ PARCEL_READ_WITH_STATUS(std::vector<double>, readDoubleVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<bool>>, readBoolVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<bool>>, readBoolVector),
+ PARCEL_READ_WITH_STATUS(std::vector<bool>, readBoolVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<char16_t>>, readCharVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<char16_t>>, readCharVector),
+ PARCEL_READ_WITH_STATUS(std::vector<char16_t>, readCharVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<android::String16>>>, readString16Vector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<android::String16>>>, readString16Vector),
+ PARCEL_READ_WITH_STATUS(std::vector<android::String16>, readString16Vector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<std::unique_ptr<std::string>>>, readUtf8VectorFromUtf16Vector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<std::optional<std::string>>>, readUtf8VectorFromUtf16Vector),
+ PARCEL_READ_WITH_STATUS(std::vector<std::string>, readUtf8VectorFromUtf16Vector),
[] (const android::Parcel& p, uint8_t /*len*/) {
FUZZ_LOG() << "about to read flattenable";
@@ -242,8 +242,12 @@
FUZZ_LOG() << "read lite flattenable: " << status;
},
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // TODO: resizeOutVector
+ PARCEL_READ_WITH_STATUS(std::vector<uint8_t>, resizeOutVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<uint8_t>>, resizeOutVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<uint8_t>>, resizeOutVector),
+ PARCEL_READ_WITH_STATUS(std::vector<BigStruct>, resizeOutVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<BigStruct>>, resizeOutVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<BigStruct>>, resizeOutVector),
PARCEL_READ_NO_STATUS(int32_t, readExceptionCode),
[] (const android::Parcel& p, uint8_t /*len*/) {
@@ -261,10 +265,9 @@
PARCEL_READ_NO_STATUS(int, readParcelFileDescriptor),
PARCEL_READ_WITH_STATUS(android::base::unique_fd, readUniqueFileDescriptor),
- // TODO(b/131868573): can force read of arbitrarily sized vector
- // PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<android::base::unique_fd>>, readUniqueFileDescriptorVector),
- // PARCEL_READ_WITH_STATUS(std::optional<std::vector<android::base::unique_fd>>, readUniqueFileDescriptorVector),
- // PARCEL_READ_WITH_STATUS(std::vector<android::base::unique_fd>, readUniqueFileDescriptorVector),
+ PARCEL_READ_WITH_STATUS(std::unique_ptr<std::vector<android::base::unique_fd>>, readUniqueFileDescriptorVector),
+ PARCEL_READ_WITH_STATUS(std::optional<std::vector<android::base::unique_fd>>, readUniqueFileDescriptorVector),
+ PARCEL_READ_WITH_STATUS(std::vector<android::base::unique_fd>, readUniqueFileDescriptorVector),
[] (const android::Parcel& p, uint8_t len) {
FUZZ_LOG() << "about to readBlob";
diff --git a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
index 008780c..6b783a4 100644
--- a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
+++ b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
@@ -91,28 +91,27 @@
PARCEL_READ(ndk::ScopedFileDescriptor, ndk::AParcel_readRequiredParcelFileDescriptor),
PARCEL_READ(std::string, ndk::AParcel_readString),
PARCEL_READ(std::optional<std::string>, ndk::AParcel_readString),
- // TODO(b/131868573): can force process to allocate arbitrary amount of
- // memory
- // PARCEL_READ(std::vector<std::string>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<std::optional<std::string>>>,
- // ndk::AParcel_readVector), PARCEL_READ(std::vector<SomeParcelable>,
- // ndk::AParcel_readVector), PARCEL_READ(std::vector<int32_t>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<int32_t>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<uint32_t>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<uint32_t>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<int64_t>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<int64_t>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<uint64_t>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<uint64_t>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<float>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<float>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<double>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<double>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<bool>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<bool>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<char16_t>, ndk::AParcel_readVector),
- // PARCEL_READ(std::optional<std::vector<char16_t>>, ndk::AParcel_readVector),
- // PARCEL_READ(std::vector<int32_t>, ndk::AParcel_resizeVector),
- // PARCEL_READ(std::optional<std::vector<int32_t>>, ndk::AParcel_resizeVector),
+
+ PARCEL_READ(std::vector<std::string>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<std::optional<std::string>>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<SomeParcelable>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<int32_t>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<int32_t>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<uint32_t>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<uint32_t>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<int64_t>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<int64_t>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<uint64_t>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<uint64_t>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<float>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<float>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<double>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<double>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<bool>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<bool>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<char16_t>, ndk::AParcel_readVector),
+ PARCEL_READ(std::optional<std::vector<char16_t>>, ndk::AParcel_readVector),
+ PARCEL_READ(std::vector<int32_t>, ndk::AParcel_resizeVector),
+ PARCEL_READ(std::optional<std::vector<int32_t>>, ndk::AParcel_resizeVector),
};
// clang-format on
diff --git a/libs/binder/tests/parcel_fuzzer/hwbinder.cpp b/libs/binder/tests/parcel_fuzzer/hwbinder.cpp
index 0fec393..35b5ebc 100644
--- a/libs/binder/tests/parcel_fuzzer/hwbinder.cpp
+++ b/libs/binder/tests/parcel_fuzzer/hwbinder.cpp
@@ -148,28 +148,6 @@
// should be null since we don't create any IPC objects
CHECK(data == nullptr) << data;
},
- [] (const ::android::hardware::Parcel& p, uint8_t size) {
- FUZZ_LOG() << "about to readEmbeddedNativeHandle";
- size_t parent_buffer_handle = size & 0xf;
- size_t parent_offset = size >> 4;
- const native_handle_t* handle = nullptr;
- status_t status = p.readEmbeddedNativeHandle(parent_buffer_handle, parent_offset, &handle);
- FUZZ_LOG() << "readEmbeddedNativeHandle status: " << status << " handle: " << handle << " handle: " << handle;
-
- // should be null since we don't create any IPC objects
- CHECK(handle == nullptr) << handle;
- },
- [] (const ::android::hardware::Parcel& p, uint8_t size) {
- FUZZ_LOG() << "about to readNullableEmbeddedNativeHandle";
- size_t parent_buffer_handle = size & 0xf;
- size_t parent_offset = size >> 4;
- const native_handle_t* handle = nullptr;
- status_t status = p.readNullableEmbeddedNativeHandle(parent_buffer_handle, parent_offset, &handle);
- FUZZ_LOG() << "readNullableEmbeddedNativeHandle status: " << status << " handle: " << handle << " handle: " << handle;
-
- // should be null since we don't create any IPC objects
- CHECK(handle == nullptr) << handle;
- },
[] (const ::android::hardware::Parcel& p, uint8_t /*data*/) {
FUZZ_LOG() << "about to readNativeHandleNoDup";
const native_handle_t* handle = nullptr;
@@ -180,14 +158,5 @@
CHECK(handle == nullptr) << handle;
CHECK(status != ::android::OK);
},
- [] (const ::android::hardware::Parcel& p, uint8_t /*data*/) {
- FUZZ_LOG() << "about to readNullableNativeHandleNoDup";
- const native_handle_t* handle = nullptr;
- status_t status = p.readNullableNativeHandleNoDup(&handle);
- FUZZ_LOG() << "readNullableNativeHandleNoDup status: " << status << " handle: " << handle;
-
- // should be null since we don't create any IPC objects
- CHECK(handle == nullptr) << handle;
- },
};
// clang-format on
diff --git a/libs/binder/tests/parcel_fuzzer/main.cpp b/libs/binder/tests/parcel_fuzzer/main.cpp
index a47b753..2a79e85 100644
--- a/libs/binder/tests/parcel_fuzzer/main.cpp
+++ b/libs/binder/tests/parcel_fuzzer/main.cpp
@@ -23,7 +23,8 @@
#include <iostream>
#include <android-base/logging.h>
-#include <binder/RpcSession.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_libbinder.h>
#include <fuzzbinder/random_parcel.h>
#include <fuzzer/FuzzedDataProvider.h>
@@ -33,7 +34,6 @@
#include <sys/time.h>
using android::fillRandomParcel;
-using android::RpcSession;
using android::sp;
void fillRandomParcel(::android::hardware::Parcel* p, FuzzedDataProvider&& provider) {
@@ -46,9 +46,22 @@
fillRandomParcel(p->parcel(), std::move(provider));
}
+template <typename P, typename B>
+void doTransactFuzz(const char* backend, const sp<B>& binder, FuzzedDataProvider&& provider) {
+ uint32_t code = provider.ConsumeIntegral<uint32_t>();
+ uint32_t flag = provider.ConsumeIntegral<uint32_t>();
+
+ FUZZ_LOG() << "backend: " << backend;
+
+ P reply;
+ P data;
+ fillRandomParcel(&data, std::move(provider));
+ (void)binder->transact(code, data, &reply, flag);
+}
+
template <typename P>
-void doFuzz(const char* backend, const std::vector<ParcelRead<P>>& reads,
- FuzzedDataProvider&& provider) {
+void doReadFuzz(const char* backend, const std::vector<ParcelRead<P>>& reads,
+ FuzzedDataProvider&& provider) {
// Allow some majority of the bytes to be dedicated to telling us what to
// do. The fixed value added here represents that we want to test doing a
// lot of 'instructions' even on really short parcels.
@@ -59,18 +72,7 @@
provider.ConsumeIntegralInRange<size_t>(0, maxInstructions));
P p;
- if constexpr (std::is_same_v<P, android::Parcel>) {
- if (provider.ConsumeBool()) {
- auto session = sp<RpcSession>::make();
- CHECK(session->addNullDebuggingClient());
- p.markForRpc(session);
- fillRandomParcelData(&p, std::move(provider));
- } else {
- fillRandomParcel(&p, std::move(provider));
- }
- } else {
- fillRandomParcel(&p, std::move(provider));
- }
+ fillRandomParcel(&p, std::move(provider));
// since we are only using a byte to index
CHECK(reads.size() <= 255) << reads.size();
@@ -95,25 +97,18 @@
}
}
-size_t getHardMemoryLimit() {
- struct rlimit limit;
- CHECK(0 == getrlimit(RLIMIT_AS, &limit)) << errno;
- return limit.rlim_max;
+void* NothingClass_onCreate(void* args) {
+ return args;
}
-
-void setMemoryLimit(size_t cur, size_t max) {
- const struct rlimit kLimit = {
- .rlim_cur = cur,
- .rlim_max = max,
- };
- CHECK(0 == setrlimit(RLIMIT_AS, &kLimit)) << errno;
+void NothingClass_onDestroy(void* /*userData*/) {}
+binder_status_t NothingClass_onTransact(AIBinder*, transaction_code_t, const AParcel*, AParcel*) {
+ return STATUS_UNKNOWN_ERROR;
}
+static AIBinder_Class* kNothingClass =
+ AIBinder_Class_define("nothing", NothingClass_onCreate, NothingClass_onDestroy,
+ NothingClass_onTransact);
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
- static constexpr size_t kMemLimit = 1 * 1024 * 1024;
- size_t hardLimit = getHardMemoryLimit();
- setMemoryLimit(std::min(kMemLimit, hardLimit), hardLimit);
-
if (size <= 1) return 0; // no use
// avoid timeouts, see b/142617274, b/142473153
@@ -121,24 +116,39 @@
FuzzedDataProvider provider = FuzzedDataProvider(data, size);
- const std::function<void(FuzzedDataProvider &&)> fuzzBackend[3] = {
+ const std::function<void(FuzzedDataProvider &&)> fuzzBackend[] = {
[](FuzzedDataProvider&& provider) {
- doFuzz<::android::hardware::Parcel>("hwbinder", HWBINDER_PARCEL_READ_FUNCTIONS,
- std::move(provider));
+ doTransactFuzz<
+ ::android::hardware::Parcel>("hwbinder",
+ sp<::android::hardware::BHwBinder>::make(),
+ std::move(provider));
},
[](FuzzedDataProvider&& provider) {
- doFuzz<::android::Parcel>("binder", BINDER_PARCEL_READ_FUNCTIONS,
- std::move(provider));
+ doTransactFuzz<::android::Parcel>("binder", sp<::android::BBinder>::make(),
+ std::move(provider));
},
[](FuzzedDataProvider&& provider) {
- doFuzz<NdkParcelAdapter>("binder_ndk", BINDER_NDK_PARCEL_READ_FUNCTIONS,
- std::move(provider));
+ // fuzz from the libbinder layer since it's a superset of the
+ // interface you get at the libbinder_ndk layer
+ auto ndkBinder = ndk::SpAIBinder(AIBinder_new(kNothingClass, nullptr));
+ auto binder = AIBinder_toPlatformBinder(ndkBinder.get());
+ doTransactFuzz<::android::Parcel>("binder_ndk", binder, std::move(provider));
+ },
+ [](FuzzedDataProvider&& provider) {
+ doReadFuzz<::android::hardware::Parcel>("hwbinder", HWBINDER_PARCEL_READ_FUNCTIONS,
+ std::move(provider));
+ },
+ [](FuzzedDataProvider&& provider) {
+ doReadFuzz<::android::Parcel>("binder", BINDER_PARCEL_READ_FUNCTIONS,
+ std::move(provider));
+ },
+ [](FuzzedDataProvider&& provider) {
+ doReadFuzz<NdkParcelAdapter>("binder_ndk", BINDER_NDK_PARCEL_READ_FUNCTIONS,
+ std::move(provider));
},
};
provider.PickValueInArray(fuzzBackend)(std::move(provider));
- setMemoryLimit(hardLimit, hardLimit);
-
return 0;
}
diff --git a/libs/binder/tests/parcel_fuzzer/random_parcel.cpp b/libs/binder/tests/parcel_fuzzer/random_parcel.cpp
index b045a22..92fdc72 100644
--- a/libs/binder/tests/parcel_fuzzer/random_parcel.cpp
+++ b/libs/binder/tests/parcel_fuzzer/random_parcel.cpp
@@ -18,6 +18,7 @@
#include <android-base/logging.h>
#include <binder/IServiceManager.h>
+#include <binder/RpcSession.h>
#include <fuzzbinder/random_fd.h>
#include <utils/String16.h>
@@ -33,6 +34,14 @@
};
void fillRandomParcel(Parcel* p, FuzzedDataProvider&& provider) {
+ if (provider.ConsumeBool()) {
+ auto session = sp<RpcSession>::make();
+ CHECK(session->addNullDebuggingClient());
+ p->markForRpc(session);
+ fillRandomParcelData(p, std::move(provider));
+ return;
+ }
+
while (provider.remaining_bytes() > 0) {
auto fillFunc = provider.PickValueInArray<const std::function<void()>>({
// write data
diff --git a/libs/binder/tests/rpc_fuzzer/main.cpp b/libs/binder/tests/rpc_fuzzer/main.cpp
index 3603ebe..9fc496f 100644
--- a/libs/binder/tests/rpc_fuzzer/main.cpp
+++ b/libs/binder/tests/rpc_fuzzer/main.cpp
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <binder/Binder.h>
#include <binder/Parcel.h>
#include <binder/RpcServer.h>
#include <binder/RpcSession.h>
+#include <fuzzer/FuzzedDataProvider.h>
#include <sys/resource.h>
#include <sys/un.h>
@@ -29,20 +29,6 @@
static const std::string kSock = std::string(getenv("TMPDIR") ?: "/tmp") +
"/binderRpcFuzzerSocket_" + std::to_string(getpid());
-size_t getHardMemoryLimit() {
- struct rlimit limit;
- CHECK(0 == getrlimit(RLIMIT_AS, &limit)) << errno;
- return limit.rlim_max;
-}
-
-void setMemoryLimit(size_t cur, size_t max) {
- const struct rlimit kLimit = {
- .rlim_cur = cur,
- .rlim_max = max,
- };
- CHECK(0 == setrlimit(RLIMIT_AS, &kLimit)) << errno;
-}
-
class SomeBinder : public BBinder {
status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) {
(void)flags;
@@ -67,6 +53,7 @@
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
if (size > 50000) return 0;
+ FuzzedDataProvider provider(data, size);
unlink(kSock.c_str());
@@ -75,11 +62,7 @@
server->iUnderstandThisCodeIsExperimentalAndIWillNotUseItInProduction();
CHECK(server->setupUnixDomainServer(kSock.c_str()));
- static constexpr size_t kMemLimit = 1llu * 1024 * 1024 * 1024;
- size_t hardLimit = getHardMemoryLimit();
- setMemoryLimit(std::min(kMemLimit, hardLimit), hardLimit);
-
- std::thread serverThread([=] { (void)server->acceptOne(); });
+ std::thread serverThread([=] { (void)server->join(); });
sockaddr_un addr{
.sun_family = AF_UNIX,
@@ -87,33 +70,45 @@
CHECK_LT(kSock.size(), sizeof(addr.sun_path));
memcpy(&addr.sun_path, kSock.c_str(), kSock.size());
- base::unique_fd clientFd(TEMP_FAILURE_RETRY(socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)));
- CHECK_NE(clientFd.get(), -1);
- CHECK_EQ(0,
- TEMP_FAILURE_RETRY(
- connect(clientFd.get(), reinterpret_cast<sockaddr*>(&addr), sizeof(addr))))
- << strerror(errno);
+ std::vector<base::unique_fd> connections;
- serverThread.join();
+ bool hangupBeforeShutdown = provider.ConsumeBool();
- // TODO(b/182938024): fuzz multiple sessions, instead of just one
+ while (provider.remaining_bytes() > 0) {
+ if (connections.empty() || provider.ConsumeBool()) {
+ base::unique_fd fd(TEMP_FAILURE_RETRY(socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)));
+ CHECK_NE(fd.get(), -1);
+ CHECK_EQ(0,
+ TEMP_FAILURE_RETRY(
+ connect(fd.get(), reinterpret_cast<sockaddr*>(&addr), sizeof(addr))))
+ << strerror(errno);
+ connections.push_back(std::move(fd));
+ } else {
+ size_t idx = provider.ConsumeIntegralInRange<size_t>(0, connections.size() - 1);
-#if 0
- // make fuzzer more productive locally by forcing it to create a new session
- int32_t id = -1;
- CHECK(base::WriteFully(clientFd, &id, sizeof(id)));
-#endif
-
- CHECK(base::WriteFully(clientFd, data, size));
-
- clientFd.reset();
-
- // TODO(b/185167543): better way to force a server to shutdown
- while (!server->listSessions().empty() && server->numUninitializedSessions()) {
- usleep(1);
+ if (provider.ConsumeBool()) {
+ std::vector<uint8_t> writeData = provider.ConsumeBytes<uint8_t>(
+ provider.ConsumeIntegralInRange<size_t>(0, provider.remaining_bytes()));
+ ssize_t size = TEMP_FAILURE_RETRY(send(connections.at(idx).get(), writeData.data(),
+ writeData.size(), MSG_NOSIGNAL));
+ CHECK(errno == EPIPE || size == writeData.size())
+ << size << " " << writeData.size() << " " << strerror(errno);
+ } else {
+ connections.erase(connections.begin() + idx); // hang up
+ }
+ }
}
- setMemoryLimit(hardLimit, hardLimit);
+ if (hangupBeforeShutdown) {
+ connections.clear();
+ while (!server->listSessions().empty() && server->numUninitializedSessions()) {
+ // wait for all threads to finish processing existing information
+ usleep(1);
+ }
+ }
+
+ while (!server->shutdown()) usleep(1);
+ serverThread.join();
return 0;
}
diff --git a/libs/binder/tests/unit_fuzzers/BinderFuzzFunctions.h b/libs/binder/tests/unit_fuzzers/BinderFuzzFunctions.h
index 69f1b9d..8d2b714 100644
--- a/libs/binder/tests/unit_fuzzers/BinderFuzzFunctions.h
+++ b/libs/binder/tests/unit_fuzzers/BinderFuzzFunctions.h
@@ -72,6 +72,10 @@
},
[](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
bbinder->getDebugPid();
+ },
+ [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
+ (void)bbinder->setRpcClientDebug(android::base::unique_fd(),
+ sp<BBinder>::make());
}};
} // namespace android
diff --git a/libs/binder/tests/unit_fuzzers/IBinderFuzzFunctions.h b/libs/binder/tests/unit_fuzzers/IBinderFuzzFunctions.h
index 626b758..4a0aeba 100644
--- a/libs/binder/tests/unit_fuzzers/IBinderFuzzFunctions.h
+++ b/libs/binder/tests/unit_fuzzers/IBinderFuzzFunctions.h
@@ -62,20 +62,22 @@
object = fdp->ConsumeIntegral<uint32_t>();
cleanup_cookie = fdp->ConsumeIntegral<uint32_t>();
IBinder::object_cleanup_func func = IBinder::object_cleanup_func();
- ibinder->attachObject(fdp->ConsumeBool() ? reinterpret_cast<void*>(&objectID)
- : nullptr,
- fdp->ConsumeBool() ? reinterpret_cast<void*>(&object) : nullptr,
- fdp->ConsumeBool() ? reinterpret_cast<void*>(&cleanup_cookie)
- : nullptr,
- func);
+ (void)ibinder->attachObject(fdp->ConsumeBool() ? reinterpret_cast<void*>(&objectID)
+ : nullptr,
+ fdp->ConsumeBool() ? reinterpret_cast<void*>(&object)
+ : nullptr,
+ fdp->ConsumeBool()
+ ? reinterpret_cast<void*>(&cleanup_cookie)
+ : nullptr,
+ func);
},
[](FuzzedDataProvider* fdp, IBinder* ibinder) -> void {
uint32_t id = fdp->ConsumeIntegral<uint32_t>();
- ibinder->findObject(reinterpret_cast<void*>(&id));
+ (void)ibinder->findObject(reinterpret_cast<void*>(&id));
},
[](FuzzedDataProvider* fdp, IBinder* ibinder) -> void {
uint32_t id = fdp->ConsumeIntegral<uint32_t>();
- ibinder->detachObject(reinterpret_cast<void*>(&id));
+ (void)ibinder->detachObject(reinterpret_cast<void*>(&id));
},
[](FuzzedDataProvider* fdp, IBinder* ibinder) -> void {
uint32_t code = fdp->ConsumeIntegral<uint32_t>();
diff --git a/libs/binder/tests/unit_fuzzers/StabilityFuzzFunctions.h b/libs/binder/tests/unit_fuzzers/StabilityFuzzFunctions.h
index 8b4ed70..371dcbd 100644
--- a/libs/binder/tests/unit_fuzzers/StabilityFuzzFunctions.h
+++ b/libs/binder/tests/unit_fuzzers/StabilityFuzzFunctions.h
@@ -31,37 +31,27 @@
static const std::vector<
std::function<void(FuzzedDataProvider*, android::sp<android::IBinder> const&)>>
gStabilityOperations = {
- // markCompilationUnit(IBinder* binder)
[](FuzzedDataProvider*, android::sp<android::IBinder> const& bbinder) -> void {
if (!marked) {
android::internal::Stability::markCompilationUnit(bbinder.get());
marked = true;
}
},
-
- // markVintf(IBinder* binder)
[](FuzzedDataProvider*, android::sp<android::IBinder> const& bbinder) -> void {
if (!marked) {
android::internal::Stability::markVintf(bbinder.get());
marked = true;
}
},
-
- // debugLogStability(const std::string& tag, const sp<IBinder>& binder)
- [](FuzzedDataProvider* fdp, android::sp<android::IBinder> const& bbinder) -> void {
- std::string tag = fdp->ConsumeRandomLengthString(STABILITY_MAX_TAG_LENGTH);
- android::internal::Stability::debugLogStability(tag, bbinder);
+ [](FuzzedDataProvider*, android::sp<android::IBinder> const& bbinder) -> void {
+ (void)android::internal::Stability::debugToString(bbinder);
},
-
- // markVndk(IBinder* binder)
[](FuzzedDataProvider*, android::sp<android::IBinder> const& bbinder) -> void {
if (!marked) {
android::internal::Stability::markVndk(bbinder.get());
marked = true;
}
},
-
- // requiresVintfDeclaration(const sp<IBinder>& binder)
[](FuzzedDataProvider*, android::sp<android::IBinder> const& bbinder) -> void {
android::internal::Stability::requiresVintfDeclaration(bbinder);
}};
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index 79b47a1..e2f32e3 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -653,6 +653,8 @@
case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
return 4;
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
+ return 8;
default:
return 0;
}
@@ -696,6 +698,10 @@
"gralloc and AHardwareBuffer flags don't match");
static_assert(AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE == (uint64_t)BufferUsage::GPU_MIPMAP_COMPLETE,
"gralloc and AHardwareBuffer flags don't match");
+ static_assert(AHARDWAREBUFFER_USAGE_CAMERA_WRITE == (uint64_t)BufferUsage::CAMERA_OUTPUT,
+ "gralloc and AHardwareBuffer flags don't match");
+ static_assert(AHARDWAREBUFFER_USAGE_CAMERA_READ == (uint64_t)BufferUsage::CAMERA_INPUT,
+ "gralloc and AHardwareBuffer flags don't match");
return usage;
}
diff --git a/libs/nativewindow/include/vndk/hardware_buffer.h b/libs/nativewindow/include/vndk/hardware_buffer.h
index 50fe0b7..21931bb 100644
--- a/libs/nativewindow/include/vndk/hardware_buffer.h
+++ b/libs/nativewindow/include/vndk/hardware_buffer.h
@@ -91,6 +91,20 @@
AHARDWAREBUFFER_FORMAT_YCbCr_422_I = 0x14,
};
+/**
+ * Buffer usage flags.
+ */
+enum {
+ /* for future proofing, keep these in sync with hardware/gralloc.h */
+
+ /* The buffer will be written by the HW camera pipeline. */
+ AHARDWAREBUFFER_USAGE_CAMERA_WRITE = 2UL << 16,
+ /* The buffer will be read by the HW camera pipeline. */
+ AHARDWAREBUFFER_USAGE_CAMERA_READ = 4UL << 16,
+ /* Mask for the camera access values. */
+ AHARDWAREBUFFER_USAGE_CAMERA_MASK = 6UL << 16,
+};
+
__END_DECLS
#endif /* ANDROID_VNDK_NATIVEWINDOW_AHARDWAREBUFFER_H */
diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp
index d32d6f4..aa66780 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -1269,6 +1269,11 @@
entry.deviceId);
#endif
+ // Reset key repeating in case a keyboard device was disabled or enabled.
+ if (mKeyRepeatState.lastKeyEntry && mKeyRepeatState.lastKeyEntry->deviceId == entry.deviceId) {
+ resetKeyRepeatLocked();
+ }
+
CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, "device was reset");
options.deviceId = entry.deviceId;
synthesizeCancelationEventsForAllConnectionsLocked(options);
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp
index b19b419..68d5e7c 100644
--- a/services/inputflinger/reader/EventHub.cpp
+++ b/services/inputflinger/reader/EventHub.cpp
@@ -63,9 +63,9 @@
namespace android {
-static const char* DEVICE_PATH = "/dev/input";
+static const char* DEVICE_INPUT_PATH = "/dev/input";
// v4l2 devices go directly into /dev
-static const char* VIDEO_DEVICE_PATH = "/dev";
+static const char* DEVICE_PATH = "/dev";
static constexpr size_t OBFUSCATED_LENGTH = 8;
@@ -685,15 +685,23 @@
LOG_ALWAYS_FATAL_IF(mEpollFd < 0, "Could not create epoll instance: %s", strerror(errno));
mINotifyFd = inotify_init();
- mInputWd = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);
- LOG_ALWAYS_FATAL_IF(mInputWd < 0, "Could not register INotify for %s: %s", DEVICE_PATH,
- strerror(errno));
- if (isV4lScanningEnabled()) {
- mVideoWd = inotify_add_watch(mINotifyFd, VIDEO_DEVICE_PATH, IN_DELETE | IN_CREATE);
- LOG_ALWAYS_FATAL_IF(mVideoWd < 0, "Could not register INotify for %s: %s",
- VIDEO_DEVICE_PATH, strerror(errno));
+
+ std::error_code errorCode;
+ bool isDeviceInotifyAdded = false;
+ if (std::filesystem::exists(DEVICE_INPUT_PATH, errorCode)) {
+ addDeviceInputInotify();
} else {
- mVideoWd = -1;
+ addDeviceInotify();
+ isDeviceInotifyAdded = true;
+ if (errorCode) {
+ ALOGW("Could not run filesystem::exists() due to error %d : %s.", errorCode.value(),
+ errorCode.message().c_str());
+ }
+ }
+
+ if (isV4lScanningEnabled() && !isDeviceInotifyAdded) {
+ addDeviceInotify();
+ } else {
ALOGI("Video device scanning disabled");
}
@@ -733,6 +741,23 @@
::close(mWakeWritePipeFd);
}
+/**
+ * On devices that don't have any input devices (like some development boards), the /dev/input
+ * directory will be absent. However, the user may still plug in an input device at a later time.
+ * Add watch for contents of /dev/input only when /dev/input appears.
+ */
+void EventHub::addDeviceInputInotify() {
+ mDeviceInputWd = inotify_add_watch(mINotifyFd, DEVICE_INPUT_PATH, IN_DELETE | IN_CREATE);
+ LOG_ALWAYS_FATAL_IF(mDeviceInputWd < 0, "Could not register INotify for %s: %s",
+ DEVICE_INPUT_PATH, strerror(errno));
+}
+
+void EventHub::addDeviceInotify() {
+ mDeviceWd = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);
+ LOG_ALWAYS_FATAL_IF(mDeviceWd < 0, "Could not register INotify for %s: %s", DEVICE_PATH,
+ strerror(errno));
+}
+
InputDeviceIdentifier EventHub::getDeviceIdentifier(int32_t deviceId) const {
std::scoped_lock _l(mLock);
Device* device = getDeviceLocked(deviceId);
@@ -1739,14 +1764,24 @@
}
void EventHub::scanDevicesLocked() {
- status_t result = scanDirLocked(DEVICE_PATH);
- if (result < 0) {
- ALOGE("scan dir failed for %s", DEVICE_PATH);
+ status_t result;
+ std::error_code errorCode;
+
+ if (std::filesystem::exists(DEVICE_INPUT_PATH, errorCode)) {
+ result = scanDirLocked(DEVICE_INPUT_PATH);
+ if (result < 0) {
+ ALOGE("scan dir failed for %s", DEVICE_INPUT_PATH);
+ }
+ } else {
+ if (errorCode) {
+ ALOGW("Could not run filesystem::exists() due to error %d : %s.", errorCode.value(),
+ errorCode.message().c_str());
+ }
}
if (isV4lScanningEnabled()) {
- result = scanVideoDirLocked(VIDEO_DEVICE_PATH);
+ result = scanVideoDirLocked(DEVICE_PATH);
if (result != OK) {
- ALOGE("scan video dir failed for %s", VIDEO_DEVICE_PATH);
+ ALOGE("scan video dir failed for %s", DEVICE_PATH);
}
}
if (mDevices.find(ReservedInputDeviceId::VIRTUAL_KEYBOARD_ID) == mDevices.end()) {
@@ -2357,23 +2392,25 @@
while (res >= (int)sizeof(*event)) {
event = (struct inotify_event*)(event_buf + event_pos);
if (event->len) {
- if (event->wd == mInputWd) {
- std::string filename = std::string(DEVICE_PATH) + "/" + event->name;
+ if (event->wd == mDeviceInputWd) {
+ std::string filename = std::string(DEVICE_INPUT_PATH) + "/" + event->name;
if (event->mask & IN_CREATE) {
openDeviceLocked(filename);
} else {
ALOGI("Removing device '%s' due to inotify event\n", filename.c_str());
closeDeviceByPathLocked(filename);
}
- } else if (event->wd == mVideoWd) {
+ } else if (event->wd == mDeviceWd) {
if (isV4lTouchNode(event->name)) {
- std::string filename = std::string(VIDEO_DEVICE_PATH) + "/" + event->name;
+ std::string filename = std::string(DEVICE_PATH) + "/" + event->name;
if (event->mask & IN_CREATE) {
openVideoDeviceLocked(filename);
} else {
ALOGI("Removing video device '%s' due to inotify event", filename.c_str());
closeVideoDeviceByPathLocked(filename);
}
+ } else if (strcmp(event->name, "input") == 0 && event->mask & IN_CREATE) {
+ addDeviceInputInotify();
}
} else {
LOG_ALWAYS_FATAL("Unexpected inotify event, wd = %i", event->wd);
diff --git a/services/inputflinger/reader/include/EventHub.h b/services/inputflinger/reader/include/EventHub.h
index 1016a2c..3c3f88e 100644
--- a/services/inputflinger/reader/include/EventHub.h
+++ b/services/inputflinger/reader/include/EventHub.h
@@ -663,6 +663,9 @@
const std::unordered_map<int32_t, RawLightInfo>& getLightInfoLocked(int32_t deviceId) const
REQUIRES(mLock);
+ void addDeviceInputInotify();
+ void addDeviceInotify();
+
// Protect all internal state.
mutable std::mutex mLock;
@@ -702,8 +705,8 @@
int mWakeReadPipeFd;
int mWakeWritePipeFd;
- int mInputWd;
- int mVideoWd;
+ int mDeviceInputWd;
+ int mDeviceWd = -1;
// Maximum number of signalled FDs to handle at a time.
static const int EPOLL_MAX_EVENTS = 16;
diff --git a/services/inputflinger/reader/mapper/SensorInputMapper.cpp b/services/inputflinger/reader/mapper/SensorInputMapper.cpp
index 7ac2dec..a507632 100644
--- a/services/inputflinger/reader/mapper/SensorInputMapper.cpp
+++ b/services/inputflinger/reader/mapper/SensorInputMapper.cpp
@@ -303,7 +303,7 @@
* the device
*/
mDeviceEnabled = false;
- for (const auto& [sensorType, sensor] : mSensors) {
+ for (const auto& [_, sensor] : mSensors) {
// If any sensor is on we will turn on the device.
if (sensor.enabled) {
mDeviceEnabled = true;
diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp
index f884a4b..50e1854 100644
--- a/services/inputflinger/tests/InputDispatcher_test.cpp
+++ b/services/inputflinger/tests/InputDispatcher_test.cpp
@@ -2880,6 +2880,16 @@
mWindow->assertNoEvents();
}
+TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_StopsKeyRepeatAfterDisableInputDevice) {
+ sendAndConsumeKeyDown(DEVICE_ID);
+ expectKeyRepeatOnce(1 /*repeatCount*/);
+ NotifyDeviceResetArgs args(10 /*id*/, 20 /*eventTime*/, DEVICE_ID);
+ mDispatcher->notifyDeviceReset(&args);
+ mWindow->consumeKeyUp(ADISPLAY_ID_DEFAULT,
+ AKEY_EVENT_FLAG_CANCELED | AKEY_EVENT_FLAG_LONG_PRESS);
+ mWindow->assertNoEvents();
+}
+
TEST_F(InputDispatcherKeyRepeatTest, FocusedWindow_RepeatKeyEventsUseEventIdFromInputDispatcher) {
sendAndConsumeKeyDown(1 /* deviceId */);
for (int32_t repeatCount = 1; repeatCount <= 10; ++repeatCount) {
diff --git a/vulkan/README.md b/vulkan/README.md
index 185aa39..144805c 100644
--- a/vulkan/README.md
+++ b/vulkan/README.md
@@ -14,7 +14,7 @@
## Code Generation
-We generate several parts of the loader and tools driectly from the Vulkan Registry (external/vulkan-headers/registry/vk.xml). Code generation must be done manually because the generator is not part of the platform toolchain (yet?). Files named `foo_gen.*` are generated by the code generator.
+We generate several parts of the loader and tools directly from the Vulkan Registry (external/vulkan-headers/registry/vk.xml). Code generation must be done manually because the generator is not part of the platform toolchain (yet?). Files named `foo_gen.*` are generated by the code generator.
### Run The Code Generator