diff options
| author | 2021-08-12 12:03:37 -0700 | |
|---|---|---|
| committer | 2021-08-12 22:41:41 +0000 | |
| commit | 2e1a9d88a58fac889f13b18a9e6c181a8459feab (patch) | |
| tree | f9ac849149b67c3a82bb1b881f6af42f7fe7fd4f | |
| parent | a8f9cdbc77fee0bd5a1527342af4e2ceb9487b50 (diff) | |
| parent | 810d19378edc7bbd87d738d96c4bb49ed45b3d0c (diff) | |
Merge ab/7633965
Bug: 169893837
Merged-In: I2a2d02a0d7e67ee9577857a210cb6157683e5598
Change-Id: Iecdf0a17afe650483461978b42161940ce002101
114 files changed, 2313 insertions, 1571 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index 79419d3ae6..783a475829 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -126,7 +126,6 @@ static const TracingCategory k_categories[] = {      { "aidl",       "AIDL calls",               ATRACE_TAG_AIDL, { } },      { "nnapi",      "NNAPI",                    ATRACE_TAG_NNAPI, { } },      { "rro",        "Runtime Resource Overlay", ATRACE_TAG_RRO, { } }, -    { "sysprop",    "System Property",          ATRACE_TAG_SYSPROP, { } },      { k_coreServiceCategory, "Core services", 0, { } },      { k_pdxServiceCategory, "PDX services", 0, { } },      { "sched",      "CPU Scheduling",   0, { diff --git a/cmds/atrace/atrace.rc b/cmds/atrace/atrace.rc index 37fc9a9356..e3c4edebbd 100644 --- a/cmds/atrace/atrace.rc +++ b/cmds/atrace/atrace.rc @@ -266,7 +266,10 @@ on late-init      chmod 0666 /sys/kernel/debug/tracing/per_cpu/cpu15/trace      chmod 0666 /sys/kernel/tracing/per_cpu/cpu15/trace -on post-fs-data +# Only create the tracing instance if persist.mm_events.enabled +# Attempting to remove the tracing instance after it has been created +# will likely fail with EBUSY as it would be in use by traced_probes. +on post-fs-data && property:persist.mm_events.enabled=true  # Create MM Events Tracing Instance for Kmem Activity Trigger      mkdir /sys/kernel/debug/tracing/instances/mm_events 0755 system system      mkdir /sys/kernel/tracing/instances/mm_events 0755 system system @@ -275,10 +278,18 @@ on post-fs-data      chmod 0666 /sys/kernel/debug/tracing/instances/mm_events/buffer_size_kb      chmod 0666 /sys/kernel/tracing/instances/mm_events/buffer_size_kb +# Set the default buffer size to the minimum +    write /sys/kernel/debug/tracing/instances/mm_events/buffer_size_kb 1 +    write /sys/kernel/tracing/instances/mm_events/buffer_size_kb 1 +  # Read and enable tracing      chmod 0666 /sys/kernel/debug/tracing/instances/mm_events/tracing_on      chmod 0666 /sys/kernel/tracing/instances/mm_events/tracing_on +# Tracing disabled by default +    write /sys/kernel/debug/tracing/instances/mm_events/tracing_on 0 +    write /sys/kernel/tracing/instances/mm_events/tracing_on 0 +  # Read and truncate kernel trace      chmod 0666 /sys/kernel/debug/tracing/instances/mm_events/trace      chmod 0666 /sys/kernel/tracing/instances/mm_events/trace diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index 25e6dc95c7..2d11b908c2 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -176,6 +176,7 @@ void add_mountinfo();  #define LINKERCONFIG_DIR "/linkerconfig"  #define PACKAGE_DEX_USE_LIST "/data/system/package-dex-usage.list"  #define SYSTEM_TRACE_SNAPSHOT "/data/misc/perfetto-traces/bugreport/systrace.pftrace" +#define CGROUPFS_DIR "/sys/fs/cgroup"  // TODO(narayan): Since this information has to be kept in sync  // with tombstoned, we should just put it in a common header. @@ -1240,8 +1241,15 @@ static Dumpstate::RunStatus RunDumpsysTextByPriority(const std::string& title, i          if (status == OK) {              dumpsys.writeDumpHeader(STDOUT_FILENO, service, priority);              std::chrono::duration<double> elapsed_seconds; -            status = dumpsys.writeDump(STDOUT_FILENO, service, service_timeout, -                                       /* as_proto = */ false, elapsed_seconds, bytes_written); +            if (priority == IServiceManager::DUMP_FLAG_PRIORITY_HIGH && +                service == String16("meminfo")) { +                // Use a longer timeout for meminfo, since 30s is not always enough. +                status = dumpsys.writeDump(STDOUT_FILENO, service, 60s, +                                           /* as_proto = */ false, elapsed_seconds, bytes_written); +            } else { +                status = dumpsys.writeDump(STDOUT_FILENO, service, service_timeout, +                                           /* as_proto = */ false, elapsed_seconds, bytes_written); +            }              dumpsys.writeDumpFooter(STDOUT_FILENO, service, elapsed_seconds);              bool dump_complete = (status == OK);              dumpsys.stopDumpThread(dump_complete); @@ -1785,6 +1793,9 @@ static Dumpstate::RunStatus dumpstate() {      // Add linker configuration directory      ds.AddDir(LINKERCONFIG_DIR, true); +    /* Dump cgroupfs */ +    ds.AddDir(CGROUPFS_DIR, true); +      if (ds.dump_pool_) {          WAIT_TASK_WITH_CONSENT_CHECK(DUMP_INCIDENT_REPORT_TASK, ds.dump_pool_);      } else { diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index 59311a012a..74be7cedc7 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -342,8 +342,7 @@ static int restorecon_app_data_lazy(const std::string& path, const std::string&      // If the initial top-level restorecon above changed the label, then go      // back and restorecon everything recursively -    // TODO(b/190567190, b/188141923) Remove recursive fixup of com.google.android.gsf. -    if (strcmp(before, after) || (path.find("com.google.android.gsf") != std::string::npos)) { +    if (strcmp(before, after)) {          if (existing) {              LOG(DEBUG) << "Detected label change from " << before << " to " << after << " at "                      << path << "; running recursive restorecon"; diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index 15f0c5b75c..d678281b6e 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -43,7 +43,7 @@  #include <log/log.h>               // TODO: Move everything to base/logging.  #include <openssl/sha.h>  #include <private/android_filesystem_config.h> -#include <processgroup/sched_policy.h> +#include <processgroup/processgroup.h>  #include <selinux/android.h>  #include <server_configurable_flags/get_flags.h>  #include <system/thread_defs.h> @@ -282,8 +282,8 @@ static bool ShouldUseSwapFileForDexopt() {  static void SetDex2OatScheduling(bool set_to_bg) {      if (set_to_bg) { -        if (set_sched_policy(0, SP_BACKGROUND) < 0) { -            PLOG(ERROR) << "set_sched_policy failed"; +        if (!SetTaskProfiles(0, {"Dex2OatBootComplete"})) { +            LOG(ERROR) << "Failed to set dex2oat task profile";              exit(DexoptReturnCodes::kSetSchedPolicy);          }          if (setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_BACKGROUND) < 0) { @@ -1231,6 +1231,14 @@ class RunDexoptAnalyzer : public ExecVHelper {              }          } +        // On-device signing related. odsign sets the system property odsign.verification.success if +        // AOT artifacts have the expected signatures. +        const bool trust_art_apex_data_files = +                ::android::base::GetBoolProperty("odsign.verification.success", false); +        if (!trust_art_apex_data_files) { +            AddRuntimeArg("-Xdeny-art-apex-data-files"); +        } +          PrepareArgs(dexoptanalyzer_bin);      } @@ -1363,10 +1371,12 @@ static SecondaryDexAccess check_secondary_dex_access(const std::string& dex_path          return kSecondaryDexAccessReadOk;      } else {          if (errno == ENOENT) { -            LOG(INFO) << "Secondary dex does not exist: " <<  dex_path; +            async_safe_format_log(ANDROID_LOG_INFO, LOG_TAG, +                    "Secondary dex does not exist: %s", dex_path.c_str());              return kSecondaryDexAccessDoesNotExist;          } else { -            PLOG(ERROR) << "Could not access secondary dex " << dex_path; +            async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, +                    "Could not access secondary dex: %s (%d)", dex_path.c_str(), errno);              return errno == EACCES                  ? kSecondaryDexAccessPermissionError                  : kSecondaryDexAccessIOError; diff --git a/cmds/installd/run_dex2oat.cpp b/cmds/installd/run_dex2oat.cpp index e847626a14..b6616841f0 100644 --- a/cmds/installd/run_dex2oat.cpp +++ b/cmds/installd/run_dex2oat.cpp @@ -283,6 +283,13 @@ void RunDex2Oat::PrepareCompilerConfigFlags(const UniqueFile& input_vdex,          }      } +    // On-device signing related. odsign sets the system property odsign.verification.success if +    // AOT artifacts have the expected signatures. +    const bool trust_art_apex_data_files = GetBoolProperty("odsign.verification.success", false); +    if (!trust_art_apex_data_files) { +        AddRuntimeArg("-Xdeny-art-apex-data-files"); +    } +      if (target_sdk_version != 0) {          AddRuntimeArg(StringPrintf("-Xtarget-sdk-version:%d", target_sdk_version));      } diff --git a/cmds/surfacereplayer/proto/src/trace.proto b/cmds/surfacereplayer/proto/src/trace.proto index 3798ba73a4..03a2709075 100644 --- a/cmds/surfacereplayer/proto/src/trace.proto +++ b/cmds/surfacereplayer/proto/src/trace.proto @@ -52,6 +52,7 @@ message SurfaceChange {          BackgroundBlurRadiusChange  background_blur_radius  = 20;          ShadowRadiusChange          shadow_radius           = 21;          BlurRegionsChange           blur_regions            = 22; +        TrustedOverlayChange        trusted_overlay         = 23;      }  } @@ -192,6 +193,10 @@ message ShadowRadiusChange {      required float radius = 1;  } +message TrustedOverlayChange { +    required float is_trusted_overlay = 1; +} +  message BlurRegionsChange {      repeated BlurRegionChange blur_regions = 1;  } diff --git a/include/input/Input.h b/include/input/Input.h index e8678d27c3..2e326cb102 100644 --- a/include/input/Input.h +++ b/include/input/Input.h @@ -43,6 +43,13 @@   * Additional private constants not defined in ndk/ui/input.h.   */  enum { +#ifdef __linux__ +    /* This event was generated or modified by accessibility service. */ +    AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = +            android::os::IInputConstants::INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT, // 0x800, +#else +    AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 0x800, +#endif      /* Signifies that the key is being predispatched */      AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000, @@ -81,6 +88,16 @@ enum {       */      AMOTION_EVENT_FLAG_NO_FOCUS_CHANGE = 0x40, +#ifdef __linux__ +    /** +     * This event was generated or modified by accessibility service. +     */ +    AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = +            android::os::IInputConstants::INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT, // 0x800, +#else +    AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 0x800, +#endif +      /* Motion event is inconsistent with previously sent motion events. */      AMOTION_EVENT_FLAG_TAINTED = 0x80000000,  }; @@ -89,14 +106,15 @@ enum {   * Allowed VerifiedKeyEvent flags. All other flags from KeyEvent do not get verified.   * These values must be kept in sync with VerifiedKeyEvent.java   */ -constexpr int32_t VERIFIED_KEY_EVENT_FLAGS = AKEY_EVENT_FLAG_CANCELED; +constexpr int32_t VERIFIED_KEY_EVENT_FLAGS = +        AKEY_EVENT_FLAG_CANCELED | AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT;  /**   * Allowed VerifiedMotionEventFlags. All other flags from MotionEvent do not get verified.   * These values must be kept in sync with VerifiedMotionEvent.java   */ -constexpr int32_t VERIFIED_MOTION_EVENT_FLAGS = -        AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED | AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED; +constexpr int32_t VERIFIED_MOTION_EVENT_FLAGS = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED | +        AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED | AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT;  /**   * This flag indicates that the point up event has been canceled. @@ -222,16 +240,14 @@ enum {      POLICY_FLAG_GESTURE = 0x00000008,      POLICY_FLAG_RAW_MASK = 0x0000ffff, -#ifdef __linux__ -    POLICY_FLAG_INPUTFILTER_TRUSTED = android::os::IInputConstants::POLICY_FLAG_INPUTFILTER_TRUSTED, +#ifdef __linux__      POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY =              android::os::IInputConstants::POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY,  #else -    POLICY_FLAG_INPUTFILTER_TRUSTED = 0x10000, -      POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY = 0x20000,  #endif +      /* These flags are set by the input dispatcher. */      // Indicates that the input event was injected. diff --git a/include/input/InputDevice.h b/include/input/InputDevice.h index 1955104a22..7f0324a4a8 100644 --- a/include/input/InputDevice.h +++ b/include/input/InputDevice.h @@ -318,8 +318,6 @@ extern std::string getInputDeviceConfigurationFilePathByName(          const std::string& name, InputDeviceConfigurationFileType type);  enum ReservedInputDeviceId : int32_t { -    // Device id assigned to input events generated inside accessibility service -    ACCESSIBILITY_DEVICE_ID = -2,      // Device id of a special "virtual" keyboard that is always present.      VIRTUAL_KEYBOARD_ID = -1,      // Device id of the "built-in" keyboard if there is one. diff --git a/include/private/performance_hint_private.h b/include/private/performance_hint_private.h new file mode 100644 index 0000000000..5832bf49bd --- /dev/null +++ b/include/private/performance_hint_private.h @@ -0,0 +1,145 @@ +/* + * 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. + */ + +#ifndef ANDROID_PRIVATE_NATIVE_PERFORMANCE_HINT_PRIVATE_H +#define ANDROID_PRIVATE_NATIVE_PERFORMANCE_HINT_PRIVATE_H + +#include <stdint.h> + +__BEGIN_DECLS + +struct APerformanceHintManager; +struct APerformanceHintSession; + +/** + * An opaque type representing a handle to a performance hint manager. + * It must be released after use. + * + * <p>To use:<ul> + *    <li>Obtain the performance hint manager instance by calling + *        {@link APerformanceHint_getManager} function.</li> + *    <li>Create an {@link APerformanceHintSession} with + *        {@link APerformanceHint_createSession}.</li> + *    <li>Get the preferred update rate in nanoseconds with + *        {@link APerformanceHint_getPreferredUpdateRateNanos}.</li> + */ +typedef struct APerformanceHintManager APerformanceHintManager; + +/** + * An opaque type representing a handle to a performance hint session. + * A session can only be acquired from a {@link APerformanceHintManager} + * with {@link APerformanceHint_getPreferredUpdateRateNanos}. It must be + * freed with {@link APerformanceHint_closeSession} after use. + * + * A Session represents a group of threads with an inter-related workload such that hints for + * their performance should be considered as a unit. The threads in a given session should be + * long-life and not created or destroyed dynamically. + * + * <p>Each session is expected to have a periodic workload with a target duration for each + * cycle. The cycle duration is likely greater than the target work duration to allow other + * parts of the pipeline to run within the available budget. For example, a renderer thread may + * work at 60hz in order to produce frames at the display's frame but have a target work + * duration of only 6ms.</p> + * + * <p>After each cycle of work, the client is expected to use + * {@link APerformanceHint_reportActualWorkDuration} to report the actual time taken to + * complete.</p> + * + * <p>To use:<ul> + *    <li>Update a sessions target duration for each cycle of work + *        with  {@link APerformanceHint_updateTargetWorkDuration}.</li> + *    <li>Report the actual duration for the last cycle of work with + *        {@link APerformanceHint_reportActualWorkDuration}.</li> + *    <li>Release the session instance with + *        {@link APerformanceHint_closeSession}.</li></ul></p> + */ +typedef struct APerformanceHintSession APerformanceHintSession; + +/** +  * Acquire an instance of the performance hint manager. +  * +  * @return manager instance on success, nullptr on failure. +  */ +APerformanceHintManager* APerformanceHint_getManager(); + +/** + * Creates a session for the given set of threads and sets their initial target work + * duration. + * @param manager The performance hint manager instance. + * @param threadIds The list of threads to be associated with this session. They must be part of + *     this app's thread group. + * @param size the size of threadIds. + * @param initialTargetWorkDurationNanos The desired duration in nanoseconds for the new session. + *     This must be positive. + * @return manager instance on success, nullptr on failure. + */ +APerformanceHintSession* APerformanceHint_createSession(APerformanceHintManager* manager, +                                                        const int32_t* threadIds, size_t size, +                                                        int64_t initialTargetWorkDurationNanos); + +/** + * Get preferred update rate information for this device. + * + * @param manager The performance hint manager instance. + * @return the preferred update rate supported by device software. + */ +int64_t APerformanceHint_getPreferredUpdateRateNanos(APerformanceHintManager* manager); + +/** + * Updates this session's target duration for each cycle of work. + * + * @param session The performance hint session instance to update. + * @param targetDurationNanos the new desired duration in nanoseconds. This must be positive. + * @return 0 on success + *         EINVAL if targetDurationNanos is not positive. + *         EPIPE if communication with the system service has failed. + */ +int APerformanceHint_updateTargetWorkDuration(APerformanceHintSession* session, +                                               int64_t targetDurationNanos); + +/** + * Reports the actual duration for the last cycle of work. + * + * <p>The system will attempt to adjust the core placement of the threads within the thread + * group and/or the frequency of the core on which they are run to bring the actual duration + * close to the target duration.</p> + * + * @param session The performance hint session instance to update. + * @param actualDurationNanos how long the thread group took to complete its last task in + *     nanoseconds. This must be positive. + * @return 0 on success + *         EINVAL if actualDurationNanos is not positive. + *         EPIPE if communication with the system service has failed. + */ +int APerformanceHint_reportActualWorkDuration(APerformanceHintSession* session, +                                               int64_t actualDurationNanos); + +/** + * Release the performance hint manager pointer acquired via + * {@link APerformanceHint_createSession}. + * + * @param session The performance hint session instance to release. + */ +void APerformanceHint_closeSession(APerformanceHintSession* session); + +/** + * For testing only. + */ +void APerformanceHint_setIHintManagerForTesting(void* iManager); + +__END_DECLS + +#endif // ANDROID_PRIVATE_NATIVE_PERFORMANCE_HINT_PRIVATE_H diff --git a/libs/binder/LazyServiceRegistrar.cpp b/libs/binder/LazyServiceRegistrar.cpp index 616591182a..f66993f926 100644 --- a/libs/binder/LazyServiceRegistrar.cpp +++ b/libs/binder/LazyServiceRegistrar.cpp @@ -40,9 +40,9 @@ public:      void setActiveServicesCallback(const std::function<bool(bool)>& activeServicesCallback); -    bool tryUnregister(); +    bool tryUnregisterLocked(); -    void reRegister(); +    void reRegisterLocked();  protected:      Status onClients(const sp<IBinder>& service, bool clients) override; @@ -59,6 +59,9 @@ private:          bool registered = true;      }; +    bool registerServiceLocked(const sp<IBinder>& service, const std::string& name, +                               bool allowIsolated, int dumpFlags); +      /**       * Looks up a service guaranteed to be registered (service from onClients).       */ @@ -68,7 +71,7 @@ private:       * Unregisters all services that we can. If we can't unregister all, re-register other       * services.       */ -    void tryShutdown(); +    void tryShutdownLocked();      /**       * Try to shutdown the process, unless: @@ -76,7 +79,10 @@ private:       * - The active services count callback returns 'true', or       * - Some services have clients.       */ -    void maybeTryShutdown(); +    void maybeTryShutdownLocked(); + +    // for below +    std::mutex mMutex;      // count of services with clients      size_t mNumConnectedServices; @@ -117,6 +123,13 @@ private:  bool ClientCounterCallbackImpl::registerService(const sp<IBinder>& service, const std::string& name,                                              bool allowIsolated, int dumpFlags) { +    std::lock_guard<std::mutex> lock(mMutex); +    return registerServiceLocked(service, name, allowIsolated, dumpFlags); +} + +bool ClientCounterCallbackImpl::registerServiceLocked(const sp<IBinder>& service, +                                                      const std::string& name, bool allowIsolated, +                                                      int dumpFlags) {      auto manager = interface_cast<AidlServiceManager>(asBinder(defaultServiceManager()));      bool reRegister = mRegisteredServices.count(name) > 0; @@ -164,14 +177,15 @@ std::map<std::string, ClientCounterCallbackImpl::Service>::iterator ClientCounte  }  void ClientCounterCallbackImpl::forcePersist(bool persist) { +    std::lock_guard<std::mutex> lock(mMutex);      mForcePersist = persist;      if (!mForcePersist) {          // Attempt a shutdown in case the number of clients hit 0 while the flag was on -        maybeTryShutdown(); +        maybeTryShutdownLocked();      }  } -bool ClientCounterCallbackImpl::tryUnregister() { +bool ClientCounterCallbackImpl::tryUnregisterLocked() {      auto manager = interface_cast<AidlServiceManager>(asBinder(defaultServiceManager()));      for (auto& [name, entry] : mRegisteredServices) { @@ -187,15 +201,14 @@ bool ClientCounterCallbackImpl::tryUnregister() {      return true;  } -void ClientCounterCallbackImpl::reRegister() { +void ClientCounterCallbackImpl::reRegisterLocked() {      for (auto& [name, entry] : mRegisteredServices) {          // re-register entry if not already registered          if (entry.registered) {              continue;          } -        if (!registerService(entry.service, name, entry.allowIsolated, -                             entry.dumpFlags)) { +        if (!registerServiceLocked(entry.service, name, entry.allowIsolated, entry.dumpFlags)) {              // Must restart. Otherwise, clients will never be able to get a hold of this service.              LOG_ALWAYS_FATAL("Bad state: could not re-register services");          } @@ -204,7 +217,7 @@ void ClientCounterCallbackImpl::reRegister() {      }  } -void ClientCounterCallbackImpl::maybeTryShutdown() { +void ClientCounterCallbackImpl::maybeTryShutdownLocked() {      if (mForcePersist) {          ALOGI("Shutdown prevented by forcePersist override flag.");          return; @@ -223,15 +236,12 @@ void ClientCounterCallbackImpl::maybeTryShutdown() {      // client count change event, try to shutdown the process if its services      // have no clients.      if (!handledInCallback && mNumConnectedServices == 0) { -        tryShutdown(); +        tryShutdownLocked();      }  } -/** - * onClients is oneway, so no need to worry about multi-threading. Note that this means multiple - * invocations could occur on different threads however. - */  Status ClientCounterCallbackImpl::onClients(const sp<IBinder>& service, bool clients) { +    std::lock_guard<std::mutex> lock(mMutex);      auto & [name, registered] = *assertRegisteredService(service);      if (registered.clients == clients) {          LOG_ALWAYS_FATAL("Process already thought %s had clients: %d but servicemanager has " @@ -252,23 +262,24 @@ Status ClientCounterCallbackImpl::onClients(const sp<IBinder>& service, bool cli      ALOGI("Process has %zu (of %zu available) client(s) in use after notification %s has clients: %d",            mNumConnectedServices, mRegisteredServices.size(), name.c_str(), clients); -    maybeTryShutdown(); +    maybeTryShutdownLocked();      return Status::ok();  } - void ClientCounterCallbackImpl::tryShutdown() { -     ALOGI("Trying to shut down the service. No clients in use for any service in process."); +void ClientCounterCallbackImpl::tryShutdownLocked() { +    ALOGI("Trying to shut down the service. No clients in use for any service in process."); -    if (tryUnregister()) { -         ALOGI("Unregistered all clients and exiting"); -         exit(EXIT_SUCCESS); -     } +    if (tryUnregisterLocked()) { +        ALOGI("Unregistered all clients and exiting"); +        exit(EXIT_SUCCESS); +    } -    reRegister(); +    reRegisterLocked();  }  void ClientCounterCallbackImpl::setActiveServicesCallback(const std::function<bool(bool)>&                                                            activeServicesCallback) { +    std::lock_guard<std::mutex> lock(mMutex);      mActiveServicesCallback = activeServicesCallback;  } @@ -291,11 +302,15 @@ void ClientCounterCallback::setActiveServicesCallback(const std::function<bool(b  }  bool ClientCounterCallback::tryUnregister() { -    return mImpl->tryUnregister(); +    // see comments in header, this should only be called from the active +    // services callback, see also b/191781736 +    return mImpl->tryUnregisterLocked();  }  void ClientCounterCallback::reRegister() { -    mImpl->reRegister(); +    // see comments in header, this should only be called from the active +    // services callback, see also b/191781736 +    mImpl->reRegisterLocked();  }  }  // namespace internal diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING index b58d919d33..1010a2d79d 100644 --- a/libs/binder/TEST_MAPPING +++ b/libs/binder/TEST_MAPPING @@ -52,6 +52,9 @@        "name": "CtsOsTestCases",        "options": [          { +          "exclude-annotation": "android.platform.test.annotations.LargeTest" +        }, +        {            "exclude-filter": "android.os.cts.BuildTest#testSdkInt"          },          { diff --git a/libs/binder/include/binder/LazyServiceRegistrar.h b/libs/binder/include/binder/LazyServiceRegistrar.h index f3ba830923..2e22b84ff0 100644 --- a/libs/binder/include/binder/LazyServiceRegistrar.h +++ b/libs/binder/include/binder/LazyServiceRegistrar.h @@ -79,9 +79,10 @@ class LazyServiceRegistrar {        */       void setActiveServicesCallback(const std::function<bool(bool)>& activeServicesCallback); -    /** +     /**        * Try to unregister all services previously registered with 'registerService'. -      * Returns 'true' if successful. +      * Returns 'true' if successful. This should only be called within the callback registered by +      * setActiveServicesCallback.        */       bool tryUnregister(); diff --git a/libs/binder/libbinder.arm32.map b/libs/binder/libbinder.arm32.map index 64fdd910a8..f26c33dff5 100644 --- a/libs/binder/libbinder.arm32.map +++ b/libs/binder/libbinder.arm32.map @@ -349,11 +349,6 @@ LIBBINDER {      _ZN7android2os20ParcelFileDescriptorD0Ev;      _ZN7android2os20ParcelFileDescriptorD1Ev;      _ZN7android2os20ParcelFileDescriptorD2Ev; -    _ZN7android2spINS_21IPermissionControllerEED2Ev; -    _ZN7android2spINS_7BBinderEED2Ev; -    _ZN7android2spINS_7IBinderEEaSEOS2_; -    _ZN7android2spINS_7IBinderEEaSERKS2_; -    _ZN7android2spINS_9HeapCacheEED2Ev;      _ZN7android4aerrE;      _ZN7android4alogE;      _ZN7android4aoutE; @@ -389,15 +384,6 @@ LIBBINDER {      _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;      _ZN7android6binder8internal21ClientCounterCallbackC1Ev;      _ZN7android6binder8internal21ClientCounterCallbackC2Ev; -    _ZN7android6binder8internal25ClientCounterCallbackImpl10reRegisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl11tryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl12forcePersistEb; -    _ZN7android6binder8internal25ClientCounterCallbackImpl13tryUnregisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi; -    _ZN7android6binder8internal25ClientCounterCallbackImpl16maybeTryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl23assertRegisteredServiceERKNS_2spINS_7IBinderEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl25setActiveServicesCallbackERKNSt3__18functionIFbbEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl9onClientsERKNS_2spINS_7IBinderEEEb;      _ZN7android6Parcel10appendFromEPKS0_jj;      _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;      _ZN7android6Parcel10writeFloatEf; @@ -1064,202 +1050,6 @@ LIBBINDER {      _ZNK7android8BpBinder18isDescriptorCachedEv;      _ZNK7android8BpBinder22getInterfaceDescriptorEv;      _ZNK7android8BpMemory9getMemoryEPiPj; -    _ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE14__count_uniqueIS7_EEjRKT_; -    _ZNSt3__111__sift_downIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeESB_; -    _ZNSt3__111unique_lockINS_5mutexEE6unlockEv; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE14__erase_uniqueIiEEjRKT_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6rehashEj; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE8__rehashEj; -    _ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__113unordered_mapIijNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKijEEEEEixERS7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN7android9RpcServerEFvONS7_2spIS8_EENS7_4base14unique_fd_implINSC_13DefaultCloserEEEEPS8_SA_SF_EEEEEPvSK_; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE21__on_zero_shared_weakEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE21__on_zero_shared_weakEv; -    _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j; -    _ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__13mapIiN7android2spINS1_10RpcSessionEEENS_4lessIiEENS_9allocatorINS_4pairIKiS4_EEEEEixERS9_; -    _ZNSt3__13mapIN7android8String16EbNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_bEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16EdNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_dEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16EiNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_iEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16ENS1_2os17PersistableBundleENS_4lessIS2_EENS_9allocatorINS_4pairIKS2_S4_EEEEEixERS9_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIS2_NS_9allocatorIS2_EEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ES2_NS_4lessIS2_EENS_9allocatorINS_4pairIKS2_S2_EEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16ExNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_xEEEEEixERS7_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISC_EERKT_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JNS_4pairIKS3_S5_EEEEENSF_INS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISI_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEEEvT_SL_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE15__emplace_multiIJRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SO_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE5eraseENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_xEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_xEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_11__thread_idENS_6threadEEENS_19__map_value_compareIS2_S4_NS_4lessIS2_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISO_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSO_IJEEEEEENS_4pairINS_15__tree_iteratorISD_PNS_11__tree_nodeISD_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE7destroyEPNS_11__tree_nodeISD_PvEE; -    _ZNSt3__16vectorIaNS_9allocatorIaEEE6insertIPKaEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIaNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPaEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb0ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb1ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE7reserveEj; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE9push_backERKb; -    _ZNSt3__16vectorIbNS_9allocatorIbEEEaSERKS3_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6assignIPdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6insertIPKdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPdEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEEC2ERKS3_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE24__emplace_back_slow_pathIJDsEEEvDpOT_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE7reserveEj; -    _ZNSt3__16vectorIfNS_9allocatorIfEEE6insertIPKfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPfEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIhNS_9allocatorIhEEE6insertIPKhEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIhNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPhEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6insertIPKiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPiEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIN7android2os16ServiceDebugInfoENS_9allocatorIS3_EEE8__appendEj; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSession13RpcConnectionEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSessionEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE8__appendEj; -    _ZNSt3__16vectorIN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS5_EEE8__appendEj; -    _ZNSt3__16vectorIN7android8RpcState10BinderNode9AsyncTodoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE8__appendEj; -    _ZNSt3__16vectorINS_10unique_ptrIN7android8String16ENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEj; -    _ZNSt3__16vectorINS_10unique_ptrINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_14default_deleteIS7_EEEENS5_ISA_EEE8__appendEj; -    _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEj; -    _ZNSt3__16vectorINS_8optionalIN7android8String16EEENS_9allocatorIS4_EEE8__appendEj; -    _ZNSt3__16vectorINS_8optionalINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEE8__appendEj; -    _ZNSt3__16vectorIxNS_9allocatorIxEEE6assignIPxEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIxNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIxNS_9allocatorIxEEE6insertIPKxEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIxNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPxEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIxNS_9allocatorIxEEEC2ERKS3_; -    _ZNSt3__16vectorIyNS_9allocatorIyEEE6insertIPKyEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIyNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPyEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__19__sift_upIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeE;      _ZTCN7android10AllocationE0_NS_10IInterfaceE;      _ZTCN7android10AllocationE0_NS_10MemoryBaseE;      _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE; @@ -1353,12 +1143,6 @@ LIBBINDER {      _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;      _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;      _ZTCN7android2os17BpServiceCallbackE4_NS_9BpRefBaseE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_10IInterfaceE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_11BnInterfaceINS_2os15IClientCallbackEEE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os15IClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os16BnClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE4_NS_7BBinderE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE4_NS_7IBinderE;      _ZTCN7android7BBinderE0_NS_7IBinderE;      _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;      _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE; @@ -1447,7 +1231,6 @@ LIBBINDER {      _ZTTN7android2os16IServiceCallbackE;      _ZTTN7android2os17BnServiceCallbackE;      _ZTTN7android2os17BpServiceCallbackE; -    _ZTTN7android6binder8internal25ClientCounterCallbackImplE;      _ZTTN7android7BBinderE;      _ZTTN7android7content2pm21IPackageManagerNativeE;      _ZTTN7android7content2pm22BnPackageManagerNativeE; @@ -1581,7 +1364,6 @@ LIBBINDER {      _ZTVN7android2os17BpServiceCallbackE;      _ZTVN7android2os17PersistableBundleE;      _ZTVN7android2os20ParcelFileDescriptorE; -    _ZTVN7android6binder8internal25ClientCounterCallbackImplE;      _ZTVN7android6VectorIiEE;      _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;      _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE; @@ -1606,10 +1388,6 @@ LIBBINDER {      _ZTVN7android9BpRefBaseE;      _ZTVN7android9HeapCacheE;      _ZTVN7android9RpcServerE; -    _ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEEE;    local:      *;  }; diff --git a/libs/binder/libbinder.arm32.vendor.map b/libs/binder/libbinder.arm32.vendor.map index 8d5a323806..5042414c28 100644 --- a/libs/binder/libbinder.arm32.vendor.map +++ b/libs/binder/libbinder.arm32.vendor.map @@ -320,10 +320,6 @@ LIBBINDER {      _ZN7android2os20ParcelFileDescriptorD0Ev;      _ZN7android2os20ParcelFileDescriptorD1Ev;      _ZN7android2os20ParcelFileDescriptorD2Ev; -    _ZN7android2spINS_7BBinderEED2Ev; -    _ZN7android2spINS_7IBinderEEaSEOS2_; -    _ZN7android2spINS_7IBinderEEaSERKS2_; -    _ZN7android2spINS_9HeapCacheEED2Ev;      _ZN7android4aerrE;      _ZN7android4alogE;      _ZN7android4aoutE; @@ -359,15 +355,6 @@ LIBBINDER {      _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;      _ZN7android6binder8internal21ClientCounterCallbackC1Ev;      _ZN7android6binder8internal21ClientCounterCallbackC2Ev; -    _ZN7android6binder8internal25ClientCounterCallbackImpl10reRegisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl11tryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl12forcePersistEb; -    _ZN7android6binder8internal25ClientCounterCallbackImpl13tryUnregisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi; -    _ZN7android6binder8internal25ClientCounterCallbackImpl16maybeTryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl23assertRegisteredServiceERKNS_2spINS_7IBinderEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl25setActiveServicesCallbackERKNSt3__18functionIFbbEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl9onClientsERKNS_2spINS_7IBinderEEEb;      _ZN7android6Parcel10appendFromEPKS0_jj;      _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;      _ZN7android6Parcel10writeFloatEf; @@ -1010,202 +997,6 @@ LIBBINDER {      _ZNK7android8BpBinder18isDescriptorCachedEv;      _ZNK7android8BpBinder22getInterfaceDescriptorEv;      _ZNK7android8BpMemory9getMemoryEPiPj; -    _ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE14__count_uniqueIS7_EEjRKT_; -    _ZNSt3__111__sift_downIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeESB_; -    _ZNSt3__111unique_lockINS_5mutexEE6unlockEv; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE14__erase_uniqueIiEEjRKT_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6rehashEj; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE8__rehashEj; -    _ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__113unordered_mapIijNS_4hashIiEENS_8equal_toIiEENS_9allocatorINS_4pairIKijEEEEEixERS7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN7android9RpcServerEFvONS7_2spIS8_EENS7_4base14unique_fd_implINSC_13DefaultCloserEEEEPS8_SA_SF_EEEEEPvSK_; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE21__on_zero_shared_weakEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE21__on_zero_shared_weakEv; -    _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j; -    _ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__13mapIiN7android2spINS1_10RpcSessionEEENS_4lessIiEENS_9allocatorINS_4pairIKiS4_EEEEEixERS9_; -    _ZNSt3__13mapIN7android8String16EbNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_bEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16EdNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_dEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16EiNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_iEEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16ENS1_2os17PersistableBundleENS_4lessIS2_EENS_9allocatorINS_4pairIKS2_S4_EEEEEixERS9_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIS2_NS_9allocatorIS2_EEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEENS_4lessIS2_EENS4_INS_4pairIKS2_S6_EEEEEixERSA_; -    _ZNSt3__13mapIN7android8String16ES2_NS_4lessIS2_EENS_9allocatorINS_4pairIKS2_S2_EEEEEixERS7_; -    _ZNSt3__13mapIN7android8String16ExNS_4lessIS2_EENS_9allocatorINS_4pairIKS2_xEEEEEixERS7_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISC_EERKT_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JNS_4pairIKS3_S5_EEEEENSF_INS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EEiEERPNS_15__tree_end_nodeISI_EESJ_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISI_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEEEvT_SL_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE15__emplace_multiIJRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEENS_21__tree_const_iteratorIS6_SO_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EEiEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEENS_21__tree_const_iteratorIS8_SP_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIxNS_9allocatorIxEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__erase_uniqueIS3_EEjRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE5eraseENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EEiEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_xEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_xEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEENS_21__tree_const_iteratorIS4_SM_iEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEEiEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ExEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_11__thread_idENS_6threadEEENS_19__map_value_compareIS2_S4_NS_4lessIS2_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISO_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSO_IJEEEEEENS_4pairINS_15__tree_iteratorISD_PNS_11__tree_nodeISD_PvEEiEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE7destroyEPNS_11__tree_nodeISD_PvEE; -    _ZNSt3__16vectorIaNS_9allocatorIaEEE6insertIPKaEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIaNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPaEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb0ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb1ELj0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE7reserveEj; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE9push_backERKb; -    _ZNSt3__16vectorIbNS_9allocatorIbEEEaSERKS3_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6assignIPdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6insertIPKdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPdEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEEC2ERKS3_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE24__emplace_back_slow_pathIJDsEEEvDpOT_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE7reserveEj; -    _ZNSt3__16vectorIfNS_9allocatorIfEEE6insertIPKfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPfEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIhNS_9allocatorIhEEE6insertIPKhEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIhNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPhEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6insertIPKiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPiEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIN7android2os16ServiceDebugInfoENS_9allocatorIS3_EEE8__appendEj; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSession13RpcConnectionEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSessionEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE8__appendEj; -    _ZNSt3__16vectorIN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS5_EEE8__appendEj; -    _ZNSt3__16vectorIN7android8RpcState10BinderNode9AsyncTodoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE8__appendEj; -    _ZNSt3__16vectorINS_10unique_ptrIN7android8String16ENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEj; -    _ZNSt3__16vectorINS_10unique_ptrINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_14default_deleteIS7_EEEENS5_ISA_EEE8__appendEj; -    _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEj; -    _ZNSt3__16vectorINS_8optionalIN7android8String16EEENS_9allocatorIS4_EEE8__appendEj; -    _ZNSt3__16vectorINS_8optionalINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEE8__appendEj; -    _ZNSt3__16vectorIxNS_9allocatorIxEEE6assignIPxEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIxNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIxNS_9allocatorIxEEE6insertIPKxEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIxNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPxEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIxNS_9allocatorIxEEEC2ERKS3_; -    _ZNSt3__16vectorIyNS_9allocatorIyEEE6insertIPKyEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIyNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPyEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__19__sift_upIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeE;      _ZTCN7android10AllocationE0_NS_10IInterfaceE;      _ZTCN7android10AllocationE0_NS_10MemoryBaseE;      _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE; @@ -1289,12 +1080,6 @@ LIBBINDER {      _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;      _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;      _ZTCN7android2os17BpServiceCallbackE4_NS_9BpRefBaseE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_10IInterfaceE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_11BnInterfaceINS_2os15IClientCallbackEEE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os15IClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os16BnClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE4_NS_7BBinderE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE4_NS_7IBinderE;      _ZTCN7android7BBinderE0_NS_7IBinderE;      _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;      _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE; @@ -1379,7 +1164,6 @@ LIBBINDER {      _ZTTN7android2os16IServiceCallbackE;      _ZTTN7android2os17BnServiceCallbackE;      _ZTTN7android2os17BpServiceCallbackE; -    _ZTTN7android6binder8internal25ClientCounterCallbackImplE;      _ZTTN7android7BBinderE;      _ZTTN7android7content2pm21IPackageManagerNativeE;      _ZTTN7android7content2pm22BnPackageManagerNativeE; @@ -1506,7 +1290,6 @@ LIBBINDER {      _ZTVN7android2os17BpServiceCallbackE;      _ZTVN7android2os17PersistableBundleE;      _ZTVN7android2os20ParcelFileDescriptorE; -    _ZTVN7android6binder8internal25ClientCounterCallbackImplE;      _ZTVN7android6VectorIiEE;      _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;      _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE; @@ -1531,10 +1314,6 @@ LIBBINDER {      _ZTVN7android9BpRefBaseE;      _ZTVN7android9HeapCacheE;      _ZTVN7android9RpcServerE; -    _ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEEE;    local:      *;  }; diff --git a/libs/binder/libbinder.arm64.map b/libs/binder/libbinder.arm64.map index dc34de8641..62112502ab 100644 --- a/libs/binder/libbinder.arm64.map +++ b/libs/binder/libbinder.arm64.map @@ -350,11 +350,6 @@ LIBBINDER {      _ZN7android2os20ParcelFileDescriptorD0Ev;      _ZN7android2os20ParcelFileDescriptorD1Ev;      _ZN7android2os20ParcelFileDescriptorD2Ev; -    _ZN7android2spINS_21IPermissionControllerEED2Ev; -    _ZN7android2spINS_7BBinderEED2Ev; -    _ZN7android2spINS_7IBinderEEaSEOS2_; -    _ZN7android2spINS_7IBinderEEaSERKS2_; -    _ZN7android2spINS_9HeapCacheEED2Ev;      _ZN7android4aerrE;      _ZN7android4alogE;      _ZN7android4aoutE; @@ -390,15 +385,6 @@ LIBBINDER {      _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;      _ZN7android6binder8internal21ClientCounterCallbackC1Ev;      _ZN7android6binder8internal21ClientCounterCallbackC2Ev; -    _ZN7android6binder8internal25ClientCounterCallbackImpl10reRegisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl11tryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl12forcePersistEb; -    _ZN7android6binder8internal25ClientCounterCallbackImpl13tryUnregisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi; -    _ZN7android6binder8internal25ClientCounterCallbackImpl16maybeTryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl23assertRegisteredServiceERKNS_2spINS_7IBinderEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl25setActiveServicesCallbackERKNSt3__18functionIFbbEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl9onClientsERKNS_2spINS_7IBinderEEEb;      _ZN7android6Parcel10appendFromEPKS0_mm;      _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;      _ZN7android6Parcel10writeFloatEf; @@ -1066,186 +1052,6 @@ LIBBINDER {      _ZNK7android8BpBinder18isDescriptorCachedEv;      _ZNK7android8BpBinder22getInterfaceDescriptorEv;      _ZNK7android8BpMemory9getMemoryEPlPm; -    _ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__111__sift_downIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeESB_; -    _ZNSt3__111unique_lockINS_5mutexEE6unlockEv; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE14__erase_uniqueIiEEmRKT_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6rehashEm; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE8__rehashEm; -    _ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN7android9RpcServerEFvONS7_2spIS8_EENS7_4base14unique_fd_implINSC_13DefaultCloserEEEEPS8_SA_SF_EEEEEPvSK_; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE21__on_zero_shared_weakEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE21__on_zero_shared_weakEv; -    _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m; -    _ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISC_EERKT_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JNS_4pairIKS3_S5_EEEEENSF_INS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_lEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_lEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EElEERPNS_15__tree_end_nodeISI_EESJ_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISI_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEEEvT_SL_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE15__emplace_multiIJRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEENS_21__tree_const_iteratorIS6_SO_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE16__construct_nodeIJRKNS_4pairIKS3_S7_EEEEENS_10unique_ptrINS_11__tree_nodeIS8_PvEENS_22__tree_node_destructorINS5_ISO_EEEEEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE16__construct_nodeIJRKNS_4pairIKS3_S7_EEEEENS_10unique_ptrINS_11__tree_nodeIS8_PvEENS_22__tree_node_destructorINS5_ISO_EEEEEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE5eraseENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_11__thread_idENS_6threadEEENS_19__map_value_compareIS2_S4_NS_4lessIS2_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISO_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSO_IJEEEEEENS_4pairINS_15__tree_iteratorISD_PNS_11__tree_nodeISD_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE7destroyEPNS_11__tree_nodeISD_PvEE; -    _ZNSt3__16vectorIaNS_9allocatorIaEEE6insertIPKaEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIaNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPaEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb0ELm0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb1ELm0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE7reserveEm; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE9push_backERKb; -    _ZNSt3__16vectorIbNS_9allocatorIbEEEaSERKS3_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6assignIPdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6insertIPKdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPdEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE24__emplace_back_slow_pathIJDsEEEvDpOT_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE7reserveEm; -    _ZNSt3__16vectorIfNS_9allocatorIfEEE6insertIPKfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPfEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIhNS_9allocatorIhEEE6insertIPKhEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIhNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPhEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6insertIPKiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPiEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIlNS_9allocatorIlEEE6assignIPlEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIlNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorImNS_9allocatorImEEE6insertIPKmEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleImNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPmEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIN7android2os16ServiceDebugInfoENS_9allocatorIS3_EEE8__appendEm; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSession13RpcConnectionEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSessionEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE8__appendEm; -    _ZNSt3__16vectorIN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS5_EEE8__appendEm; -    _ZNSt3__16vectorIN7android8RpcState10BinderNode9AsyncTodoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE8__appendEm; -    _ZNSt3__16vectorINS_10unique_ptrIN7android8String16ENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEm; -    _ZNSt3__16vectorINS_10unique_ptrINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_14default_deleteIS7_EEEENS5_ISA_EEE8__appendEm; -    _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEm; -    _ZNSt3__16vectorINS_8optionalIN7android8String16EEENS_9allocatorIS4_EEE8__appendEm; -    _ZNSt3__16vectorINS_8optionalINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEE8__appendEm;      _ZTCN7android10AllocationE0_NS_10IInterfaceE;      _ZTCN7android10AllocationE0_NS_10MemoryBaseE;      _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE; @@ -1339,12 +1145,6 @@ LIBBINDER {      _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;      _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;      _ZTCN7android2os17BpServiceCallbackE8_NS_9BpRefBaseE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_10IInterfaceE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_11BnInterfaceINS_2os15IClientCallbackEEE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os15IClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os16BnClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE8_NS_7BBinderE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE8_NS_7IBinderE;      _ZTCN7android7BBinderE0_NS_7IBinderE;      _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;      _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE; @@ -1433,7 +1233,6 @@ LIBBINDER {      _ZTTN7android2os16IServiceCallbackE;      _ZTTN7android2os17BnServiceCallbackE;      _ZTTN7android2os17BpServiceCallbackE; -    _ZTTN7android6binder8internal25ClientCounterCallbackImplE;      _ZTTN7android7BBinderE;      _ZTTN7android7content2pm21IPackageManagerNativeE;      _ZTTN7android7content2pm22BnPackageManagerNativeE; @@ -1565,7 +1364,6 @@ LIBBINDER {      _ZTVN7android2os17BpServiceCallbackE;      _ZTVN7android2os17PersistableBundleE;      _ZTVN7android2os20ParcelFileDescriptorE; -    _ZTVN7android6binder8internal25ClientCounterCallbackImplE;      _ZTVN7android6VectorIiEE;      _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;      _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE; @@ -1592,10 +1390,6 @@ LIBBINDER {      _ZTVN7android9RpcServerE;      _ZTvn8_n32_N7android14MemoryHeapBaseD0Ev;      _ZTvn8_n32_N7android14MemoryHeapBaseD1Ev; -    _ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEEE;    local:      *;  }; diff --git a/libs/binder/libbinder.arm64.vendor.map b/libs/binder/libbinder.arm64.vendor.map index 971ba925dd..df6aa66071 100644 --- a/libs/binder/libbinder.arm64.vendor.map +++ b/libs/binder/libbinder.arm64.vendor.map @@ -320,10 +320,6 @@ LIBBINDER {      _ZN7android2os20ParcelFileDescriptorD0Ev;      _ZN7android2os20ParcelFileDescriptorD1Ev;      _ZN7android2os20ParcelFileDescriptorD2Ev; -    _ZN7android2spINS_7BBinderEED2Ev; -    _ZN7android2spINS_7IBinderEEaSEOS2_; -    _ZN7android2spINS_7IBinderEEaSERKS2_; -    _ZN7android2spINS_9HeapCacheEED2Ev;      _ZN7android4aerrE;      _ZN7android4alogE;      _ZN7android4aoutE; @@ -359,15 +355,6 @@ LIBBINDER {      _ZN7android6binder8internal21ClientCounterCallback25setActiveServicesCallbackERKNSt3__18functionIFbbEEE;      _ZN7android6binder8internal21ClientCounterCallbackC1Ev;      _ZN7android6binder8internal21ClientCounterCallbackC2Ev; -    _ZN7android6binder8internal25ClientCounterCallbackImpl10reRegisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl11tryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl12forcePersistEb; -    _ZN7android6binder8internal25ClientCounterCallbackImpl13tryUnregisterEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl15registerServiceERKNS_2spINS_7IBinderEEERKNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEbi; -    _ZN7android6binder8internal25ClientCounterCallbackImpl16maybeTryShutdownEv; -    _ZN7android6binder8internal25ClientCounterCallbackImpl23assertRegisteredServiceERKNS_2spINS_7IBinderEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl25setActiveServicesCallbackERKNSt3__18functionIFbbEEE; -    _ZN7android6binder8internal25ClientCounterCallbackImpl9onClientsERKNS_2spINS_7IBinderEEEb;      _ZN7android6Parcel10appendFromEPKS0_mm;      _ZN7android6Parcel10markForRpcERKNS_2spINS_10RpcSessionEEE;      _ZN7android6Parcel10writeFloatEf; @@ -1011,186 +998,6 @@ LIBBINDER {      _ZNK7android8BpBinder18isDescriptorCachedEv;      _ZNK7android8BpBinder22getInterfaceDescriptorEv;      _ZNK7android8BpMemory9getMemoryEPlPm; -    _ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNKSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__111__sift_downIRNS_4lessIN7android8RpcState10BinderNode9AsyncTodoEEENS_11__wrap_iterIPS5_EEEEvT0_SB_T_NS_15iterator_traitsISB_E15difference_typeESB_; -    _ZNSt3__111unique_lockINS_5mutexEE6unlockEv; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE14__erase_uniqueIiEEmRKT_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSI_IJEEEEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEERKT_DpOT0_; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6rehashEm; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeIS2_PvEEEE; -    _ZNSt3__112__hash_tableINS_17__hash_value_typeIijEENS_22__unordered_map_hasherIiS2_NS_4hashIiEELb1EEENS_21__unordered_map_equalIiS2_NS_8equal_toIiEELb1EEENS_9allocatorIS2_EEE8__rehashEm; -    _ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__copy_alignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEMN7android9RpcServerEFvONS7_2spIS8_EENS7_4base14unique_fd_implINSC_13DefaultCloserEEEEPS8_SA_SF_EEEEEPvSK_; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi; -    _ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb0EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__116__copy_unalignedINS_6vectorIbNS_9allocatorIbEEEELb1EEENS_14__bit_iteratorIT_Lb0EXLi0EEEENS5_IS6_XT0_EXLi0EEEES8_S7_; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEE21__on_zero_shared_weakEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE16__on_zero_sharedEv; -    _ZNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEE21__on_zero_shared_weakEv; -    _ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m; -    _ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE12__find_equalIS2_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISC_EERKT_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE25__emplace_unique_key_argsIS2_JRKS2_EEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeIN7android8String16ENS_4lessIS2_EENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIiN7android2spINS2_10RpcSessionEEEEENS_19__map_value_compareIiS6_NS_4lessIiEELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JNS_4pairIKS3_S5_EEEEENSF_INS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android10RpcAddressENS2_8RpcState10BinderNodeEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_bEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EbEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_dEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EdEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_iEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16EiEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_lEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_lEEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ElEENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_SG_EElEERPNS_15__tree_end_nodeISI_EESJ_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISI_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__assign_multiINS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEEEvT_SL_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE15__emplace_multiIJRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSI_IJEEEEEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S5_EEEEENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEENS_21__tree_const_iteratorIS6_SO_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE4findIS3_EENS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE5eraseENS_21__tree_const_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS2_2os17PersistableBundleEEENS_19__map_value_compareIS3_S6_NS_4lessIS3_EELb1EEENS_9allocatorIS6_EEE7destroyEPNS_11__tree_nodeIS6_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE16__construct_nodeIJRKNS_4pairIKS3_S7_EEEEENS_10unique_ptrINS_11__tree_nodeIS8_PvEENS_22__tree_node_destructorINS5_ISO_EEEEEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIbNS_9allocatorIbEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIdNS_9allocatorIdEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIiNS_9allocatorIiEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIlNS_9allocatorIlEEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_SH_EElEERPNS_15__tree_end_nodeISJ_EESK_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISJ_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__assign_multiINS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEEEvT_SM_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE15__emplace_multiIJRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE16__construct_nodeIJRKNS_4pairIKS3_S7_EEEEENS_10unique_ptrINS_11__tree_nodeIS8_PvEENS_22__tree_node_destructorINS5_ISO_EEEEEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSJ_IJEEEEEENS_4pairINS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S7_EEEEENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEENS_21__tree_const_iteratorIS8_SP_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE4findIS3_EENS_15__tree_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE5eraseENS_21__tree_const_iteratorIS8_PNS_11__tree_nodeIS8_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ENS_6vectorIS3_NS_9allocatorIS3_EEEEEENS_19__map_value_compareIS3_S8_NS_4lessIS3_EELb1EEENS5_IS8_EEE7destroyEPNS_11__tree_nodeIS8_PvEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_SE_EElEERPNS_15__tree_end_nodeISG_EESH_RKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE12__find_equalIS3_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISG_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__assign_multiINS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEEEvT_SJ_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE14__erase_uniqueIS3_EEmRKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE15__emplace_multiIJRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEDpOT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE25__emplace_unique_key_argsIS3_JRKNS_21piecewise_construct_tENS_5tupleIJRKS3_EEENSG_IJEEEEEENS_4pairINS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE30__emplace_hint_unique_key_argsIS3_JRKNS_4pairIKS3_S3_EEEEENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEENS_21__tree_const_iteratorIS4_SM_lEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE4findIS3_EENS_15__tree_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEERKT_; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE5eraseENS_21__tree_const_iteratorIS4_PNS_11__tree_nodeIS4_PvEElEE; -    _ZNSt3__16__treeINS_12__value_typeIN7android8String16ES3_EENS_19__map_value_compareIS3_S4_NS_4lessIS3_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_11__thread_idENS_6threadEEENS_19__map_value_compareIS2_S4_NS_4lessIS2_EELb1EEENS_9allocatorIS4_EEE7destroyEPNS_11__tree_nodeIS4_PvEE; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISO_EERKT_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSO_IJEEEEEENS_4pairINS_15__tree_iteratorISD_PNS_11__tree_nodeISD_PvEElEEbEERKT_DpOT0_; -    _ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN7android6binder8internal25ClientCounterCallbackImpl7ServiceEEENS_19__map_value_compareIS7_SD_NS_4lessIS7_EELb1EEENS5_ISD_EEE7destroyEPNS_11__tree_nodeISD_PvEE; -    _ZNSt3__16vectorIaNS_9allocatorIaEEE6insertIPKaEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIaNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPaEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb0ELm0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE18__construct_at_endINS_14__bit_iteratorIS3_Lb1ELm0EEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES8_S8_; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE7reserveEm; -    _ZNSt3__16vectorIbNS_9allocatorIbEEE9push_backERKb; -    _ZNSt3__16vectorIbNS_9allocatorIbEEEaSERKS3_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6assignIPdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIdNS_9allocatorIdEEE6insertIPKdEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIdNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPdEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE24__emplace_back_slow_pathIJDsEEEvDpOT_; -    _ZNSt3__16vectorIDsNS_9allocatorIDsEEE7reserveEm; -    _ZNSt3__16vectorIfNS_9allocatorIfEEE6insertIPKfEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIfNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPfEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIhNS_9allocatorIhEEE6insertIPKhEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIhNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPhEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6assignIPiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorIiNS_9allocatorIiEEE6insertIPKiEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIiNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPiEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIlNS_9allocatorIlEEE6assignIPlEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIlNS_15iterator_traitsIS7_E9referenceEEE5valueEvE4typeES7_S7_; -    _ZNSt3__16vectorImNS_9allocatorImEEE6insertIPKmEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleImNS_15iterator_traitsIS8_E9referenceEEE5valueENS_11__wrap_iterIPmEEE4typeENSC_IS6_EES8_S8_; -    _ZNSt3__16vectorIN7android2os16ServiceDebugInfoENS_9allocatorIS3_EEE8__appendEm; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSession13RpcConnectionEEENS_9allocatorIS5_EEE21__push_back_slow_pathIRKS5_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_10RpcSessionEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT_; -    _ZNSt3__16vectorIN7android2spINS1_7IBinderEEENS_9allocatorIS4_EEE8__appendEm; -    _ZNSt3__16vectorIN7android4base14unique_fd_implINS2_13DefaultCloserEEENS_9allocatorIS5_EEE8__appendEm; -    _ZNSt3__16vectorIN7android8RpcState10BinderNode9AsyncTodoENS_9allocatorIS4_EEE21__push_back_slow_pathIS4_EEvOT_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9_; -    _ZNSt3__16vectorIN7android8String16ENS_9allocatorIS2_EEE8__appendEm; -    _ZNSt3__16vectorINS_10unique_ptrIN7android8String16ENS_14default_deleteIS3_EEEENS_9allocatorIS6_EEE8__appendEm; -    _ZNSt3__16vectorINS_10unique_ptrINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_14default_deleteIS7_EEEENS5_ISA_EEE8__appendEm; -    _ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEm; -    _ZNSt3__16vectorINS_8optionalIN7android8String16EEENS_9allocatorIS4_EEE8__appendEm; -    _ZNSt3__16vectorINS_8optionalINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS5_IS8_EEE8__appendEm;      _ZTCN7android10AllocationE0_NS_10IInterfaceE;      _ZTCN7android10AllocationE0_NS_10MemoryBaseE;      _ZTCN7android10AllocationE0_NS_11BnInterfaceINS_7IMemoryEEE; @@ -1274,12 +1081,6 @@ LIBBINDER {      _ZTCN7android2os17BpServiceCallbackE0_NS_10IInterfaceE;      _ZTCN7android2os17BpServiceCallbackE0_NS_11BpInterfaceINS0_16IServiceCallbackEEE;      _ZTCN7android2os17BpServiceCallbackE8_NS_9BpRefBaseE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_10IInterfaceE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_11BnInterfaceINS_2os15IClientCallbackEEE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os15IClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE0_NS_2os16BnClientCallbackE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE8_NS_7BBinderE; -    _ZTCN7android6binder8internal25ClientCounterCallbackImplE8_NS_7IBinderE;      _ZTCN7android7BBinderE0_NS_7IBinderE;      _ZTCN7android7content2pm21IPackageManagerNativeE0_NS_10IInterfaceE;      _ZTCN7android7content2pm22BnPackageManagerNativeE0_NS_10IInterfaceE; @@ -1364,7 +1165,6 @@ LIBBINDER {      _ZTTN7android2os16IServiceCallbackE;      _ZTTN7android2os17BnServiceCallbackE;      _ZTTN7android2os17BpServiceCallbackE; -    _ZTTN7android6binder8internal25ClientCounterCallbackImplE;      _ZTTN7android7BBinderE;      _ZTTN7android7content2pm21IPackageManagerNativeE;      _ZTTN7android7content2pm22BnPackageManagerNativeE; @@ -1489,7 +1289,6 @@ LIBBINDER {      _ZTVN7android2os17BpServiceCallbackE;      _ZTVN7android2os17PersistableBundleE;      _ZTVN7android2os20ParcelFileDescriptorE; -    _ZTVN7android6binder8internal25ClientCounterCallbackImplE;      _ZTVN7android6VectorIiEE;      _ZTVN7android6VectorINS_12ProcessState12handle_entryEEE;      _ZTVN7android6VectorINS_2spINS_18BufferedTextOutput11BufferStateEEEEE; @@ -1516,10 +1315,6 @@ LIBBINDER {      _ZTVN7android9RpcServerE;      _ZTvn8_n32_N7android14MemoryHeapBaseD0Ev;      _ZTvn8_n32_N7android14MemoryHeapBaseD1Ev; -    _ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android14RpcWireAddressENS_9allocatorIS2_EEEE; -    _ZTVNSt3__120__shared_ptr_emplaceIN7android6binder8internal21ClientCounterCallbackENS_9allocatorIS4_EEEE;    local:      *;  }; diff --git a/libs/binder/ndk/tests/Android.bp b/libs/binder/ndk/tests/Android.bp index bb51bf0b5d..ede4873dd6 100644 --- a/libs/binder/ndk/tests/Android.bp +++ b/libs/binder/ndk/tests/Android.bp @@ -95,7 +95,7 @@ cc_test {          "libbinder_ndk",          "libutils",      ], -    test_suites: ["general-tests", "vts"], +    test_suites: ["general-tests"],      require_root: true,  } diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 364c939c18..56a9683773 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -132,8 +132,7 @@ void BLASTBufferItemConsumer::onSidebandStreamChanged() {  BLASTBufferQueue::BLASTBufferQueue(const std::string& name, const sp<SurfaceControl>& surface,                                     int width, int height, int32_t format) -      : mName(name), -        mSurfaceControl(surface), +      : mSurfaceControl(surface),          mSize(width, height),          mRequestedSize(mSize),          mFormat(format), @@ -150,8 +149,9 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, const sp<SurfaceCont                                                                GraphicBuffer::USAGE_HW_TEXTURE,                                                        1, false);      static int32_t id = 0; +    mName = name + "#" + std::to_string(id);      auto consumerName = mName + "(BLAST Consumer)" + std::to_string(id); -    mPendingBufferTrace = "PendingBuffer - " + mName + "BLAST#" + std::to_string(id); +    mQueuedBufferTrace = "QueuedBuffer - " + mName + "BLAST#" + std::to_string(id);      id++;      mBufferItemConsumer->setName(String8(consumerName.c_str()));      mBufferItemConsumer->setFrameAvailableListener(this); @@ -166,11 +166,14 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, const sp<SurfaceCont      mTransformHint = mSurfaceControl->getTransformHint();      mBufferItemConsumer->setTransformHint(mTransformHint);      SurfaceComposerClient::Transaction() -          .setFlags(surface, layer_state_t::eEnableBackpressure, -                    layer_state_t::eEnableBackpressure) -          .apply(); +            .setFlags(surface, layer_state_t::eEnableBackpressure, +                      layer_state_t::eEnableBackpressure) +            .setApplyToken(mApplyToken) +            .apply();      mNumAcquired = 0;      mNumFrameAvailable = 0; +    BQA_LOGV("BLASTBufferQueue created width=%d height=%d format=%d mTransformHint=%d", width, +             height, format, mTransformHint);  }  BLASTBufferQueue::~BLASTBufferQueue() { @@ -188,27 +191,31 @@ BLASTBufferQueue::~BLASTBufferQueue() {  }  void BLASTBufferQueue::update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, -                              int32_t format) { +                              int32_t format, SurfaceComposerClient::Transaction* outTransaction) {      std::unique_lock _lock{mMutex}; -    BQA_LOGV("update width=%d height=%d format=%d", width, height, format);      if (mFormat != format) {          mFormat = format;          mBufferItemConsumer->setDefaultBufferFormat(convertBufferFormat(format));      }      SurfaceComposerClient::Transaction t; +    const bool setBackpressureFlag = !SurfaceControl::isSameSurface(mSurfaceControl, surface);      bool applyTransaction = false; -    if (!SurfaceControl::isSameSurface(mSurfaceControl, surface)) { -        mSurfaceControl = surface; -        t.setFlags(mSurfaceControl, layer_state_t::eEnableBackpressure, -                   layer_state_t::eEnableBackpressure); -        applyTransaction = true; -    } +    // Always update the native object even though they might have the same layer handle, so we can +    // get the updated transform hint from WM. +    mSurfaceControl = surface;      if (mSurfaceControl != nullptr) { +        if (setBackpressureFlag) { +            t.setFlags(mSurfaceControl, layer_state_t::eEnableBackpressure, +                       layer_state_t::eEnableBackpressure); +            applyTransaction = true; +        }          mTransformHint = mSurfaceControl->getTransformHint();          mBufferItemConsumer->setTransformHint(mTransformHint);      } +    BQA_LOGV("update width=%d height=%d format=%d mTransformHint=%d", width, height, format, +             mTransformHint);      ui::Size newSize(width, height);      if (mRequestedSize != newSize) { @@ -221,15 +228,18 @@ void BLASTBufferQueue::update(const sp<SurfaceControl>& surface, uint32_t width,              // We only need to update the scale if we've received at least one buffer. The reason              // for this is the scale is calculated based on the requested size and buffer size.              // If there's no buffer, the scale will always be 1. -            if (mLastBufferInfo.hasBuffer) { -                t.setDestinationFrame(mSurfaceControl, -                                      Rect(0, 0, newSize.getWidth(), newSize.getHeight())); +            SurfaceComposerClient::Transaction* destFrameTransaction = +                    (outTransaction) ? outTransaction : &t; +            if (mSurfaceControl != nullptr && mLastBufferInfo.hasBuffer) { +                destFrameTransaction->setDestinationFrame(mSurfaceControl, +                                                          Rect(0, 0, newSize.getWidth(), +                                                               newSize.getHeight()));              }              applyTransaction = true;          }      }      if (applyTransaction) { -        t.apply(); +        t.setApplyToken(mApplyToken).apply();      }  } @@ -264,6 +274,7 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp<Fence                  mTransformHint = stat.transformHint;                  mBufferItemConsumer->setTransformHint(mTransformHint); +                BQA_LOGV("updated mTransformHint=%d", mTransformHint);                  // Update frametime stamps if the frame was latched and presented, indicated by a                  // valid latch time.                  if (stat.latchTime > 0) { @@ -313,29 +324,30 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp<Fence  // BBQ. This is because if the BBQ is destroyed, then the buffers will be released by the client.  // So we pass in a weak pointer to the BBQ and if it still alive, then we release the buffer.  // Otherwise, this is a no-op. -static void releaseBufferCallbackThunk(wp<BLASTBufferQueue> context, uint64_t graphicBufferId, +static void releaseBufferCallbackThunk(wp<BLASTBufferQueue> context, const ReleaseCallbackId& id,                                         const sp<Fence>& releaseFence, uint32_t transformHint,                                         uint32_t currentMaxAcquiredBufferCount) {      sp<BLASTBufferQueue> blastBufferQueue = context.promote(); -    ALOGV("releaseBufferCallbackThunk graphicBufferId=%" PRIu64 " blastBufferQueue=%s", -          graphicBufferId, blastBufferQueue ? "alive" : "dead");      if (blastBufferQueue) { -        blastBufferQueue->releaseBufferCallback(graphicBufferId, releaseFence, transformHint, +        blastBufferQueue->releaseBufferCallback(id, releaseFence, transformHint,                                                  currentMaxAcquiredBufferCount); +    } else { +        ALOGV("releaseBufferCallbackThunk %s blastBufferQueue is dead", id.to_string().c_str());      }  } -void BLASTBufferQueue::releaseBufferCallback(uint64_t graphicBufferId, +void BLASTBufferQueue::releaseBufferCallback(const ReleaseCallbackId& id,                                               const sp<Fence>& releaseFence, uint32_t transformHint,                                               uint32_t currentMaxAcquiredBufferCount) {      ATRACE_CALL();      std::unique_lock _lock{mMutex}; -    BQA_LOGV("releaseBufferCallback graphicBufferId=%" PRIu64, graphicBufferId); +    BQA_LOGV("releaseBufferCallback %s", id.to_string().c_str());      if (mSurfaceControl != nullptr) {          mTransformHint = transformHint;          mSurfaceControl->setTransformHint(transformHint);          mBufferItemConsumer->setTransformHint(mTransformHint); +        BQA_LOGV("updated mTransformHint=%d", mTransformHint);      }      // Calculate how many buffers we need to hold before we release them back @@ -343,34 +355,34 @@ void BLASTBufferQueue::releaseBufferCallback(uint64_t graphicBufferId,      // on a lower refresh rate than the max supported. We only do that for EGL      // clients as others don't care about latency      const bool isEGL = [&] { -        const auto it = mSubmitted.find(graphicBufferId); +        const auto it = mSubmitted.find(id);          return it != mSubmitted.end() && it->second.mApi == NATIVE_WINDOW_API_EGL;      }();      const auto numPendingBuffersToHold =              isEGL ? std::max(0u, mMaxAcquiredBuffers - currentMaxAcquiredBufferCount) : 0; -    mPendingRelease.emplace_back(ReleasedBuffer{graphicBufferId, releaseFence}); +    mPendingRelease.emplace_back(ReleasedBuffer{id, releaseFence});      // Release all buffers that are beyond the ones that we need to hold      while (mPendingRelease.size() > numPendingBuffersToHold) {          const auto releaseBuffer = mPendingRelease.front();          mPendingRelease.pop_front(); -        auto it = mSubmitted.find(releaseBuffer.bufferId); +        auto it = mSubmitted.find(releaseBuffer.callbackId);          if (it == mSubmitted.end()) { -            BQA_LOGE("ERROR: releaseBufferCallback without corresponding submitted buffer %" PRIu64, -                     graphicBufferId); +            BQA_LOGE("ERROR: releaseBufferCallback without corresponding submitted buffer %s", +                     releaseBuffer.callbackId.to_string().c_str());              return;          } - +        mNumAcquired--; +        BQA_LOGV("released %s", id.to_string().c_str());          mBufferItemConsumer->releaseBuffer(it->second, releaseBuffer.releaseFence);          mSubmitted.erase(it); +        processNextBufferLocked(false /* useNextTransaction */);      }      ATRACE_INT("PendingRelease", mPendingRelease.size()); - -    mNumAcquired--; -    ATRACE_INT(mPendingBufferTrace.c_str(), mNumFrameAvailable + mNumAcquired); -    processNextBufferLocked(false /* useNextTransaction */); +    ATRACE_INT(mQueuedBufferTrace.c_str(), +               mNumFrameAvailable + mNumAcquired - mPendingRelease.size());      mCallbackCV.notify_all();  } @@ -419,7 +431,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {      }      if (rejectBuffer(bufferItem)) { -        BQA_LOGE("rejecting buffer:active_size=%dx%d, requested_size=%dx%d" +        BQA_LOGE("rejecting buffer:active_size=%dx%d, requested_size=%dx%d "                   "buffer{size=%dx%d transform=%d}",                   mSize.width, mSize.height, mRequestedSize.width, mRequestedSize.height,                   buffer->getWidth(), buffer->getHeight(), bufferItem.mTransform); @@ -429,7 +441,9 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {      }      mNumAcquired++; -    mSubmitted[buffer->getId()] = bufferItem; +    mLastAcquiredFrameNumber = bufferItem.mFrameNumber; +    ReleaseCallbackId releaseCallbackId(buffer->getId(), mLastAcquiredFrameNumber); +    mSubmitted[releaseCallbackId] = bufferItem;      bool needsDisconnect = false;      mBufferItemConsumer->getConnectionEvents(bufferItem.mFrameNumber, &needsDisconnect); @@ -443,7 +457,9 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {      incStrong((void*)transactionCallbackThunk);      Rect crop = computeCrop(bufferItem); -    mLastAcquiredFrameNumber = bufferItem.mFrameNumber; +    const bool updateDestinationFrame = +            bufferItem.mScalingMode == NATIVE_WINDOW_SCALING_MODE_FREEZE || +            !mLastBufferInfo.hasBuffer;      mLastBufferInfo.update(true /* hasBuffer */, bufferItem.mGraphicBuffer->getWidth(),                             bufferItem.mGraphicBuffer->getHeight(), bufferItem.mTransform,                             bufferItem.mScalingMode, crop); @@ -452,7 +468,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {              std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,                        std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,                        std::placeholders::_4); -    t->setBuffer(mSurfaceControl, buffer, releaseBufferCallback); +    t->setBuffer(mSurfaceControl, buffer, releaseCallbackId, releaseBufferCallback);      t->setDataspace(mSurfaceControl, static_cast<ui::Dataspace>(bufferItem.mDataSpace));      t->setHdrMetadata(mSurfaceControl, bufferItem.mHdrMetadata);      t->setSurfaceDamageRegion(mSurfaceControl, bufferItem.mSurfaceDamage); @@ -461,7 +477,9 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {      t->addTransactionCompletedCallback(transactionCallbackThunk, static_cast<void*>(this));      mSurfaceControlsWithPendingCallback.push(mSurfaceControl); -    t->setDestinationFrame(mSurfaceControl, Rect(0, 0, mSize.getWidth(), mSize.getHeight())); +    if (updateDestinationFrame) { +        t->setDestinationFrame(mSurfaceControl, Rect(0, 0, mSize.getWidth(), mSize.getHeight())); +    }      t->setBufferCrop(mSurfaceControl, crop);      t->setTransform(mSurfaceControl, bufferItem.mTransform);      t->setTransformToDisplayInverse(mSurfaceControl, bufferItem.mTransformToDisplayInverse); @@ -511,11 +529,11 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {      BQA_LOGV("processNextBufferLocked size=%dx%d mFrameNumber=%" PRIu64               " applyTransaction=%s mTimestamp=%" PRId64 "%s mPendingTransactions.size=%d" -             " graphicBufferId=%" PRIu64, +             " graphicBufferId=%" PRIu64 "%s transform=%d",               mSize.width, mSize.height, bufferItem.mFrameNumber, toString(applyTransaction),               bufferItem.mTimestamp, bufferItem.mIsAutoTimestamp ? "(auto)" : "", -             static_cast<uint32_t>(mPendingTransactions.size()), -             bufferItem.mGraphicBuffer->getId()); +             static_cast<uint32_t>(mPendingTransactions.size()), bufferItem.mGraphicBuffer->getId(), +             bufferItem.mAutoRefresh ? " mAutoRefresh" : "", bufferItem.mTransform);  }  Rect BLASTBufferQueue::computeCrop(const BufferItem& item) { @@ -538,7 +556,8 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) {      }      // add to shadow queue      mNumFrameAvailable++; -    ATRACE_INT(mPendingBufferTrace.c_str(), mNumFrameAvailable + mNumAcquired); +    ATRACE_INT(mQueuedBufferTrace.c_str(), +               mNumFrameAvailable + mNumAcquired - mPendingRelease.size());      BQA_LOGV("onFrameAvailable framenumber=%" PRIu64 " nextTransactionSet=%s", item.mFrameNumber,               toString(nextTransactionSet)); @@ -641,14 +660,6 @@ public:      status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override {          return mBbq->setFrameTimelineInfo(frameTimelineInfo);      } - protected: -    uint32_t getTransformHint() const override { -        if (mStickyTransform == 0 && !transformToDisplayInverse()) { -            return mBbq->getLastTransformHint(); -        } else { -            return 0; -        } -    }  };  // TODO: Can we coalesce this with frame updates? Need to confirm diff --git a/libs/gui/ITransactionCompletedListener.cpp b/libs/gui/ITransactionCompletedListener.cpp index 17499ecd50..98e8b548bd 100644 --- a/libs/gui/ITransactionCompletedListener.cpp +++ b/libs/gui/ITransactionCompletedListener.cpp @@ -125,7 +125,7 @@ status_t SurfaceStats::writeToParcel(Parcel* output) const {      for (const auto& data : jankData) {          SAFE_PARCEL(output->writeParcelable, data);      } -    SAFE_PARCEL(output->writeUint64, previousBufferId); +    SAFE_PARCEL(output->writeParcelable, previousReleaseCallbackId);      return NO_ERROR;  } @@ -149,7 +149,7 @@ status_t SurfaceStats::readFromParcel(const Parcel* input) {          SAFE_PARCEL(input->readParcelable, &data);          jankData.push_back(data);      } -    SAFE_PARCEL(input->readUint64, &previousBufferId); +    SAFE_PARCEL(input->readParcelable, &previousReleaseCallbackId);      return NO_ERROR;  } @@ -253,11 +253,11 @@ public:                                                                    stats);      } -    void onReleaseBuffer(uint64_t graphicBufferId, sp<Fence> releaseFence, uint32_t transformHint, -                         uint32_t currentMaxAcquiredBufferCount) override { +    void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, +                         uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount) override {          callRemoteAsync<decltype(                  &ITransactionCompletedListener::onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, -                                                                  graphicBufferId, releaseFence, +                                                                  callbackId, releaseFence,                                                                    transformHint,                                                                    currentMaxAcquiredBufferCount);      } @@ -308,4 +308,18 @@ status_t CallbackId::readFromParcel(const Parcel* input) {      return NO_ERROR;  } +status_t ReleaseCallbackId::writeToParcel(Parcel* output) const { +    SAFE_PARCEL(output->writeUint64, bufferId); +    SAFE_PARCEL(output->writeUint64, framenumber); +    return NO_ERROR; +} + +status_t ReleaseCallbackId::readFromParcel(const Parcel* input) { +    SAFE_PARCEL(input->readUint64, &bufferId); +    SAFE_PARCEL(input->readUint64, &framenumber); +    return NO_ERROR; +} + +const ReleaseCallbackId ReleaseCallbackId::INVALID_ID = ReleaseCallbackId(0, 0); +  }; // namespace android diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index e65c721ae1..076c90dd23 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -64,6 +64,7 @@ layer_state_t::layer_state_t()          fixedTransformHint(ui::Transform::ROT_INVALID),          frameNumber(0),          autoRefresh(false), +        isTrustedOverlay(false),          bufferCrop(Rect::INVALID_RECT),          destinationFrame(Rect::INVALID_RECT),          releaseBufferListener(nullptr) { @@ -170,6 +171,7 @@ status_t layer_state_t::write(Parcel& output) const      SAFE_PARCEL(output.write, stretchEffect);      SAFE_PARCEL(output.write, bufferCrop);      SAFE_PARCEL(output.write, destinationFrame); +    SAFE_PARCEL(output.writeBool, isTrustedOverlay);      return NO_ERROR;  } @@ -300,6 +302,7 @@ status_t layer_state_t::read(const Parcel& input)      SAFE_PARCEL(input.read, stretchEffect);      SAFE_PARCEL(input.read, bufferCrop);      SAFE_PARCEL(input.read, destinationFrame); +    SAFE_PARCEL(input.readBool, &isTrustedOverlay);      return NO_ERROR;  } @@ -532,6 +535,10 @@ void layer_state_t::merge(const layer_state_t& other) {          what |= eAutoRefreshChanged;          autoRefresh = other.autoRefresh;      } +    if (other.what & eTrustedOverlayChanged) { +        what |= eTrustedOverlayChanged; +        isTrustedOverlay = other.isTrustedOverlay; +    }      if (other.what & eReleaseBufferListenerChanged) {          if (releaseBufferListener) {              ALOGW("Overriding releaseBufferListener"); @@ -562,6 +569,10 @@ bool layer_state_t::hasBufferChanges() const {      return (what & layer_state_t::eBufferChanged) || (what & layer_state_t::eCachedBufferChanged);  } +bool layer_state_t::hasValidBuffer() const { +    return buffer || cachedBuffer.isValid(); +} +  status_t layer_state_t::matrix22_t::write(Parcel& output) const {      SAFE_PARCEL(output.writeFloat, dsdx);      SAFE_PARCEL(output.writeFloat, dtdx); diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 821ec16eb1..2edb4e4ba4 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -70,6 +70,7 @@ Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controll          mGenerationNumber(0),          mSharedBufferMode(false),          mAutoRefresh(false), +        mAutoPrerotation(false),          mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT),          mSharedBufferHasBeenQueued(false),          mQueriedSupportedTimestamps(false), diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index c69435d328..96da8efd19 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -182,12 +182,12 @@ CallbackId TransactionCompletedListener::addCallbackFunction(  void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,                                                     sp<SurfaceControl> surfaceControl) { -    std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); +    std::lock_guard<std::mutex> lock(mMutex);      mJankListeners.insert({surfaceControl->getHandle(), listener});  }  void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) { -    std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); +    std::lock_guard<std::mutex> lock(mMutex);      for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {          if (it->second == listener) {              it = mJankListeners.erase(it); @@ -197,15 +197,16 @@ void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>      }  } -void TransactionCompletedListener::setReleaseBufferCallback(uint64_t graphicBufferId, +void TransactionCompletedListener::setReleaseBufferCallback(const ReleaseCallbackId& callbackId,                                                              ReleaseBufferCallback listener) {      std::scoped_lock<std::mutex> lock(mMutex); -    mReleaseBufferCallbacks[graphicBufferId] = listener; +    mReleaseBufferCallbacks[callbackId] = listener;  } -void TransactionCompletedListener::removeReleaseBufferCallback(uint64_t graphicBufferId) { +void TransactionCompletedListener::removeReleaseBufferCallback( +        const ReleaseCallbackId& callbackId) {      std::scoped_lock<std::mutex> lock(mMutex); -    mReleaseBufferCallbacks.erase(graphicBufferId); +    mReleaseBufferCallbacks.erase(callbackId);  }  void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie, @@ -242,6 +243,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks(  void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {      std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; +    std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap;      {          std::lock_guard<std::mutex> lock(mMutex); @@ -257,6 +259,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener           * sp<SurfaceControl> that could possibly exist for the callbacks.           */          callbacksMap = mCallbacks; +        jankListenersMap = mJankListeners;          for (const auto& transactionStats : listenerStats.transactionStats) {              for (auto& callbackId : transactionStats.callbackIds) {                  mCallbacks.erase(callbackId); @@ -317,14 +320,15 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener                  // and call them. This is a performance optimization when we have a transaction                  // callback and a release buffer callback happening at the same time to avoid an                  // additional ipc call from the server. -                if (surfaceStats.previousBufferId) { +                if (surfaceStats.previousReleaseCallbackId != ReleaseCallbackId::INVALID_ID) {                      ReleaseBufferCallback callback;                      {                          std::scoped_lock<std::mutex> lock(mMutex); -                        callback = popReleaseBufferCallbackLocked(surfaceStats.previousBufferId); +                        callback = popReleaseBufferCallbackLocked( +                                surfaceStats.previousReleaseCallbackId);                      }                      if (callback) { -                        callback(surfaceStats.previousBufferId, +                        callback(surfaceStats.previousReleaseCallbackId,                                   surfaceStats.previousReleaseFence                                           ? surfaceStats.previousReleaseFence                                           : Fence::NO_FENCE, @@ -352,12 +356,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener              }              if (surfaceStats.jankData.empty()) continue; - -            // Acquire jank listener lock such that we guarantee that after calling unregister, -            // there won't be any further callback. -            std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); -            auto copy = mJankListeners; -            auto jankRange = copy.equal_range(surfaceStats.surfaceControl); +            auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl);              for (auto it = jankRange.first; it != jankRange.second; it++) {                  it->second->onJankDataAvailable(surfaceStats.jankData);              } @@ -365,25 +364,26 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener      }  } -void TransactionCompletedListener::onReleaseBuffer(uint64_t graphicBufferId, sp<Fence> releaseFence, -                                                   uint32_t transformHint, +void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId, +                                                   sp<Fence> releaseFence, uint32_t transformHint,                                                     uint32_t currentMaxAcquiredBufferCount) {      ReleaseBufferCallback callback;      {          std::scoped_lock<std::mutex> lock(mMutex); -        callback = popReleaseBufferCallbackLocked(graphicBufferId); +        callback = popReleaseBufferCallbackLocked(callbackId);      }      if (!callback) { -        ALOGE("Could not call release buffer callback, buffer not found %" PRIu64, graphicBufferId); +        ALOGE("Could not call release buffer callback, buffer not found %s", +              callbackId.to_string().c_str());          return;      } -    callback(graphicBufferId, releaseFence, transformHint, currentMaxAcquiredBufferCount); +    callback(callbackId, releaseFence, transformHint, currentMaxAcquiredBufferCount);  }  ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked( -        uint64_t graphicBufferId) { +        const ReleaseCallbackId& callbackId) {      ReleaseBufferCallback callback; -    auto itr = mReleaseBufferCallbacks.find(graphicBufferId); +    auto itr = mReleaseBufferCallbacks.find(callbackId);      if (itr == mReleaseBufferCallbacks.end()) {          return nullptr;      } @@ -1261,7 +1261,7 @@ SurfaceComposerClient::Transaction::setTransformToDisplayInverse(const sp<Surfac  }  SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer( -        const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer, +        const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer, const ReleaseCallbackId& id,          ReleaseBufferCallback callback) {      layer_state_t* s = getLayerState(sc);      if (!s) { @@ -1274,7 +1274,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe      if (mIsAutoTimestamp) {          mDesiredPresentTime = systemTime();      } -    setReleaseBufferCallback(s, callback); +    setReleaseBufferCallback(s, id, callback);      registerSurfaceControlForCallback(sc); @@ -1289,10 +1289,13 @@ void SurfaceComposerClient::Transaction::removeReleaseBufferCallback(layer_state      s->what &= ~static_cast<uint64_t>(layer_state_t::eReleaseBufferListenerChanged);      s->releaseBufferListener = nullptr; -    TransactionCompletedListener::getInstance()->removeReleaseBufferCallback(s->buffer->getId()); +    auto listener = TransactionCompletedListener::getInstance(); +    listener->removeReleaseBufferCallback(s->releaseCallbackId); +    s->releaseCallbackId = ReleaseCallbackId::INVALID_ID;  }  void SurfaceComposerClient::Transaction::setReleaseBufferCallback(layer_state_t* s, +                                                                  const ReleaseCallbackId& id,                                                                    ReleaseBufferCallback callback) {      if (!callback) {          return; @@ -1306,8 +1309,9 @@ void SurfaceComposerClient::Transaction::setReleaseBufferCallback(layer_state_t*      s->what |= layer_state_t::eReleaseBufferListenerChanged;      s->releaseBufferListener = TransactionCompletedListener::getIInstance(); +    s->releaseCallbackId = id;      auto listener = TransactionCompletedListener::getInstance(); -    listener->setReleaseBufferCallback(s->buffer->getId(), callback); +    listener->setReleaseBufferCallback(id, callback);  }  SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAcquireFence( @@ -1652,6 +1656,19 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAutoR      return *this;  } +SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTrustedOverlay( +        const sp<SurfaceControl>& sc, bool isTrustedOverlay) { +    layer_state_t* s = getLayerState(sc); +    if (!s) { +        mStatus = BAD_INDEX; +        return *this; +    } + +    s->what |= layer_state_t::eTrustedOverlayChanged; +    s->isTrustedOverlay = isTrustedOverlay; +    return *this; +} +  SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setApplyToken(          const sp<IBinder>& applyToken) {      mApplyToken = applyToken; diff --git a/libs/gui/bufferqueue/1.0/Conversion.cpp b/libs/gui/bufferqueue/1.0/Conversion.cpp index 3e20a37d54..55462c3b1f 100644 --- a/libs/gui/bufferqueue/1.0/Conversion.cpp +++ b/libs/gui/bufferqueue/1.0/Conversion.cpp @@ -1187,14 +1187,15 @@ bool convertTo(::android::Region* l, Region const& t) {   */  constexpr size_t minFlattenedSize(          HGraphicBufferProducer::QueueBufferInput const& /* t */) { -    return sizeof(int64_t) + // timestamp -            sizeof(int) + // isAutoTimestamp +    return sizeof(int64_t) +            // timestamp +            sizeof(int) +               // isAutoTimestamp              sizeof(android_dataspace) + // dataSpace -            sizeof(::android::Rect) + // crop -            sizeof(int) + // scalingMode -            sizeof(uint32_t) + // transform -            sizeof(uint32_t) + // stickyTransform -            sizeof(bool); // getFrameTimestamps +            sizeof(::android::Rect) +   // crop +            sizeof(int) +               // scalingMode +            sizeof(uint32_t) +          // transform +            sizeof(uint32_t) +          // stickyTransform +            sizeof(bool) +              // getFrameTimestamps +            sizeof(int);                // slot  }  /** @@ -1267,6 +1268,7 @@ status_t flatten(HGraphicBufferProducer::QueueBufferInput const& t,          return status;      }      FlattenableUtils::write(buffer, size, decltype(HdrMetadata::validTypes)(0)); +    FlattenableUtils::write(buffer, size, -1 /*slot*/);      return NO_ERROR;  } @@ -1319,7 +1321,7 @@ status_t unflatten(      if (status != NO_ERROR) {          return status;      } -    // HdrMetadata ignored +    // HdrMetadata and slot ignored      return unflatten(&(t->surfaceDamage), buffer, size);  } diff --git a/libs/gui/include/gui/BLASTBufferQueue.h b/libs/gui/include/gui/BLASTBufferQueue.h index cb0e65e409..ea9b1c68af 100644 --- a/libs/gui/include/gui/BLASTBufferQueue.h +++ b/libs/gui/include/gui/BLASTBufferQueue.h @@ -89,14 +89,15 @@ public:      void transactionCallback(nsecs_t latchTime, const sp<Fence>& presentFence,              const std::vector<SurfaceControlStats>& stats); -    void releaseBufferCallback(uint64_t graphicBufferId, const sp<Fence>& releaseFence, +    void releaseBufferCallback(const ReleaseCallbackId& id, const sp<Fence>& releaseFence,                                 uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount);      void setNextTransaction(SurfaceComposerClient::Transaction *t);      void mergeWithNextTransaction(SurfaceComposerClient::Transaction* t, uint64_t frameNumber);      void setTransactionCompleteCallback(uint64_t frameNumber,                                          std::function<void(int64_t)>&& transactionCompleteCallback); -    void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format); +    void update(const sp<SurfaceControl>& surface, uint32_t width, uint32_t height, int32_t format, +                SurfaceComposerClient::Transaction* outTransaction = nullptr);      void flushShadowQueue() {}      status_t setFrameRate(float frameRate, int8_t compatibility, bool shouldBeSeamless); @@ -125,7 +126,11 @@ private:      static PixelFormat convertBufferFormat(PixelFormat& format);      std::string mName; -    std::string mPendingBufferTrace; +    // Represents the queued buffer count from buffer queue, +    // pre-BLAST. This is mNumFrameAvailable (buffers that queued to blast) + +    // mNumAcquired (buffers that queued to SF)  mPendingRelease.size() (buffers that are held by +    // blast). This counter is read by android studio profiler. +    std::string mQueuedBufferTrace;      sp<SurfaceControl> mSurfaceControl;      std::mutex mMutex; @@ -140,13 +145,14 @@ private:      // Keep a reference to the submitted buffers so we can release when surfaceflinger drops the      // buffer or the buffer has been presented and a new buffer is ready to be presented. -    std::unordered_map<uint64_t /* bufferId */, BufferItem> mSubmitted GUARDED_BY(mMutex); +    std::unordered_map<ReleaseCallbackId, BufferItem, ReleaseBufferCallbackIdHash> mSubmitted +            GUARDED_BY(mMutex);      // Keep a queue of the released buffers instead of immediately releasing      // the buffers back to the buffer queue. This would be controlled by SF      // setting the max acquired buffer count.      struct ReleasedBuffer { -        uint64_t bufferId; +        ReleaseCallbackId callbackId;          sp<Fence> releaseFence;      };      std::deque<ReleasedBuffer> mPendingRelease GUARDED_BY(mMutex); diff --git a/libs/gui/include/gui/ITransactionCompletedListener.h b/libs/gui/include/gui/ITransactionCompletedListener.h index d286c34ec8..937095c543 100644 --- a/libs/gui/include/gui/ITransactionCompletedListener.h +++ b/libs/gui/include/gui/ITransactionCompletedListener.h @@ -53,6 +53,36 @@ struct CallbackIdHash {      std::size_t operator()(const CallbackId& key) const { return std::hash<int64_t>()(key.id); }  }; +class ReleaseCallbackId : public Parcelable { +public: +    static const ReleaseCallbackId INVALID_ID; + +    uint64_t bufferId; +    uint64_t framenumber; +    ReleaseCallbackId() {} +    ReleaseCallbackId(uint64_t bufferId, uint64_t framenumber) +          : bufferId(bufferId), framenumber(framenumber) {} +    status_t writeToParcel(Parcel* output) const override; +    status_t readFromParcel(const Parcel* input) override; + +    bool operator==(const ReleaseCallbackId& rhs) const { +        return bufferId == rhs.bufferId && framenumber == rhs.framenumber; +    } +    bool operator!=(const ReleaseCallbackId& rhs) const { return !operator==(rhs); } +    std::string to_string() const { +        if (*this == INVALID_ID) return "INVALID_ID"; + +        return "bufferId:" + std::to_string(bufferId) + +                " framenumber:" + std::to_string(framenumber); +    } +}; + +struct ReleaseBufferCallbackIdHash { +    std::size_t operator()(const ReleaseCallbackId& key) const { +        return std::hash<uint64_t>()(key.bufferId); +    } +}; +  class FrameEventHistoryStats : public Parcelable {  public:      status_t writeToParcel(Parcel* output) const override; @@ -103,7 +133,7 @@ public:      SurfaceStats(const sp<IBinder>& sc, nsecs_t time, const sp<Fence>& prevReleaseFence,                   uint32_t hint, uint32_t currentMaxAcquiredBuffersCount,                   FrameEventHistoryStats frameEventStats, std::vector<JankData> jankData, -                 uint64_t previousBufferId) +                 ReleaseCallbackId previousReleaseCallbackId)            : surfaceControl(sc),              acquireTime(time),              previousReleaseFence(prevReleaseFence), @@ -111,7 +141,7 @@ public:              currentMaxAcquiredBufferCount(currentMaxAcquiredBuffersCount),              eventStats(frameEventStats),              jankData(std::move(jankData)), -            previousBufferId(previousBufferId) {} +            previousReleaseCallbackId(previousReleaseCallbackId) {}      sp<IBinder> surfaceControl;      nsecs_t acquireTime = -1; @@ -120,7 +150,7 @@ public:      uint32_t currentMaxAcquiredBufferCount = 0;      FrameEventHistoryStats eventStats;      std::vector<JankData> jankData; -    uint64_t previousBufferId; +    ReleaseCallbackId previousReleaseCallbackId;  };  class TransactionStats : public Parcelable { @@ -161,7 +191,7 @@ public:      virtual void onTransactionCompleted(ListenerStats stats) = 0; -    virtual void onReleaseBuffer(uint64_t graphicBufferId, sp<Fence> releaseFence, +    virtual void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence,                                   uint32_t transformHint,                                   uint32_t currentMaxAcquiredBufferCount) = 0;  }; diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h index 16430b324d..3e57ff611e 100644 --- a/libs/gui/include/gui/LayerState.h +++ b/libs/gui/include/gui/LayerState.h @@ -118,6 +118,7 @@ struct layer_state_t {          eBlurRegionsChanged = 0x800'00000000,          eAutoRefreshChanged = 0x1000'00000000,          eStretchChanged = 0x2000'00000000, +        eTrustedOverlayChanged = 0x4000'00000000,      };      layer_state_t(); @@ -126,6 +127,7 @@ struct layer_state_t {      status_t write(Parcel& output) const;      status_t read(const Parcel& input);      bool hasBufferChanges() const; +    bool hasValidBuffer() const;      struct matrix22_t {          float dsdx{0}; @@ -224,6 +226,10 @@ struct layer_state_t {      // in shared buffer mode.      bool autoRefresh; +    // An inherited state that indicates that this surface control and its children +    // should be trusted for input occlusion detection purposes +    bool isTrustedOverlay; +      // Stretch effect to be applied to this layer      StretchEffect stretchEffect; @@ -234,6 +240,12 @@ struct layer_state_t {      // layers only. The callback includes a release fence as well as the graphic      // buffer id to identify the buffer.      sp<ITransactionCompletedListener> releaseBufferListener; + +    // Keeps track of the release callback id associated with the listener. This +    // is not sent to the server since the id can be reconstructed there. This +    // is used to remove the old callback from the client process map if it is +    // overwritten by another setBuffer call. +    ReleaseCallbackId releaseCallbackId;  };  struct ComposerState { diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index fa91bfa010..baa0567617 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -82,7 +82,7 @@ using TransactionCompletedCallback =          std::function<void(nsecs_t /*latchTime*/, const sp<Fence>& /*presentFence*/,                             const std::vector<SurfaceControlStats>& /*stats*/)>;  using ReleaseBufferCallback = -        std::function<void(uint64_t /* graphicsBufferId */, const sp<Fence>& /*releaseFence*/, +        std::function<void(const ReleaseCallbackId&, const sp<Fence>& /*releaseFence*/,                             uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount)>;  using SurfaceStatsCallback = @@ -397,8 +397,9 @@ public:          void cacheBuffers();          void registerSurfaceControlForCallback(const sp<SurfaceControl>& sc); -        void setReleaseBufferCallback(layer_state_t* state, ReleaseBufferCallback callback); -        void removeReleaseBufferCallback(layer_state_t* state); +        void setReleaseBufferCallback(layer_state_t*, const ReleaseCallbackId&, +                                      ReleaseBufferCallback); +        void removeReleaseBufferCallback(layer_state_t*);      public:          Transaction(); @@ -470,6 +471,7 @@ public:          Transaction& setTransformToDisplayInverse(const sp<SurfaceControl>& sc,                                                    bool transformToDisplayInverse);          Transaction& setBuffer(const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer, +                               const ReleaseCallbackId& id = ReleaseCallbackId::INVALID_ID,                                 ReleaseBufferCallback callback = nullptr);          Transaction& setCachedBuffer(const sp<SurfaceControl>& sc, int32_t bufferId);          Transaction& setAcquireFence(const sp<SurfaceControl>& sc, const sp<Fence>& fence); @@ -535,6 +537,9 @@ public:          // in shared buffer mode.          Transaction& setAutoRefresh(const sp<SurfaceControl>& sc, bool autoRefresh); +        // Sets that this surface control and its children are trusted overlays for input +        Transaction& setTrustedOverlay(const sp<SurfaceControl>& sc, bool isTrustedOverlay); +          // Queues up transactions using this token in SurfaceFlinger.  By default, all transactions          // from a client are placed on the same queue. This can be used to prevent multiple          // transactions from blocking each other. @@ -653,9 +658,6 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {      std::mutex mMutex;      // This lock needs to be recursive so we can unregister a callback from within that callback. -    std::recursive_mutex mJankListenerMutex; - -    // This lock needs to be recursive so we can unregister a callback from within that callback.      std::recursive_mutex mSurfaceStatsListenerMutex;      bool mListening GUARDED_BY(mMutex) = false; @@ -680,11 +682,8 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {      std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> mCallbacks              GUARDED_BY(mMutex); - -    // This is protected by mJankListenerMutex, but GUARDED_BY isn't supported for -    // std::recursive_mutex -    std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners; -    std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback> +    std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners GUARDED_BY(mMutex); +    std::unordered_map<ReleaseCallbackId, ReleaseBufferCallback, ReleaseBufferCallbackIdHash>              mReleaseBufferCallbacks GUARDED_BY(mMutex);      // This is protected by mSurfaceStatsListenerMutex, but GUARDED_BY isn't supported for @@ -723,16 +722,16 @@ public:                  SurfaceStatsCallback listener);      void removeSurfaceStatsListener(void* context, void* cookie); -    void setReleaseBufferCallback(uint64_t /* graphicsBufferId */, ReleaseBufferCallback); -    void removeReleaseBufferCallback(uint64_t /* graphicsBufferId */); +    void setReleaseBufferCallback(const ReleaseCallbackId&, ReleaseBufferCallback); +    void removeReleaseBufferCallback(const ReleaseCallbackId&);      // BnTransactionCompletedListener overrides      void onTransactionCompleted(ListenerStats stats) override; -    void onReleaseBuffer(uint64_t /* graphicsBufferId */, sp<Fence> releaseFence, -                         uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount) override; +    void onReleaseBuffer(ReleaseCallbackId, sp<Fence> releaseFence, uint32_t transformHint, +                         uint32_t currentMaxAcquiredBufferCount) override;  private: -    ReleaseBufferCallback popReleaseBufferCallbackLocked(uint64_t /* graphicsBufferId */); +    ReleaseBufferCallback popReleaseBufferCallbackLocked(const ReleaseCallbackId&);  };  } // namespace android diff --git a/libs/gui/tests/BLASTBufferQueue_test.cpp b/libs/gui/tests/BLASTBufferQueue_test.cpp index 6ff67aa7cb..9082d275a2 100644 --- a/libs/gui/tests/BLASTBufferQueue_test.cpp +++ b/libs/gui/tests/BLASTBufferQueue_test.cpp @@ -71,6 +71,10 @@ public:          return mBlastBufferQueueAdapter->mSurfaceControl;      } +    sp<Surface> getSurface() { +        return mBlastBufferQueueAdapter->getSurface(false /* includeSurfaceControlHandle */); +    } +      void waitForCallbacks() {          std::unique_lock lock{mBlastBufferQueueAdapter->mMutex};          // Wait until all but one of the submitted buffers have been released. @@ -758,6 +762,48 @@ TEST_F(BLASTBufferQueueTest, OutOfOrderTransactionTest) {                                 {0, 0, (int32_t)mDisplayWidth, (int32_t)mDisplayHeight / 2}));  } +TEST_F(BLASTBufferQueueTest, TransformHint) { +    // Transform hint is provided to BBQ via the surface control passed by WM +    mSurfaceControl->setTransformHint(ui::Transform::ROT_90); + +    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight); +    sp<IGraphicBufferProducer> igbProducer = adapter.getIGraphicBufferProducer(); +    ASSERT_NE(nullptr, igbProducer.get()); +    ASSERT_EQ(NO_ERROR, igbProducer->setMaxDequeuedBufferCount(2)); +    sp<Surface> surface = adapter.getSurface(); + +    // Before connecting to the surface, we do not get a valid transform hint +    int transformHint; +    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); +    ASSERT_EQ(ui::Transform::ROT_0, transformHint); + +    ASSERT_EQ(NO_ERROR, +              surface->connect(NATIVE_WINDOW_API_CPU, new TestProducerListener(igbProducer))); + +    // After connecting to the surface, we should get the correct hint. +    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); +    ASSERT_EQ(ui::Transform::ROT_90, transformHint); + +    ANativeWindow_Buffer buffer; +    surface->lock(&buffer, nullptr /* inOutDirtyBounds */); + +    // Transform hint is updated via callbacks or surface control updates +    mSurfaceControl->setTransformHint(ui::Transform::ROT_0); +    adapter.update(mSurfaceControl, mDisplayWidth, mDisplayHeight); + +    // The hint does not change and matches the value used when dequeueing the buffer. +    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); +    ASSERT_EQ(ui::Transform::ROT_90, transformHint); + +    surface->unlockAndPost(); + +    // After queuing the buffer, we get the updated transform hint +    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint); +    ASSERT_EQ(ui::Transform::ROT_0, transformHint); + +    adapter.waitForCallbacks(); +} +  class BLASTBufferQueueTransformTest : public BLASTBufferQueueTest {  public:      void test(uint32_t tr) { diff --git a/libs/input/Input.cpp b/libs/input/Input.cpp index 70ed438112..d954d23507 100644 --- a/libs/input/Input.cpp +++ b/libs/input/Input.cpp @@ -23,6 +23,7 @@  #include <limits.h>  #include <string.h> +#include <android-base/properties.h>  #include <android-base/stringprintf.h>  #include <input/Input.h>  #include <input/InputDevice.h> @@ -41,6 +42,15 @@ namespace android {  namespace { +// When per-window-input-rotation is enabled, InputFlinger works in the un-rotated display +// coordinates and SurfaceFlinger includes the display rotation in the input window transforms. +bool isPerWindowInputRotationEnabled() { +    static const bool PER_WINDOW_INPUT_ROTATION = +            base::GetBoolProperty("persist.debug.per_window_input_rotation", false); + +    return PER_WINDOW_INPUT_ROTATION; +} +  float transformAngle(const ui::Transform& transform, float angleRadians) {      // Construct and transform a vector oriented at the specified clockwise angle from vertical.      // Coordinate system: down is increasing Y, right is increasing X. @@ -506,6 +516,8 @@ float MotionEvent::getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,                                               size_t historicalIndex) const {      const PointerCoords* coords = getHistoricalRawPointerCoords(pointerIndex, historicalIndex); +    if (!isPerWindowInputRotationEnabled()) return coords->getAxisValue(axis); +      if (axis == AMOTION_EVENT_AXIS_X || axis == AMOTION_EVENT_AXIS_Y) {          // For compatibility, convert raw coordinates into "oriented screen space". Once app          // developers are educated about getRaw, we can consider removing this. diff --git a/libs/input/android/os/IInputConstants.aidl b/libs/input/android/os/IInputConstants.aidl index 3038d9daa5..474a1e410d 100644 --- a/libs/input/android/os/IInputConstants.aidl +++ b/libs/input/android/os/IInputConstants.aidl @@ -42,16 +42,15 @@ interface IInputConstants      const int INVALID_INPUT_EVENT_ID = 0;      /** -     * The injected event was originally sent from InputDispatcher. Most likely, the journey of the -     * event looked as follows: -     * InputDispatcherPolicyInterface::filterInputEvent -> InputFilter.java::onInputEvent -> -     * InputFilter.java::sendInputEvent -> InputDispatcher::injectInputEvent, without being modified -     * along the way. +     * The input event was injected from accessibility. Used in policyFlags for input event +     * injection.       */ -    const int POLICY_FLAG_INPUTFILTER_TRUSTED = 0x10000; +    const int POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY = 0x20000;      /** -     * The input event was injected from accessibility +     * The input event was generated or modified by accessibility service. +     * Shared by both KeyEvent and MotionEvent flags, so this value should not overlap with either +     * set of flags, including in input/Input.h and in android/input.h.       */ -    const int POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY = 0x20000; +    const int INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 0x800;  } diff --git a/libs/input/tests/InputEvent_test.cpp b/libs/input/tests/InputEvent_test.cpp index 32b72ba616..3b76ddbb7c 100644 --- a/libs/input/tests/InputEvent_test.cpp +++ b/libs/input/tests/InputEvent_test.cpp @@ -17,6 +17,7 @@  #include <array>  #include <math.h> +#include <android-base/properties.h>  #include <attestation/HmacKeyManager.h>  #include <binder/Parcel.h>  #include <gtest/gtest.h> @@ -225,13 +226,34 @@ protected:      static constexpr float X_OFFSET = 1;      static constexpr float Y_OFFSET = 1.1; +    static const std::optional<bool> INITIAL_PER_WINDOW_INPUT_ROTATION_FLAG_VALUE; +      int32_t mId;      ui::Transform mTransform; +    void SetUp() override; +    void TearDown() override; +      void initializeEventWithHistory(MotionEvent* event);      void assertEqualsEventWithHistory(const MotionEvent* event);  }; +const std::optional<bool> MotionEventTest::INITIAL_PER_WINDOW_INPUT_ROTATION_FLAG_VALUE = +        !base::GetProperty("persist.debug.per_window_input_rotation", "").empty() +        ? std::optional(base::GetBoolProperty("persist.debug.per_window_input_rotation", false)) +        : std::nullopt; + +void MotionEventTest::SetUp() { +    // Ensure per_window_input_rotation is enabled. +    base::SetProperty("persist.debug.per_window_input_rotation", "true"); +} + +void MotionEventTest::TearDown() { +    const auto val = INITIAL_PER_WINDOW_INPUT_ROTATION_FLAG_VALUE.has_value() +            ? (*INITIAL_PER_WINDOW_INPUT_ROTATION_FLAG_VALUE ? "true" : "false") +            : ""; +    base::SetProperty("persist.debug.per_window_input_rotation", val); +}  void MotionEventTest::initializeEventWithHistory(MotionEvent* event) {      mId = InputEvent::nextId(); diff --git a/libs/renderengine/gl/GLESRenderEngine.cpp b/libs/renderengine/gl/GLESRenderEngine.cpp index b5dd8ac580..467f848237 100644 --- a/libs/renderengine/gl/GLESRenderEngine.cpp +++ b/libs/renderengine/gl/GLESRenderEngine.cpp @@ -1028,20 +1028,17 @@ bool GLESRenderEngine::supportsProtectedContent() const {      return mProtectedEGLContext != EGL_NO_CONTEXT;  } -bool GLESRenderEngine::useProtectedContext(bool useProtectedContext) { -    if (useProtectedContext == mInProtectedContext) { -        return true; -    } -    if (useProtectedContext && mProtectedEGLContext == EGL_NO_CONTEXT) { -        return false; +void GLESRenderEngine::useProtectedContext(bool useProtectedContext) { +    if (useProtectedContext == mInProtectedContext || +        (useProtectedContext && !supportsProtectedContent())) { +        return;      } +      const EGLSurface surface = useProtectedContext ? mProtectedStubSurface : mStubSurface;      const EGLContext context = useProtectedContext ? mProtectedEGLContext : mEGLContext; -    const bool success = eglMakeCurrent(mEGLDisplay, surface, surface, context) == EGL_TRUE; -    if (success) { +    if (eglMakeCurrent(mEGLDisplay, surface, surface, context) == EGL_TRUE) {          mInProtectedContext = useProtectedContext;      } -    return success;  }  EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer* nativeBuffer,                                                               bool isProtected, diff --git a/libs/renderengine/gl/GLESRenderEngine.h b/libs/renderengine/gl/GLESRenderEngine.h index 915dba364f..4cb1b4259b 100644 --- a/libs/renderengine/gl/GLESRenderEngine.h +++ b/libs/renderengine/gl/GLESRenderEngine.h @@ -62,7 +62,7 @@ public:      void deleteTextures(size_t count, uint32_t const* names) override;      bool isProtected() const override { return mInProtectedContext; }      bool supportsProtectedContent() const override; -    bool useProtectedContext(bool useProtectedContext) override; +    void useProtectedContext(bool useProtectedContext) override;      status_t drawLayers(const DisplaySettings& display,                          const std::vector<const LayerSettings*>& layers,                          const std::shared_ptr<ExternalTexture>& buffer, diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index ac0affb2ee..5964bc3927 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -127,7 +127,7 @@ public:      virtual bool supportsProtectedContent() const = 0;      // Attempt to switch RenderEngine into and out of protectedContext mode -    virtual bool useProtectedContext(bool useProtectedContext) = 0; +    virtual void useProtectedContext(bool useProtectedContext) = 0;      // Notify RenderEngine of changes to the dimensions of the primary display      // so that it can configure its internal caches accordingly. diff --git a/libs/renderengine/include/renderengine/mock/RenderEngine.h b/libs/renderengine/include/renderengine/mock/RenderEngine.h index 0175af3a85..a4aa9ea488 100644 --- a/libs/renderengine/include/renderengine/mock/RenderEngine.h +++ b/libs/renderengine/include/renderengine/mock/RenderEngine.h @@ -44,7 +44,7 @@ public:      MOCK_CONST_METHOD0(getMaxViewportDims, size_t());      MOCK_CONST_METHOD0(isProtected, bool());      MOCK_CONST_METHOD0(supportsProtectedContent, bool()); -    MOCK_METHOD1(useProtectedContext, bool(bool)); +    MOCK_METHOD1(useProtectedContext, void(bool));      MOCK_METHOD0(cleanupPostRender, void());      MOCK_CONST_METHOD0(canSkipPostRenderCleanup, bool());      MOCK_METHOD6(drawLayers, diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp index b3975b04c0..ae8f2384c4 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -41,6 +41,10 @@ const auto kScaleAsymmetric = mat4(0.8f, 0.f,  0.f, 0.f,                                     0.f,  1.1f, 0.f, 0.f,                                     0.f,  0.f,  1.f, 0.f,                                     0.f,  0.f,  0.f, 1.f); +const auto kFlip = mat4(1.1f, -0.1f,  0.f, 0.f, +                        0.1f,  1.1f,  0.f, 0.f, +                        0.f,    0.f,  1.f, 0.f, +                        2.f,    2.f,  0.f, 1.f);  // clang-format on  // When setting layer.sourceDataspace, whether it matches the destination or not determines whether  // a color correction effect is added to the shader. @@ -52,40 +56,64 @@ static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettin                               const std::shared_ptr<ExternalTexture>& dstTexture) {      // Somewhat arbitrary dimensions, but on screen and slightly shorter, based      // on actual use. -    FloatRect rect(0, 0, display.physicalDisplay.width(), display.physicalDisplay.height() - 30); +    const Rect& displayRect = display.physicalDisplay; +    FloatRect rect(0, 0, displayRect.width(), displayRect.height()); +    FloatRect smallerRect(20, 20, displayRect.width()-20, displayRect.height()-20); +      LayerSettings layer{              .geometry =                      Geometry{                              .boundaries = rect,                              .roundedCornersCrop = rect, +                            .roundedCornersRadius = 50.f,                      },              // drawShadow ignores alpha              .shadow =                      ShadowSettings{ +                            .boundaries = rect,                              .ambientColor = vec4(0, 0, 0, 0.00935997f),                              .spotColor = vec4(0, 0, 0, 0.0455841f), -                            .lightPos = vec3(370.508f, -1527.03f, 1650.f), -                            .lightRadius = 2200.0f, -                            .length = 0.955342f, +                            .lightPos = vec3(500.f, -1500.f, 1500.f), +                            .lightRadius = 2500.0f, +                            .length = 15.f,                      }, -            // important that this matches dest so the general shadow fragment shader doesn't -            // have color correction added, and important that it be srgb, so the *vertex* shader -            // doesn't have color correction added. -            .sourceDataspace = kDestDataSpace, +            // setting this is mandatory for shadows and blurs +            .skipContentDraw = true, +            .alpha = 1, +    }; +    LayerSettings caster{ +            .geometry = +                    Geometry{ +                            .boundaries = smallerRect, +                            .roundedCornersCrop = rect, +                            .roundedCornersRadius = 50.f, +                    }, +            .source = +                    PixelSource{ +                            .solidColor = half3(0.f, 0.f, 0.f), +                    }, +            .alpha = 1,      }; -    auto layers = std::vector<const LayerSettings*>{&layer}; -    // The identity matrix will generate the fast shader -    renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd(), -                             nullptr); -    // This matrix, which has different scales for x and y, will -    // generate the slower (more general case) version, which has variants for translucent -    // casters and rounded rects. -    layer.geometry.positionTransform = kScaleAsymmetric; -    for (auto translucent : {false, true}) { -        layer.shadow.casterIsTranslucent = translucent; -        renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, -                                 base::unique_fd(), nullptr); +    auto layers = std::vector<const LayerSettings*>{&layer, &caster}; +    // When sourceDataspace matches dest, the general shadow fragment shader doesn't +    // have color correction added. +    // independently, when it is not srgb, the *vertex* shader has color correction added. +    // This may be a bug, but the shader still needs to be cached as it is triggered +    // during youtube pip. +    for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) { +        layer.sourceDataspace = dataspace; +        // The 2nd matrix, which has different scales for x and y, will +        // generate the slower (more general case) shadow shader +        for (auto transform : {mat4(), kScaleAndTranslate, kFlip}) { +            layer.geometry.positionTransform = transform; +            caster.geometry.positionTransform = transform; +            for (bool translucent : {false, true}){ +                layer.shadow.casterIsTranslucent = translucent; +                renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, +                                        base::unique_fd(), nullptr); +            } +        }      }  } @@ -97,6 +125,9 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting      LayerSettings layer{              .geometry =                      Geometry{ +                            // The position transform doesn't matter when the reduced shader mode +                            // in in effect. A matrix transform stage is always included. +                            .positionTransform = mat4(),                              .boundaries = rect,                              .roundedCornersCrop = rect,                      }, @@ -107,29 +138,20 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting                                            }},      }; -    auto threeCornerRadii = {0.0f, 0.05f, 50.f}; -    auto oneCornerRadius = {50.f}; - -    // Test both drawRect and drawRRect      auto layers = std::vector<const LayerSettings*>{&layer};      for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) {          layer.sourceDataspace = dataspace; -        for (bool identity : {true, false}) { -            layer.geometry.positionTransform = identity ? mat4() : kScaleAndTranslate; -            // Corner radii less than 0.5 creates a special shader. This likely occurs in real usage -            // due to animating corner radius. -            // For the non-idenity matrix, only the large corner radius will create a new shader. -            for (float roundedCornersRadius : identity ? threeCornerRadii : oneCornerRadius) { -                // roundedCornersCrop is always set, but it is this radius that triggers the -                // behavior -                layer.geometry.roundedCornersRadius = roundedCornersRadius; -                for (bool isOpaque : {true, false}) { -                    layer.source.buffer.isOpaque = isOpaque; -                    for (auto alpha : {half(.23999f), half(1.0f)}) { -                        layer.alpha = alpha; -                        renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, -                                                 base::unique_fd(), nullptr); -                    } +        // Cache shaders for both rects and round rects. +        // In reduced shader mode, all non-zero round rect radii get the same code path. +        for (float roundedCornersRadius : {0.0f, 50.0f}) { +            // roundedCornersCrop is always set, but the radius triggers the behavior +            layer.geometry.roundedCornersRadius = roundedCornersRadius; +            for (bool isOpaque : {true, false}) { +                layer.source.buffer.isOpaque = isOpaque; +                for (auto alpha : {half(.2f), half(1.0f)}) { +                    layer.alpha = alpha; +                    renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, +                                             base::unique_fd(), nullptr);                  }              }          } @@ -155,7 +177,7 @@ static void drawSolidLayers(SkiaRenderEngine* renderengine, const DisplaySetting      auto layers = std::vector<const LayerSettings*>{&layer};      for (auto transform : {mat4(), kScaleAndTranslate}) {          layer.geometry.positionTransform = transform; -        for (float roundedCornersRadius : {0.0f, 0.05f, 50.f}) { +        for (float roundedCornersRadius : {0.0f, 50.f}) {              layer.geometry.roundedCornersRadius = roundedCornersRadius;              renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache,                                       base::unique_fd(), nullptr); @@ -173,9 +195,12 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings                              .boundaries = rect,                      },              .alpha = 1, +            // setting this is mandatory for shadows and blurs +            .skipContentDraw = true,      };      auto layers = std::vector<const LayerSettings*>{&layer}; +    // Different blur code is invoked for radii less and greater than 30 pixels      for (int radius : {9, 60}) {          layer.backgroundBlurRadius = radius;          renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, @@ -220,11 +245,9 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti          layer.source = pixelSource;          for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) {              layer.sourceDataspace = dataspace; -            // Produce a CircularRRect clip and an EllipticalRRect clip +            // Produce a CircularRRect clip and an EllipticalRRect clip.              for (auto transform : {kScaleAndTranslate, kScaleAsymmetric}) {                  layer.geometry.positionTransform = transform; -                // In real use, I saw alpha of 1.0 and 0.999, probably a mistake, but cache both -                // shaders.                  for (float alpha : {0.5f, 1.f}) {                      layer.alpha = alpha,                      renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, @@ -235,6 +258,69 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti      }  } +static void drawPIPImageLayer(SkiaRenderEngine* renderengine, const DisplaySettings& display, +                            const std::shared_ptr<ExternalTexture>& dstTexture, +                            const std::shared_ptr<ExternalTexture>& srcTexture) { +    const Rect& displayRect = display.physicalDisplay; +    FloatRect rect(0, 0, displayRect.width(), displayRect.height()); +    LayerSettings layer{ +            .geometry = +                    Geometry{ +                            // Note that this flip matrix only makes a difference when clipping, +                            // which happens in this layer because the roundrect crop is just a bit +                            // larger than the layer bounds. +                            .positionTransform = kFlip, +                            .boundaries = rect, +                            .roundedCornersRadius = 94.2551, +                            .roundedCornersCrop = FloatRect( +                                -93.75, 0, displayRect.width() + 93.75, displayRect.height()), +                    }, +            .source = PixelSource{.buffer = +                                          Buffer{ +                                                  .buffer = srcTexture, +                                                  .maxLuminanceNits = 1000.f, +                                                  .isOpaque = 0, +                                                  .usePremultipliedAlpha = 1, +                                          }}, +            .sourceDataspace = kOtherDataSpace, +            .alpha = 1, + +    }; + +    auto layers = std::vector<const LayerSettings*>{&layer}; +    renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, +                             base::unique_fd(), nullptr); +} + +static void drawHolePunchLayer(SkiaRenderEngine* renderengine, const DisplaySettings& display, +                            const std::shared_ptr<ExternalTexture>& dstTexture) { +    const Rect& displayRect = display.physicalDisplay; +    FloatRect rect(0, 0, displayRect.width(), displayRect.height()); +    FloatRect small(0, 0, displayRect.width()-20, displayRect.height()+20); +    LayerSettings layer{ +            .geometry = +                    Geometry{ +                            .positionTransform = kScaleAndTranslate, +                            // the boundaries have to be smaller than the rounded crop so that +                            // clipRRect is used instead of drawRRect +                            .boundaries = small, +                            .roundedCornersRadius = 50.f, +                            .roundedCornersCrop = rect, +                    }, +            .source = PixelSource{ +                            .solidColor = half3(0.f, 0.f, 0.f), +                    }, +            .sourceDataspace = kDestDataSpace, +            .alpha = 0, +            .disableBlending = true, + +    }; + +    auto layers = std::vector<const LayerSettings*>{&layer}; +    renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, +                            base::unique_fd(), nullptr); +} +  //  // The collection of shaders cached here were found by using perfetto to record shader compiles  // during actions that involve RenderEngine, logging the layer settings, and the shader code @@ -246,8 +332,6 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti  //    kFlushAfterEveryLayer = true  // in external/skia/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp  //    gPrintSKSL = true -// -// TODO(b/184631553) cache the shader involved in youtube pip return.  void Cache::primeShaderCache(SkiaRenderEngine* renderengine) {      const int previousCount = renderengine->reportShadersCompiled();      if (previousCount) { @@ -267,6 +351,12 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) {                  .maxLuminance = 500,                  .outputDataspace = kDestDataSpace,          }; +        DisplaySettings p3Display{ +                .physicalDisplay = displayRect, +                .clip = displayRect, +                .maxLuminance = 500, +                .outputDataspace = kOtherDataSpace, +        };          const int64_t usage = GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE; @@ -289,32 +379,47 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) {                  std::make_shared<ExternalTexture>(srcBuffer, *renderengine,                                                    ExternalTexture::Usage::READABLE |                                                            ExternalTexture::Usage::WRITEABLE); - +        drawHolePunchLayer(renderengine, display, dstTexture);          drawSolidLayers(renderengine, display, dstTexture);          drawShadowLayers(renderengine, display, srcTexture); +        drawShadowLayers(renderengine, p3Display, srcTexture);          if (renderengine->supportsBackgroundBlur()) {              drawBlurLayers(renderengine, display, dstTexture);          } -        // The majority of shaders are related to sampling images. -        drawImageLayers(renderengine, display, dstTexture, srcTexture); -          // should be the same as AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;          const int64_t usageExternal = GRALLOC_USAGE_HW_TEXTURE; -          sp<GraphicBuffer> externalBuffer =                  new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888,                                    1, usageExternal, "primeShaderCache_external");          const auto externalTexture =                  std::make_shared<ExternalTexture>(externalBuffer, *renderengine,                                                    ExternalTexture::Usage::READABLE); -        // TODO(b/184665179) doubles number of image shader compilations, but only somewhere -        // between 6 and 8 will occur in real uses. -        drawImageLayers(renderengine, display, dstTexture, externalTexture); -        // Draw layers for b/185569240. -        drawClippedLayers(renderengine, display, dstTexture, externalTexture); +        // Another external texture with a different pixel format triggers useIsOpaqueWorkaround +        sp<GraphicBuffer> f16ExternalBuffer = +                new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_FP16, +                                  1, usageExternal, "primeShaderCache_external_f16"); +        const auto f16ExternalTexture = +                std::make_shared<ExternalTexture>(f16ExternalBuffer, *renderengine, +                                                  ExternalTexture::Usage::READABLE); + +        // The majority of shaders are related to sampling images. +        // These need to be generated with various source textures +        // The F16 texture may not be usable on all devices, so check first that it was created with +        // the requested usage bit. +        auto textures = {srcTexture, externalTexture}; +        auto texturesWithF16 = {srcTexture, externalTexture, f16ExternalTexture}; +        bool canUsef16 = f16ExternalBuffer->getUsage() & GRALLOC_USAGE_HW_TEXTURE; + +        for (auto texture : canUsef16 ? texturesWithF16 : textures) { +            drawImageLayers(renderengine, display, dstTexture, texture); +            // Draw layers for b/185569240. +            drawClippedLayers(renderengine, display, dstTexture, texture); +        } + +        drawPIPImageLayer(renderengine, display, dstTexture, externalTexture);          const nsecs_t timeAfter = systemTime();          const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index cb80ef4ada..3c59f11395 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -320,7 +320,8 @@ SkiaGLRenderEngine::SkiaGLRenderEngine(const RenderEngineCreationArgs& args, EGL      options.fReducedShaderVariations = true;      options.fPersistentCache = &mSkSLCacheMonitor;      mGrContext = GrDirectContext::MakeGL(glInterface, options); -    if (useProtectedContext(true)) { +    if (supportsProtectedContent()) { +        useProtectedContext(true);          mProtectedGrContext = GrDirectContext::MakeGL(glInterface, options);          useProtectedContext(false);      } @@ -373,12 +374,10 @@ GrDirectContext* SkiaGLRenderEngine::getActiveGrContext() const {      return mInProtectedContext ? mProtectedGrContext.get() : mGrContext.get();  } -bool SkiaGLRenderEngine::useProtectedContext(bool useProtectedContext) { -    if (useProtectedContext == mInProtectedContext) { -        return true; -    } -    if (useProtectedContext && !supportsProtectedContent()) { -        return false; +void SkiaGLRenderEngine::useProtectedContext(bool useProtectedContext) { +    if (useProtectedContext == mInProtectedContext || +        (useProtectedContext && !supportsProtectedContent())) { +        return;      }      // release any scratch resources before switching into a new mode @@ -389,9 +388,8 @@ bool SkiaGLRenderEngine::useProtectedContext(bool useProtectedContext) {      const EGLSurface surface =              useProtectedContext ? mProtectedPlaceholderSurface : mPlaceholderSurface;      const EGLContext context = useProtectedContext ? mProtectedEGLContext : mEGLContext; -    const bool success = eglMakeCurrent(mEGLDisplay, surface, surface, context) == EGL_TRUE; -    if (success) { +    if (eglMakeCurrent(mEGLDisplay, surface, surface, context) == EGL_TRUE) {          mInProtectedContext = useProtectedContext;          // given that we are sharing the same thread between two GrContexts we need to          // make sure that the thread state is reset when switching between the two. @@ -399,7 +397,6 @@ bool SkiaGLRenderEngine::useProtectedContext(bool useProtectedContext) {              getActiveGrContext()->resetContext();          }      } -    return success;  }  base::unique_fd SkiaGLRenderEngine::flush() { @@ -618,9 +615,9 @@ sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader(      if (requiresLinearEffect) {          const ui::Dataspace inputDataspace = -                mUseColorManagement ? layer->sourceDataspace : ui::Dataspace::UNKNOWN; +                mUseColorManagement ? layer->sourceDataspace : ui::Dataspace::V0_SRGB_LINEAR;          const ui::Dataspace outputDataspace = -                mUseColorManagement ? display.outputDataspace : ui::Dataspace::UNKNOWN; +                mUseColorManagement ? display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR;          LinearEffect effect = LinearEffect{.inputDataspace = inputDataspace,                                             .outputDataspace = outputDataspace, @@ -762,7 +759,7 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,      }      const ui::Dataspace dstDataspace = -            mUseColorManagement ? display.outputDataspace : ui::Dataspace::UNKNOWN; +            mUseColorManagement ? display.outputDataspace : ui::Dataspace::V0_SRGB_LINEAR;      sk_sp<SkSurface> dstSurface = surfaceTextureRef->getOrCreateSurface(dstDataspace, grContext);      SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get()); @@ -1413,10 +1410,12 @@ void SkiaGLRenderEngine::onPrimaryDisplaySizeChanged(ui::Size size) {      getActiveGrContext()->setResourceCacheLimit(maxResourceBytes);      // if it is possible to switch contexts then we will resize the other context -    if (useProtectedContext(!mInProtectedContext)) { +    const bool originalProtectedState = mInProtectedContext; +    useProtectedContext(!mInProtectedContext); +    if (mInProtectedContext != originalProtectedState) {          getActiveGrContext()->setResourceCacheLimit(maxResourceBytes);          // reset back to the initial context that was active when this method was called -        useProtectedContext(!mInProtectedContext); +        useProtectedContext(originalProtectedState);      }  } diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.h b/libs/renderengine/skia/SkiaGLRenderEngine.h index b30355bb67..a852bbcaf8 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.h +++ b/libs/renderengine/skia/SkiaGLRenderEngine.h @@ -64,7 +64,7 @@ public:      int getContextPriority() override;      bool isProtected() const override { return mInProtectedContext; }      bool supportsProtectedContent() const override; -    bool useProtectedContext(bool useProtectedContext) override; +    void useProtectedContext(bool useProtectedContext) override;      bool supportsBackgroundBlur() override { return mBlurFilter != nullptr; }      void assertShadersCompiled(int numShaders) override;      void onPrimaryDisplaySizeChanged(ui::Size size) override; diff --git a/libs/renderengine/skia/SkiaRenderEngine.h b/libs/renderengine/skia/SkiaRenderEngine.h index 31ad63e9ce..7cd9eca976 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.h +++ b/libs/renderengine/skia/SkiaRenderEngine.h @@ -44,7 +44,6 @@ public:      virtual void deleteTextures(size_t /*count*/, uint32_t const* /*names*/) override{};      virtual bool isProtected() const override { return false; } // mInProtectedContext; }      virtual bool supportsProtectedContent() const override { return false; }; -    virtual bool useProtectedContext(bool /*useProtectedContext*/) override { return false; };      virtual status_t drawLayers(const DisplaySettings& /*display*/,                                  const std::vector<const LayerSettings*>& /*layers*/,                                  const std::shared_ptr<ExternalTexture>& /*buffer*/, diff --git a/libs/renderengine/skia/filters/BlurFilter.cpp b/libs/renderengine/skia/filters/BlurFilter.cpp index 4ad6e94edf..7c5bee9450 100644 --- a/libs/renderengine/skia/filters/BlurFilter.cpp +++ b/libs/renderengine/skia/filters/BlurFilter.cpp @@ -81,7 +81,7 @@ sk_sp<SkImage> BlurFilter::generate(GrRecordingContext* context, const uint32_t      // Kawase is an approximation of Gaussian, but it behaves differently from it.      // A radius transformation is required for approximating them, and also to introduce      // non-integer steps, necessary to smoothly interpolate large radii. -    float tmpRadius = (float)blurRadius / 6.0f; +    float tmpRadius = (float)blurRadius / 2.0f;      float numberOfPasses = std::min(kMaxPasses, (uint32_t)ceil(tmpRadius));      float radiusByPasses = tmpRadius / (float)numberOfPasses; diff --git a/libs/renderengine/skia/filters/BlurFilter.h b/libs/renderengine/skia/filters/BlurFilter.h index a8e6dd7579..7110018367 100644 --- a/libs/renderengine/skia/filters/BlurFilter.h +++ b/libs/renderengine/skia/filters/BlurFilter.h @@ -42,7 +42,7 @@ public:      static constexpr uint32_t kMaxPasses = 4;      // To avoid downscaling artifacts, we interpolate the blurred fbo with the full composited      // image, up to this radius. -    static constexpr float kMaxCrossFadeRadius = 30.0f; +    static constexpr float kMaxCrossFadeRadius = 10.0f;      explicit BlurFilter();      virtual ~BlurFilter(){}; diff --git a/libs/renderengine/skia/filters/LinearEffect.cpp b/libs/renderengine/skia/filters/LinearEffect.cpp index 9b044e1685..fc45af945b 100644 --- a/libs/renderengine/skia/filters/LinearEffect.cpp +++ b/libs/renderengine/skia/filters/LinearEffect.cpp @@ -167,13 +167,12 @@ static void generateToneMapInterpolation(ui::Dataspace inputDataspace,                                  float nits = xyz.y; -                                // clamp to max input luminance -                                nits = clamp(nits, 0.0, maxInLumi); - -                                // scale [0.0, maxInLumi] to [0.0, maxOutLumi] +                                // if the max input luminance is less than what we can output then +                                // no tone mapping is needed as all color values will be in range.                                  if (maxInLumi <= maxOutLumi) { -                                    return xyz * (maxOutLumi / maxInLumi); +                                    return xyz;                                  } else { +                                      // three control points                                      const float x0 = 10.0;                                      const float y0 = 17.0; diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index e2587419d2..33e3773d50 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -81,6 +81,7 @@ public:                          .setSupportsBackgroundBlur(true)                          .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)                          .setRenderEngineType(type()) +                        .setUseColorManagerment(useColorManagement())                          .build();          return renderengine::gl::GLESRenderEngine::create(reCreationArgs);      } @@ -110,7 +111,7 @@ public:                          .setSupportsBackgroundBlur(true)                          .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)                          .setRenderEngineType(type()) -                        .setUseColorManagerment(true) +                        .setUseColorManagerment(useColorManagement())                          .build();          return renderengine::gl::GLESRenderEngine::create(reCreationArgs);      } @@ -136,16 +137,12 @@ public:                          .setSupportsBackgroundBlur(true)                          .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)                          .setRenderEngineType(type()) -                        // FIXME (b/189935602): This version is currently color managed. -                        // We should change it and fix the tests that fail. -                        //.setUseColorManagerment(false) +                        .setUseColorManagerment(useColorManagement())                          .build();          return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);      } -    // FIXME (b/189935602): This version is currently color managed. -    // We should change it and fix the tests that fail. -    bool useColorManagement() const override { return true; } +    bool useColorManagement() const override { return false; }  };  class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory { @@ -166,7 +163,7 @@ public:                          .setSupportsBackgroundBlur(true)                          .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)                          .setRenderEngineType(type()) -                        .setUseColorManagerment(true) +                        .setUseColorManagerment(useColorManagement())                          .build();          return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);      } diff --git a/libs/renderengine/tests/RenderEngineThreadedTest.cpp b/libs/renderengine/tests/RenderEngineThreadedTest.cpp index c65e731230..830f4630e5 100644 --- a/libs/renderengine/tests/RenderEngineThreadedTest.cpp +++ b/libs/renderengine/tests/RenderEngineThreadedTest.cpp @@ -118,16 +118,26 @@ TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {      ASSERT_EQ(true, result);  } -TEST_F(RenderEngineThreadedTest, useProtectedContext_returnsFalse) { -    EXPECT_CALL(*mRenderEngine, useProtectedContext(false)).WillOnce(Return(false)); -    status_t result = mThreadedRE->useProtectedContext(false); -    ASSERT_EQ(false, result); +TEST_F(RenderEngineThreadedTest, useProtectedContext) { +    EXPECT_CALL(*mRenderEngine, useProtectedContext(true)); +    auto& ipExpect = EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(false)); +    EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true)); +    EXPECT_CALL(*mRenderEngine, isProtected()).After(ipExpect).WillOnce(Return(true)); + +    mThreadedRE->useProtectedContext(true); +    ASSERT_EQ(true, mThreadedRE->isProtected()); + +    // call ANY synchronous function to ensure that useProtectedContext has completed. +    mThreadedRE->getContextPriority(); +    ASSERT_EQ(true, mThreadedRE->isProtected());  } -TEST_F(RenderEngineThreadedTest, useProtectedContext_returnsTrue) { -    EXPECT_CALL(*mRenderEngine, useProtectedContext(false)).WillOnce(Return(true)); -    status_t result = mThreadedRE->useProtectedContext(false); -    ASSERT_EQ(true, result); +TEST_F(RenderEngineThreadedTest, useProtectedContext_quickReject) { +    EXPECT_CALL(*mRenderEngine, useProtectedContext(false)).Times(0); +    EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(false)); +    mThreadedRE->useProtectedContext(false); +    // call ANY synchronous function to ensure that useProtectedContext has completed. +    mThreadedRE->getContextPriority();  }  TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) { diff --git a/libs/renderengine/threaded/RenderEngineThreaded.cpp b/libs/renderengine/threaded/RenderEngineThreaded.cpp index ea3871f235..b9dabc1d05 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.cpp +++ b/libs/renderengine/threaded/RenderEngineThreaded.cpp @@ -90,6 +90,7 @@ void RenderEngineThreaded::threadMain(CreateInstanceFactory factory) NO_THREAD_S      }      mRenderEngine = factory(); +    mIsProtected = mRenderEngine->isProtected();      pthread_setname_np(pthread_self(), mThreadName); @@ -248,10 +249,8 @@ size_t RenderEngineThreaded::getMaxViewportDims() const {  bool RenderEngineThreaded::isProtected() const {      waitUntilInitialized(); -    // ensure that useProtectedContext is not currently being changed by some -    // other thread.      std::lock_guard lock(mThreadMutex); -    return mRenderEngine->isProtected(); +    return mIsProtected;  }  bool RenderEngineThreaded::supportsProtectedContent() const { @@ -259,20 +258,28 @@ bool RenderEngineThreaded::supportsProtectedContent() const {      return mRenderEngine->supportsProtectedContent();  } -bool RenderEngineThreaded::useProtectedContext(bool useProtectedContext) { -    std::promise<bool> resultPromise; -    std::future<bool> resultFuture = resultPromise.get_future(); +void RenderEngineThreaded::useProtectedContext(bool useProtectedContext) { +    if (isProtected() == useProtectedContext || +        (useProtectedContext && !supportsProtectedContent())) { +        return; +    } +      {          std::lock_guard lock(mThreadMutex); -        mFunctionCalls.push( -                [&resultPromise, useProtectedContext](renderengine::RenderEngine& instance) { -                    ATRACE_NAME("REThreaded::useProtectedContext"); -                    bool returnValue = instance.useProtectedContext(useProtectedContext); -                    resultPromise.set_value(returnValue); -                }); +        mFunctionCalls.push([useProtectedContext, this](renderengine::RenderEngine& instance) { +            ATRACE_NAME("REThreaded::useProtectedContext"); +            instance.useProtectedContext(useProtectedContext); +            if (instance.isProtected() != useProtectedContext) { +                ALOGE("Failed to switch RenderEngine context."); +                // reset the cached mIsProtected value to a good state, but this does not +                // prevent other callers of this method and isProtected from reading the +                // invalid cached value. +                mIsProtected = instance.isProtected(); +            } +        }); +        mIsProtected = useProtectedContext;      }      mCondition.notify_one(); -    return resultFuture.get();  }  void RenderEngineThreaded::cleanupPostRender() { diff --git a/libs/renderengine/threaded/RenderEngineThreaded.h b/libs/renderengine/threaded/RenderEngineThreaded.h index 9b523b2140..f2f5c0f7cd 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.h +++ b/libs/renderengine/threaded/RenderEngineThreaded.h @@ -53,7 +53,7 @@ public:      bool isProtected() const override;      bool supportsProtectedContent() const override; -    bool useProtectedContext(bool useProtectedContext) override; +    void useProtectedContext(bool useProtectedContext) override;      void cleanupPostRender() override;      status_t drawLayers(const DisplaySettings& display, @@ -100,6 +100,7 @@ private:       * Render Engine       */      std::unique_ptr<renderengine::RenderEngine> mRenderEngine; +    std::atomic<bool> mIsProtected = false;  };  } // namespace threaded  } // namespace renderengine diff --git a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl index f91f5b9017..9564cba60d 100644 --- a/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl +++ b/libs/sensorprivacy/aidl/android/hardware/ISensorPrivacyManager.aidl @@ -36,7 +36,7 @@ interface ISensorPrivacyManager {      void setSensorPrivacy(boolean enable); -    void setIndividualSensorPrivacy(int userId, int sensor, boolean enable); +    void setIndividualSensorPrivacy(int userId, int source, int sensor, boolean enable); -    void setIndividualSensorPrivacyForProfileGroup(int userId, int sensor, boolean enable); +    void setIndividualSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable);  } diff --git a/libs/ui/include/ui/Transform.h b/libs/ui/include/ui/Transform.h index a197b3b20e..33fbe05035 100644 --- a/libs/ui/include/ui/Transform.h +++ b/libs/ui/include/ui/Transform.h @@ -112,6 +112,7 @@ public:      void dump(const char* name, const char* prefix = "") const;      static constexpr RotationFlags toRotationFlags(Rotation); +    static constexpr Rotation toRotation(RotationFlags);  private:      struct mat33 { @@ -151,5 +152,20 @@ inline constexpr Transform::RotationFlags Transform::toRotationFlags(Rotation ro      }  } +inline constexpr Rotation Transform::toRotation(Transform::RotationFlags rotationFlags) { +    switch (rotationFlags) { +        case ROT_0: +            return ROTATION_0; +        case ROT_90: +            return ROTATION_90; +        case ROT_180: +            return ROTATION_180; +        case ROT_270: +            return ROTATION_270; +        default: +            return ROTATION_0; +    } +} +  }  // namespace ui  }  // namespace android diff --git a/services/gpuservice/bpfprogs/gpu_mem.c b/services/gpuservice/bpfprogs/gpu_mem.c index c75213bbd4..16e1e8a1ef 100644 --- a/services/gpuservice/bpfprogs/gpu_mem.c +++ b/services/gpuservice/bpfprogs/gpu_mem.c @@ -72,4 +72,4 @@ DEFINE_BPF_PROG("tracepoint/gpu_mem/gpu_mem_total", AID_ROOT, AID_GRAPHICS, tp_g      return 0;  } -char _license[] SEC("license") = "Apache 2.0"; +LICENSE("Apache 2.0"); diff --git a/services/inputflinger/TEST_MAPPING b/services/inputflinger/TEST_MAPPING index dc0e60c858..3d85befaf8 100644 --- a/services/inputflinger/TEST_MAPPING +++ b/services/inputflinger/TEST_MAPPING @@ -27,7 +27,17 @@        "name": "CtsViewTestCases",        "options": [          { -          "include-filter": "android.view.cts.MotionEventTest" +          "include-filter": "android.view.cts.MotionEventTest", +          "include-filter": "android.view.cts.VerifyInputEventTest" +        } +      ] +    }, +    { +      "name": "FrameworksCoreTests", +      "options": [ +        { +          "include-filter": "android.view.VerifiedKeyEventTest", +          "include-filter": "android.view.VerifiedMotionEventTest"          }        ]      }, diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index c0010abf8a..1899c5f29d 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -3787,7 +3787,7 @@ void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {          if (shouldSendKeyToInputFilterLocked(args)) {              mLock.unlock(); -            policyFlags |= POLICY_FLAG_FILTERED | POLICY_FLAG_INPUTFILTER_TRUSTED; +            policyFlags |= POLICY_FLAG_FILTERED;              if (!mPolicy->filterInputEvent(&event, policyFlags)) {                  return; // event was consumed by the filter              } @@ -4010,16 +4010,14 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(      }      // For all injected events, set device id = VIRTUAL_KEYBOARD_ID. The only exception is events -    // that have gone through the InputFilter. If the event passed through the InputFilter, -    // but did not get modified, assign the provided device id. If the InputFilter modifies the -    // events in any way, it is responsible for removing this flag. -    // If the injected event originated from accessibility, assign the accessibility device id, -    // so that it can be distinguished from regular injected events. +    // that have gone through the InputFilter. If the event passed through the InputFilter, assign +    // the provided device id. If the InputFilter is accessibility, and it modifies or synthesizes +    // the injected event, it is responsible for setting POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY. +    // For those events, we will set FLAG_IS_ACCESSIBILITY_EVENT to allow apps to distinguish them +    // from events that originate from actual hardware.      int32_t resolvedDeviceId = VIRTUAL_KEYBOARD_ID; -    if (policyFlags & POLICY_FLAG_INPUTFILTER_TRUSTED) { +    if (policyFlags & POLICY_FLAG_FILTERED) {          resolvedDeviceId = event->getDeviceId(); -    } else if (policyFlags & POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY) { -        resolvedDeviceId = ACCESSIBILITY_DEVICE_ID;      }      std::queue<std::unique_ptr<EventEntry>> injectedEntries; @@ -4032,6 +4030,9 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(              }              int32_t flags = incomingKey.getFlags(); +            if (policyFlags & POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY) { +                flags |= AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT; +            }              int32_t keyCode = incomingKey.getKeyCode();              int32_t metaState = incomingKey.getMetaState();              accelerateMetaShortcuts(resolvedDeviceId, action, @@ -4073,6 +4074,7 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(              size_t pointerCount = motionEvent.getPointerCount();              const PointerProperties* pointerProperties = motionEvent.getPointerProperties();              int32_t actionButton = motionEvent.getActionButton(); +            int32_t flags = motionEvent.getFlags();              int32_t displayId = motionEvent.getDisplayId();              if (!validateMotionEvent(action, actionButton, pointerCount, pointerProperties)) {                  return InputEventInjectionResult::FAILED; @@ -4088,6 +4090,10 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(                  }              } +            if (policyFlags & POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY) { +                flags |= AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT; +            } +              mLock.lock();              const nsecs_t* sampleEventTimes = motionEvent.getSampleEventTimes();              const PointerCoords* samplePointerCoords = motionEvent.getSamplePointerCoords(); @@ -4095,8 +4101,7 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(                      std::make_unique<MotionEntry>(motionEvent.getId(), *sampleEventTimes,                                                    resolvedDeviceId, motionEvent.getSource(),                                                    motionEvent.getDisplayId(), policyFlags, action, -                                                  actionButton, motionEvent.getFlags(), -                                                  motionEvent.getMetaState(), +                                                  actionButton, flags, motionEvent.getMetaState(),                                                    motionEvent.getButtonState(),                                                    motionEvent.getClassification(),                                                    motionEvent.getEdgeFlags(), @@ -4116,7 +4121,7 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(                          std::make_unique<MotionEntry>(motionEvent.getId(), *sampleEventTimes,                                                        resolvedDeviceId, motionEvent.getSource(),                                                        motionEvent.getDisplayId(), policyFlags, -                                                      action, actionButton, motionEvent.getFlags(), +                                                      action, actionButton, flags,                                                        motionEvent.getMetaState(),                                                        motionEvent.getButtonState(),                                                        motionEvent.getClassification(), diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp index ca43123d28..fab7f4ca14 100644 --- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp @@ -104,36 +104,37 @@ void MultiTouchMotionAccumulator::process(const RawEvent* rawEvent) {  #endif          } else {              Slot* slot = &mSlots[mCurrentSlot]; +            // If mUsingSlotsProtocol is true, it means the raw pointer has axis info of +            // ABS_MT_TRACKING_ID and ABS_MT_SLOT, so driver should send a valid trackingId while +            // updating the slot. +            if (!mUsingSlotsProtocol) { +                slot->mInUse = true; +            }              switch (rawEvent->code) {                  case ABS_MT_POSITION_X: -                    slot->mInUse = true;                      slot->mAbsMTPositionX = rawEvent->value; +                    warnIfNotInUse(*rawEvent, *slot);                      break;                  case ABS_MT_POSITION_Y: -                    slot->mInUse = true;                      slot->mAbsMTPositionY = rawEvent->value; +                    warnIfNotInUse(*rawEvent, *slot);                      break;                  case ABS_MT_TOUCH_MAJOR: -                    slot->mInUse = true;                      slot->mAbsMTTouchMajor = rawEvent->value;                      break;                  case ABS_MT_TOUCH_MINOR: -                    slot->mInUse = true;                      slot->mAbsMTTouchMinor = rawEvent->value;                      slot->mHaveAbsMTTouchMinor = true;                      break;                  case ABS_MT_WIDTH_MAJOR: -                    slot->mInUse = true;                      slot->mAbsMTWidthMajor = rawEvent->value;                      break;                  case ABS_MT_WIDTH_MINOR: -                    slot->mInUse = true;                      slot->mAbsMTWidthMinor = rawEvent->value;                      slot->mHaveAbsMTWidthMinor = true;                      break;                  case ABS_MT_ORIENTATION: -                    slot->mInUse = true;                      slot->mAbsMTOrientation = rawEvent->value;                      break;                  case ABS_MT_TRACKING_ID: @@ -147,15 +148,12 @@ void MultiTouchMotionAccumulator::process(const RawEvent* rawEvent) {                      }                      break;                  case ABS_MT_PRESSURE: -                    slot->mInUse = true;                      slot->mAbsMTPressure = rawEvent->value;                      break;                  case ABS_MT_DISTANCE: -                    slot->mInUse = true;                      slot->mAbsMTDistance = rawEvent->value;                      break;                  case ABS_MT_TOOL_TYPE: -                    slot->mInUse = true;                      slot->mAbsMTToolType = rawEvent->value;                      slot->mHaveAbsMTToolType = true;                      break; @@ -177,6 +175,13 @@ bool MultiTouchMotionAccumulator::hasStylus() const {      return mHaveStylus;  } +void MultiTouchMotionAccumulator::warnIfNotInUse(const RawEvent& event, const Slot& slot) { +    if (!slot.mInUse) { +        ALOGW("Received unexpected event (0x%0x, 0x%0x) for slot %i with tracking id %i", +              event.code, event.value, mCurrentSlot, slot.mAbsMTTrackingId); +    } +} +  // --- MultiTouchMotionAccumulator::Slot ---  MultiTouchMotionAccumulator::Slot::Slot() { diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.h b/services/inputflinger/reader/mapper/MultiTouchInputMapper.h index ea6f2078d7..225ad49363 100644 --- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.h +++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.h @@ -87,6 +87,7 @@ private:      bool mHaveStylus;      void clearSlots(int32_t initialSlot); +    void warnIfNotInUse(const RawEvent& event, const Slot& slot);  };  class MultiTouchInputMapper : public TouchInputMapper { diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 60502384a3..962d8d2935 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -1471,6 +1471,13 @@ void TouchInputMapper::sync(nsecs_t when, nsecs_t readTime) {            next.rawPointerData.canceledIdBits.value);  #endif +    if (!next.rawPointerData.touchingIdBits.isEmpty() && +        !next.rawPointerData.hoveringIdBits.isEmpty() && +        last.rawPointerData.hoveringIdBits != next.rawPointerData.hoveringIdBits) { +        ALOGI("Multi-touch contains some hovering ids 0x%08x", +              next.rawPointerData.hoveringIdBits.value); +    } +      processRawTouches(false /*timeout*/);  } diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index 77ca12c5dc..3a9dede89b 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -3171,7 +3171,8 @@ protected:          mWindow->consumeFocusEvent(true);      } -    void testInjectedKey(int32_t policyFlags, int32_t injectedDeviceId, int32_t resolvedDeviceId) { +    void testInjectedKey(int32_t policyFlags, int32_t injectedDeviceId, int32_t resolvedDeviceId, +                         int32_t flags) {          KeyEvent event;          const nsecs_t eventTime = systemTime(SYSTEM_TIME_MONOTONIC); @@ -3188,6 +3189,45 @@ protected:          InputEvent* received = mWindow->consume();          ASSERT_NE(nullptr, received);          ASSERT_EQ(resolvedDeviceId, received->getDeviceId()); +        ASSERT_EQ(received->getType(), AINPUT_EVENT_TYPE_KEY); +        KeyEvent& keyEvent = static_cast<KeyEvent&>(*received); +        ASSERT_EQ(flags, keyEvent.getFlags()); +    } + +    void testInjectedMotion(int32_t policyFlags, int32_t injectedDeviceId, int32_t resolvedDeviceId, +                            int32_t flags) { +        MotionEvent event; +        PointerProperties pointerProperties[1]; +        PointerCoords pointerCoords[1]; +        pointerProperties[0].clear(); +        pointerProperties[0].id = 0; +        pointerCoords[0].clear(); +        pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 300); +        pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 400); + +        ui::Transform identityTransform; +        const nsecs_t eventTime = systemTime(SYSTEM_TIME_MONOTONIC); +        event.initialize(InputEvent::nextId(), injectedDeviceId, AINPUT_SOURCE_TOUCHSCREEN, +                         DISPLAY_ID, INVALID_HMAC, AMOTION_EVENT_ACTION_DOWN, 0, 0, +                         AMOTION_EVENT_EDGE_FLAG_NONE, AMETA_NONE, 0, MotionClassification::NONE, +                         identityTransform, 0, 0, AMOTION_EVENT_INVALID_CURSOR_POSITION, +                         AMOTION_EVENT_INVALID_CURSOR_POSITION, +                         0 /*AMOTION_EVENT_INVALID_DISPLAY_SIZE*/, +                         0 /*AMOTION_EVENT_INVALID_DISPLAY_SIZE*/, eventTime, eventTime, +                         /*pointerCount*/ 1, pointerProperties, pointerCoords); + +        const int32_t additionalPolicyFlags = POLICY_FLAG_PASS_TO_USER; +        ASSERT_EQ(InputEventInjectionResult::SUCCEEDED, +                  mDispatcher->injectInputEvent(&event, INJECTOR_PID, INJECTOR_UID, +                                                InputEventInjectionSync::WAIT_FOR_RESULT, 10ms, +                                                policyFlags | additionalPolicyFlags)); + +        InputEvent* received = mWindow->consume(); +        ASSERT_NE(nullptr, received); +        ASSERT_EQ(resolvedDeviceId, received->getDeviceId()); +        ASSERT_EQ(received->getType(), AINPUT_EVENT_TYPE_MOTION); +        MotionEvent& motionEvent = static_cast<MotionEvent&>(*received); +        ASSERT_EQ(flags, motionEvent.getFlags());      }  private: @@ -3195,20 +3235,29 @@ private:  };  TEST_F(InputFilterInjectionPolicyTest, TrustedFilteredEvents_KeepOriginalDeviceId) { -    // We don't need POLICY_FLAG_FILTERED here, but it will be set in practice, so keep it to make -    // the test more closely resemble the real usage -    testInjectedKey(POLICY_FLAG_FILTERED | POLICY_FLAG_INPUTFILTER_TRUSTED, 3 /*injectedDeviceId*/, -                    3 /*resolvedDeviceId*/); +    // Must have POLICY_FLAG_FILTERED here to indicate that the event has gone through the input +    // filter. Without it, the event will no different from a regularly injected event, and the +    // injected device id will be overwritten. +    testInjectedKey(POLICY_FLAG_FILTERED, 3 /*injectedDeviceId*/, 3 /*resolvedDeviceId*/, +                    0 /*flags*/);  } -TEST_F(InputFilterInjectionPolicyTest, EventsInjectedFromAccessibility_HaveAccessibilityDeviceId) { +TEST_F(InputFilterInjectionPolicyTest, KeyEventsInjectedFromAccessibility_HaveAccessibilityFlag) {      testInjectedKey(POLICY_FLAG_FILTERED | POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY, -                    3 /*injectedDeviceId*/, ACCESSIBILITY_DEVICE_ID /*resolvedDeviceId*/); +                    3 /*injectedDeviceId*/, 3 /*resolvedDeviceId*/, +                    AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT); +} + +TEST_F(InputFilterInjectionPolicyTest, +       MotionEventsInjectedFromAccessibility_HaveAccessibilityFlag) { +    testInjectedMotion(POLICY_FLAG_FILTERED | POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY, +                       3 /*injectedDeviceId*/, 3 /*resolvedDeviceId*/, +                       AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT);  }  TEST_F(InputFilterInjectionPolicyTest, RegularInjectedEvents_ReceiveVirtualDeviceId) {      testInjectedKey(0 /*policyFlags*/, 3 /*injectedDeviceId*/, -                    VIRTUAL_KEYBOARD_ID /*resolvedDeviceId*/); +                    VIRTUAL_KEYBOARD_ID /*resolvedDeviceId*/, 0 /*flags*/);  }  class InputDispatcherOnPointerDownOutsideFocus : public InputDispatcherTest { diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 73198bc5a1..997cbe88a1 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -2276,6 +2276,7 @@ TEST_F(TouchIntegrationTest, InputEvent_ProcessSingleTouch) {      const Point centerPoint = mDevice->getCenterPoint();      // ACTION_DOWN +    mDevice->sendTrackingId(FIRST_TRACKING_ID);      mDevice->sendDown(centerPoint);      ASSERT_NO_FATAL_FAILURE(mTestListener->assertNotifyMotionWasCalled(&args));      ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); @@ -2296,6 +2297,8 @@ TEST_F(TouchIntegrationTest, InputEvent_ProcessMultiTouch) {      const Point centerPoint = mDevice->getCenterPoint();      // ACTION_DOWN +    mDevice->sendSlot(FIRST_SLOT); +    mDevice->sendTrackingId(FIRST_TRACKING_ID);      mDevice->sendDown(centerPoint);      ASSERT_NO_FATAL_FAILURE(mTestListener->assertNotifyMotionWasCalled(&args));      ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); @@ -8217,6 +8220,70 @@ TEST_F(MultiTouchInputMapperTest, Process_ShouldHandlePalmToolType_KeepFirstPoin      ASSERT_NE(AMOTION_EVENT_FLAG_CANCELED, motionArgs.flags);  } +/** + * Test multi-touch should sent ACTION_POINTER_UP/ACTION_UP when received the INVALID_TRACKING_ID, + * to prevent the driver side may send unexpected data after set tracking id as INVALID_TRACKING_ID + * cause slot be valid again. + */ +TEST_F(MultiTouchInputMapperTest, Process_MultiTouch_WithInvalidTrackingId) { +    addConfigurationProperty("touch.deviceType", "touchScreen"); +    prepareDisplay(DISPLAY_ORIENTATION_0); +    prepareAxes(POSITION | ID | SLOT | PRESSURE); +    MultiTouchInputMapper& mapper = addMapperAndConfigure<MultiTouchInputMapper>(); + +    NotifyMotionArgs motionArgs; + +    constexpr int32_t x1 = 100, y1 = 200, x2 = 0, y2 = 0; +    // First finger down. +    processId(mapper, FIRST_TRACKING_ID); +    processPosition(mapper, x1, y1); +    processPressure(mapper, RAW_PRESSURE_MAX); +    processSync(mapper); +    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); +    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); +    ASSERT_EQ(uint32_t(1), motionArgs.pointerCount); + +    // First finger move. +    processId(mapper, FIRST_TRACKING_ID); +    processPosition(mapper, x1 + 1, y1 + 1); +    processPressure(mapper, RAW_PRESSURE_MAX); +    processSync(mapper); +    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); +    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); +    ASSERT_EQ(uint32_t(1), motionArgs.pointerCount); + +    // Second finger down. +    processSlot(mapper, SECOND_SLOT); +    processId(mapper, SECOND_TRACKING_ID); +    processPosition(mapper, x2, y2); +    processPressure(mapper, RAW_PRESSURE_MAX); +    processSync(mapper); +    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); +    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), +              motionArgs.action); +    ASSERT_EQ(uint32_t(2), motionArgs.pointerCount); + +    // second finger up with some unexpected data. +    processSlot(mapper, SECOND_SLOT); +    processId(mapper, INVALID_TRACKING_ID); +    processPosition(mapper, x2, y2); +    processSync(mapper); +    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); +    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), +              motionArgs.action); +    ASSERT_EQ(uint32_t(2), motionArgs.pointerCount); + +    // first finger up with some unexpected data. +    processSlot(mapper, FIRST_SLOT); +    processId(mapper, INVALID_TRACKING_ID); +    processPosition(mapper, x2, y2); +    processPressure(mapper, RAW_PRESSURE_MAX); +    processSync(mapper); +    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); +    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); +    ASSERT_EQ(uint32_t(1), motionArgs.pointerCount); +} +  // --- MultiTouchInputMapperTest_ExternalDevice ---  class MultiTouchInputMapperTest_ExternalDevice : public MultiTouchInputMapperTest { diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index 5d6f8c773c..c233bf06cf 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -915,7 +915,7 @@ bool SensorDevice::isSensorActive(int handle) const {      if (activationIndex < 0) {          return false;      } -    return mActivationCount.valueAt(activationIndex).numActiveClients() > 0; +    return mActivationCount.valueAt(activationIndex).isActive;  }  void SensorDevice::onMicSensorAccessChanged(void* ident, int handle, nsecs_t samplingPeriodNs) { diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp index 560834f5f3..c285c00623 100644 --- a/services/sensorservice/SensorInterface.cpp +++ b/services/sensorservice/SensorInterface.cpp @@ -92,14 +92,16 @@ ProximitySensor::ProximitySensor(const sensor_t& sensor, SensorService& service)  }  status_t ProximitySensor::activate(void* ident, bool enabled) { -    bool wasActive = mActive; +    bool lastState = mSensorDevice.isSensorActive(mSensor.getHandle()); +      status_t status = HardwareSensor::activate(ident, enabled);      if (status != NO_ERROR) {          return status;      } -    mActive = enabled; -    if (wasActive != enabled) { -        mSensorService.onProximityActiveLocked(enabled); + +    bool currentState = mSensorDevice.isSensorActive(mSensor.getHandle()); +    if (currentState != lastState) { +        mSensorService.onProximityActiveLocked(currentState);      }      return NO_ERROR;  } diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h index ea181c9877..4e9f7bf9c8 100644 --- a/services/sensorservice/SensorInterface.h +++ b/services/sensorservice/SensorInterface.h @@ -119,7 +119,6 @@ public:      void didEnableAllSensors() override;  private:      SensorService& mSensorService; -    bool mActive;  };  // --------------------------------------------------------------------------- diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 228172140b..726fe8ea84 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -2161,8 +2161,9 @@ bool SensorService::isUidActive(uid_t uid) {  bool SensorService::isRateCappedBasedOnPermission(const String16& opPackageName) {      int targetSdk = getTargetSdkVersion(opPackageName); -    bool hasSamplingRatePermission = PermissionCache::checkCallingPermission( -                    sAccessHighSensorSamplingRatePermission); +    bool hasSamplingRatePermission = checkPermission(sAccessHighSensorSamplingRatePermission, +            IPCThreadState::self()->getCallingPid(), +            IPCThreadState::self()->getCallingUid());      if (targetSdk < __ANDROID_API_S__ ||              (targetSdk >= __ANDROID_API_S__ && hasSamplingRatePermission)) {          return false; diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index cd3d80e809..760c8b9f3c 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -133,6 +133,7 @@ protected:          bool mTransformToDisplayInverse{false};          std::shared_ptr<renderengine::ExternalTexture> mBuffer; +        uint64_t mFrameNumber;          int mBufferSlot{BufferQueue::INVALID_BUFFER_SLOT};          bool mFrameLatencyNeeded{false}; diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index c64371b84a..6b6d43425d 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -125,11 +125,16 @@ bool BufferQueueLayer::isBufferDue(nsecs_t expectedPresentTime) const {  // -----------------------------------------------------------------------  bool BufferQueueLayer::fenceHasSignaled() const { +    Mutex::Autolock lock(mQueueItemLock); + +    if (SurfaceFlinger::enableLatchUnsignaled) { +        return true; +    } +      if (!hasFrameUpdate()) {          return true;      } -    Mutex::Autolock lock(mQueueItemLock);      if (mQueueItems[0].item.mIsDroppable) {          // Even though this buffer's fence may not have signaled yet, it could          // be replaced by another buffer before it has a chance to, which means diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 6b5cf04536..8bc51dfa5d 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -44,25 +44,18 @@ namespace android {  using PresentState = frametimeline::SurfaceFrame::PresentState;  namespace {  void callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener, -                               const sp<GraphicBuffer>& buffer, const sp<Fence>& releaseFence, -                               uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount) { +                               const sp<GraphicBuffer>& buffer, uint64_t framenumber, +                               const sp<Fence>& releaseFence, uint32_t transformHint, +                               uint32_t currentMaxAcquiredBufferCount) {      if (!listener) {          return;      } -    listener->onReleaseBuffer(buffer->getId(), releaseFence ? releaseFence : Fence::NO_FENCE, -                              transformHint, currentMaxAcquiredBufferCount); +    listener->onReleaseBuffer({buffer->getId(), framenumber}, +                              releaseFence ? releaseFence : Fence::NO_FENCE, transformHint, +                              currentMaxAcquiredBufferCount);  }  } // namespace -// clang-format off -const std::array<float, 16> BufferStateLayer::IDENTITY_MATRIX{ -        1, 0, 0, 0, -        0, 1, 0, 0, -        0, 0, 1, 0, -        0, 0, 0, 1 -}; -// clang-format on -  BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)        : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) {      mDrawingState.dataspace = ui::Dataspace::V0_SRGB; @@ -75,8 +68,8 @@ BufferStateLayer::~BufferStateLayer() {      // issue with the clone layer trying to use the texture.      if (mBufferInfo.mBuffer != nullptr && !isClone()) {          callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                  mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFence, -                                  mTransformHint, +                                  mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber, +                                  mBufferInfo.mFence, mTransformHint,                                    mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(                                            mOwnerUid));      } @@ -87,7 +80,7 @@ status_t BufferStateLayer::addReleaseFence(const sp<CallbackHandle>& ch,      if (ch == nullptr) {          return OK;      } -    ch->previousBufferId = mPreviousBufferId; +    ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;      if (!ch->previousReleaseFence.get()) {          ch->previousReleaseFence = fence;          return OK; @@ -214,7 +207,7 @@ void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {      // see BufferStateLayer::onLayerDisplayed.      for (auto& handle : mDrawingState.callbackHandles) {          if (handle->releasePreviousBuffer) { -            handle->previousBufferId = mPreviousBufferId; +            handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;              break;          }      } @@ -432,14 +425,15 @@ bool BufferStateLayer::setBuffer(const std::shared_ptr<renderengine::ExternalTex      if (mDrawingState.buffer) {          mReleasePreviousBuffer = true; -        if (mDrawingState.buffer != mBufferInfo.mBuffer) { +        if (mDrawingState.buffer != mBufferInfo.mBuffer || +            mDrawingState.frameNumber != mBufferInfo.mFrameNumber) {              // If mDrawingState has a buffer, and we are about to update again              // before swapping to drawing state, then the first buffer will be              // dropped and we should decrement the pending buffer count and              // call any release buffer callbacks if set.              callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                      mDrawingState.buffer->getBuffer(), mDrawingState.acquireFence, -                                      mTransformHint, +                                      mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber, +                                      mDrawingState.acquireFence, mTransformHint,                                        mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(                                                mOwnerUid));              decrementPendingBufferCount(); @@ -597,6 +591,7 @@ bool BufferStateLayer::setTransactionCompletedListeners(  }  bool BufferStateLayer::setTransparentRegionHint(const Region& transparent) { +    mDrawingState.sequence++;      mDrawingState.transparentRegionHint = transparent;      mDrawingState.modified = true;      setTransactionFlags(eTransactionNeeded); @@ -642,6 +637,10 @@ FloatRect BufferStateLayer::computeSourceBounds(const FloatRect& parentBounds) c  // Interface implementation for BufferLayer  // -----------------------------------------------------------------------  bool BufferStateLayer::fenceHasSignaled() const { +    if (SurfaceFlinger::enableLatchUnsignaled) { +        return true; +    } +      const bool fenceSignaled =              getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;      if (!fenceSignaled) { @@ -684,7 +683,7 @@ uint64_t BufferStateLayer::getFrameNumber(nsecs_t /*expectedPresentTime*/) const   *     DeferTransactionUntil -> frameNumber = 2   *     Random other stuff   *  } - * Now imagine getHeadFrameNumber returned mDrawingState.mFrameNumber (or mCurrentFrameNumber). + * Now imagine mFrameNumber returned mDrawingState.frameNumber (or mCurrentFrameNumber).   * Prior to doTransaction SurfaceFlinger will call notifyAvailableFrames, but because we   * haven't swapped mDrawingState to mDrawingState yet we will think the sync point   * is not ready. So we will return false from applyPendingState and not swap @@ -725,7 +724,7 @@ bool BufferStateLayer::latchSidebandStream(bool& recomputeVisibleRegions) {  bool BufferStateLayer::hasFrameUpdate() const {      const State& c(getDrawingState()); -    return mDrawingStateModified && (c.buffer != nullptr || c.bgColorLayer != nullptr); +    return (mDrawingStateModified || mDrawingState.modified) && (c.buffer != nullptr || c.bgColorLayer != nullptr);  }  status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nsecs_t latchTime, @@ -792,9 +791,10 @@ status_t BufferStateLayer::updateActiveBuffer() {          decrementPendingBufferCount();      } -    mPreviousBufferId = getCurrentBufferId(); +    mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};      mBufferInfo.mBuffer = s.buffer;      mBufferInfo.mFence = s.acquireFence; +    mBufferInfo.mFrameNumber = s.frameNumber;      return NO_ERROR;  } @@ -891,7 +891,11 @@ void BufferStateLayer::gatherBufferInfo() {      mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);      mBufferInfo.mFence = s.acquireFence;      mBufferInfo.mTransform = s.bufferTransform; +    auto lastDataspace = mBufferInfo.mDataspace;      mBufferInfo.mDataspace = translateDataspace(s.dataspace); +    if (lastDataspace != mBufferInfo.mDataspace) { +        mFlinger->mSomeDataspaceChanged = true; +    }      mBufferInfo.mCrop = computeBufferCrop(s);      mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;      mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion; @@ -960,22 +964,6 @@ void BufferStateLayer::tracePendingBufferCount(int32_t pendingBuffers) {      ATRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);  } -void BufferStateLayer::bufferMayChange(const sp<GraphicBuffer>& newBuffer) { -    if (mDrawingState.buffer != nullptr && -        (!mBufferInfo.mBuffer || -         mDrawingState.buffer->getBuffer() != mBufferInfo.mBuffer->getBuffer()) && -        newBuffer != mDrawingState.buffer->getBuffer()) { -        // If we are about to update mDrawingState.buffer but it has not yet latched -        // then we will drop a buffer and should decrement the pending buffer count and -        // call any release buffer callbacks if set. -        callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                  mDrawingState.buffer->getBuffer(), mDrawingState.acquireFence, -                                  mTransformHint, -                                  mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate( -                                          mOwnerUid)); -        decrementPendingBufferCount(); -    } -}  /*   * We don't want to send the layer's transform to input, but rather the diff --git a/services/surfaceflinger/BufferStateLayer.h b/services/surfaceflinger/BufferStateLayer.h index 27470182bf..cab48994b3 100644 --- a/services/surfaceflinger/BufferStateLayer.h +++ b/services/surfaceflinger/BufferStateLayer.h @@ -97,7 +97,6 @@ public:      // See mPendingBufferTransactions      void decrementPendingBufferCount(); -    void bufferMayChange(const sp<GraphicBuffer>& newBuffer) override;      std::atomic<int32_t>* getPendingBufferCounter() override { return &mPendingBufferTransactions; }      std::string getPendingBufferCounterName() override { return mBlastTransactionName; } @@ -143,15 +142,8 @@ private:      bool bufferNeedsFiltering() const override; -    static const std::array<float, 16> IDENTITY_MATRIX; - -    std::unique_ptr<renderengine::Image> mTextureImage; - -    mutable uint64_t mFrameNumber{0}; -    uint64_t mFrameCounter{0}; -      sp<Fence> mPreviousReleaseFence; -    uint64_t mPreviousBufferId = 0; +    ReleaseCallbackId mPreviousReleaseCallbackId = ReleaseCallbackId::INVALID_ID;      uint64_t mPreviousReleasedFrameNumber = 0;      bool mReleasePreviousBuffer = false; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h index 29937fb089..554e2f4868 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionRefreshArgs.h @@ -24,6 +24,7 @@  #include <compositionengine/LayerFE.h>  #include <compositionengine/OutputColorSetting.h>  #include <math/mat4.h> +#include <ui/FenceTime.h>  #include <ui/Transform.h>  namespace android::compositionengine { @@ -83,6 +84,10 @@ struct CompositionRefreshArgs {      // The earliest time to send the present command to the HAL      std::chrono::steady_clock::time_point earliestPresentTime; +    // The previous present fence. Used together with earliestPresentTime +    // to prevent an early presentation of a frame. +    std::shared_ptr<FenceTime> previousPresentFence; +      // The predicted next invalidation time      std::optional<std::chrono::steady_clock::time_point> nextInvalidateTime;  }; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h index d41c2dd527..f34cb94079 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputCompositionState.h @@ -19,6 +19,7 @@  #include <cstdint>  #include <math/mat4.h> +#include <ui/FenceTime.h>  // TODO(b/129481165): remove the #pragma below and fix conversion issues  #pragma clang diagnostic push @@ -118,6 +119,10 @@ struct OutputCompositionState {      // The earliest time to send the present command to the HAL      std::chrono::steady_clock::time_point earliestPresentTime; +    // The previous present fence. Used together with earliestPresentTime +    // to prevent an early presentation of a frame. +    std::shared_ptr<FenceTime> previousPresentFence; +      // Current display brightness      float displayBrightnessNits{-1.f}; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h index 7cb0f6b9f2..2e7a377feb 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h @@ -65,7 +65,9 @@ public:      size_t getLayerCount() const { return mLayers.size(); }      const Layer& getFirstLayer() const { return mLayers[0]; }      const Rect& getBounds() const { return mBounds; } -    Rect getTextureBounds() const { return mOutputSpace.content; } +    Rect getTextureBounds() const { +        return mTexture ? mTexture->get()->getBuffer()->getBounds() : Rect::INVALID_RECT; +    }      const Region& getVisibleRegion() const { return mVisibleRegion; }      size_t getAge() const { return mAge; }      std::shared_ptr<renderengine::ExternalTexture> getBuffer() const { @@ -141,7 +143,7 @@ public:      compositionengine::OutputLayer* getBlurLayer() const; -    bool hasHdrLayers() const; +    bool hasUnsupportedDataspace() const;      bool hasProtectedLayers() const; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h index a20d7b3ce7..bce438fa13 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h @@ -242,13 +242,6 @@ public:      ui::Dataspace getDataspace() const { return mOutputDataspace.get(); } -    bool isHdr() const { -        const ui::Dataspace transfer = -                static_cast<ui::Dataspace>(getDataspace() & ui::Dataspace::TRANSFER_MASK); -        return (transfer == ui::Dataspace::TRANSFER_ST2084 || -                transfer == ui::Dataspace::TRANSFER_HLG); -    } -      bool isProtected() const {          return getOutputLayer()->getLayerFE().getCompositionState()->hasProtectedContent;      } diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp index ae1336ec9d..2f2c686805 100644 --- a/services/surfaceflinger/CompositionEngine/src/Display.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp @@ -229,7 +229,8 @@ void Display::chooseCompositionStrategy() {      auto& hwc = getCompositionEngine().getHwComposer();      if (status_t result =                  hwc.getDeviceCompositionChanges(*halDisplayId, anyLayersRequireClientComposition(), -                                                getState().earliestPresentTime, &changes); +                                                getState().earliestPresentTime, +                                                getState().previousPresentFence, &changes);          result != NO_ERROR) {          ALOGE("chooseCompositionStrategy failed for %s: %d (%s)", getName().c_str(), result,                strerror(-result)); @@ -330,7 +331,8 @@ compositionengine::Output::FrameFences Display::presentAndGetFrameFences() {      }      auto& hwc = getCompositionEngine().getHwComposer(); -    hwc.presentAndGetReleaseFences(*halDisplayIdOpt, getState().earliestPresentTime); +    hwc.presentAndGetReleaseFences(*halDisplayIdOpt, getState().earliestPresentTime, +                                   getState().previousPresentFence);      fences.presentFence = hwc.getPresentFence(*halDisplayIdOpt); diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index 67bb1496e5..cafcb40e80 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -729,6 +729,7 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr      }      editState().earliestPresentTime = refreshArgs.earliestPresentTime; +    editState().previousPresentFence = refreshArgs.previousPresentFence;      compositionengine::OutputLayer* peekThroughLayer = nullptr;      sp<GraphicBuffer> previousOverride = nullptr; diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index e4e46a7cc9..56e9d27f14 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -216,8 +216,18 @@ Rect OutputLayer::calculateOutputDisplayFrame() const {      // reduce uses a FloatRect to provide more accuracy during the      // transformation. We then round upon constructing 'frame'. -    Rect frame{ -            layerTransform.transform(reduce(layerState.geomLayerBounds, activeTransparentRegion))}; +    FloatRect geomLayerBounds = layerState.geomLayerBounds; + +    // Some HWCs may clip client composited input to its displayFrame. Make sure +    // that this does not cut off the shadow. +    if (layerState.forceClientComposition && layerState.shadowRadius > 0.0f) { +        const auto outset = layerState.shadowRadius; +        geomLayerBounds.left -= outset; +        geomLayerBounds.top -= outset; +        geomLayerBounds.right += outset; +        geomLayerBounds.bottom += outset; +    } +    Rect frame{layerTransform.transform(reduce(geomLayerBounds, activeTransparentRegion))};      if (!frame.intersect(outputState.layerStackSpace.content, &frame)) {          frame.clear();      } diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp index acc7ed218e..c1cd5ab5fd 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp @@ -175,7 +175,7 @@ void CachedSet::render(renderengine::RenderEngine& renderEngine, TexturePool& te      LayerFE::ClientCompositionTargetSettings targetSettings{              .clip = Region(viewport),              .needsFiltering = false, -            .isSecure = true, +            .isSecure = outputState.isSecure,              .supportsProtectedContent = false,              .clearRegion = clearRegion,              .viewport = viewport, @@ -218,6 +218,7 @@ void CachedSet::render(renderengine::RenderEngine& renderEngine, TexturePool& te      }      renderengine::LayerSettings holePunchSettings; +    renderengine::LayerSettings holePunchBackgroundSettings;      if (mHolePunchLayer) {          auto clientCompositionList =                  mHolePunchLayer->getOutputLayer()->getLayerFE().prepareClientCompositionList( @@ -232,6 +233,15 @@ void CachedSet::render(renderengine::RenderEngine& renderEngine, TexturePool& te          holePunchSettings.alpha = 0.0f;          holePunchSettings.name = std::string("hole punch layer");          layerSettingsPointers.push_back(&holePunchSettings); + +        // Add a solid background as the first layer in case there is no opaque +        // buffer behind the punch hole +        holePunchBackgroundSettings.alpha = 1.0f; +        holePunchBackgroundSettings.name = std::string("holePunchBackground"); +        holePunchBackgroundSettings.geometry.boundaries = holePunchSettings.geometry.boundaries; +        holePunchBackgroundSettings.geometry.positionTransform = +                holePunchSettings.geometry.positionTransform; +        layerSettingsPointers.insert(layerSettingsPointers.begin(), &holePunchBackgroundSettings);      }      if (sDebugHighlighLayers) { @@ -295,9 +305,7 @@ bool CachedSet::requiresHolePunch() const {          return false;      } -    // Do not use a hole punch with an HDR layer; this should be done in client -    // composition to properly mix HDR with SDR. -    if (hasHdrLayers()) { +    if (hasUnsupportedDataspace()) {          return false;      } @@ -352,9 +360,22 @@ compositionengine::OutputLayer* CachedSet::getBlurLayer() const {      return mBlurLayer ? mBlurLayer->getOutputLayer() : nullptr;  } -bool CachedSet::hasHdrLayers() const { -    return std::any_of(mLayers.cbegin(), mLayers.cend(), -                       [](const Layer& layer) { return layer.getState()->isHdr(); }); +bool CachedSet::hasUnsupportedDataspace() const { +    return std::any_of(mLayers.cbegin(), mLayers.cend(), [](const Layer& layer) { +        auto dataspace = layer.getState()->getDataspace(); +        const auto transfer = static_cast<ui::Dataspace>(dataspace & ui::Dataspace::TRANSFER_MASK); +        if (transfer == ui::Dataspace::TRANSFER_ST2084 || transfer == ui::Dataspace::TRANSFER_HLG) { +            // Skip HDR. +            return true; +        } + +        if ((dataspace & HAL_DATASPACE_STANDARD_MASK) == HAL_DATASPACE_STANDARD_BT601_625) { +            // RenderEngine does not match some DPUs, so skip +            // to avoid flickering/color differences. +            return true; +        } +        return false; +    });  }  bool CachedSet::hasProtectedLayers() const { @@ -378,10 +399,14 @@ void CachedSet::dump(std::string& result) const {      if (mLayers.size() == 1) {          base::StringAppendF(&result, "    Layer [%s]\n", mLayers[0].getName().c_str());          base::StringAppendF(&result, "    Buffer %p", mLayers[0].getBuffer().get()); +        base::StringAppendF(&result, "    Protected [%s]", +                            mLayers[0].getState()->isProtected() ? "true" : "false");      } else {          result.append("    Cached set of:");          for (const Layer& layer : mLayers) {              base::StringAppendF(&result, "\n      Layer [%s]", layer.getName().c_str()); +            base::StringAppendF(&result, "\n      Protected [%s]", +                                layer.getState()->isProtected() ? "true" : "false");          }      } diff --git a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp index 2bcaf60f3f..f033279caa 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp @@ -420,7 +420,7 @@ std::vector<Flattener::Run> Flattener::findCandidateRuns(time_point now) const {          const bool layerIsInactive = now - currentSet->getLastUpdate() > mActiveLayerTimeout;          const bool layerHasBlur = currentSet->hasBlurBehind();          if (layerIsInactive && (firstLayer || runHasFirstLayer || !layerHasBlur) && -            !currentSet->hasHdrLayers() && !currentSet->hasProtectedLayers()) { +            !currentSet->hasUnsupportedDataspace()) {              if (isPartOfRun) {                  builder.append(currentSet->getLayerCount());              } else { @@ -491,6 +491,14 @@ void Flattener::buildCachedSets(time_point now) {          return;      } +    for (const CachedSet& layer : mLayers) { +        // TODO (b/191997217): make it less aggressive, and sync with findCandidateRuns +        if (layer.hasProtectedLayers()) { +            ATRACE_NAME("layer->hasProtectedLayers()"); +            return; +        } +    } +      std::vector<Run> runs = findCandidateRuns(now);      std::optional<Run> bestRun = findBestRun(runs); diff --git a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp index db9437b9a8..c037cc6173 100644 --- a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp @@ -579,7 +579,7 @@ TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutIfGpuDisplay) {  TEST_F(DisplayChooseCompositionStrategyTest, takesEarlyOutOnHwcError) {      EXPECT_CALL(*mDisplay, anyLayersRequireClientComposition()).WillOnce(Return(false));      EXPECT_CALL(mHwComposer, -                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _, _)) +                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), false, _, _, _))              .WillOnce(Return(INVALID_OPERATION));      mDisplay->chooseCompositionStrategy(); @@ -602,7 +602,7 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperation) {              .WillOnce(Return(false));      EXPECT_CALL(mHwComposer, -                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _)) +                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _))              .WillOnce(Return(NO_ERROR));      EXPECT_CALL(*mDisplay, allLayersRequireClientComposition()).WillOnce(Return(false)); @@ -633,8 +633,8 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithChanges) {              .WillOnce(Return(false));      EXPECT_CALL(mHwComposer, -                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _)) -            .WillOnce(DoAll(SetArgPointee<3>(changes), Return(NO_ERROR))); +                getDeviceCompositionChanges(HalDisplayId(DEFAULT_DISPLAY_ID), true, _, _, _)) +            .WillOnce(DoAll(SetArgPointee<4>(changes), Return(NO_ERROR)));      EXPECT_CALL(*mDisplay, applyChangedTypesToLayers(changes.changedTypes)).Times(1);      EXPECT_CALL(*mDisplay, applyDisplayRequests(changes.displayRequests)).Times(1);      EXPECT_CALL(*mDisplay, applyLayerRequestsToLayers(changes.layerRequests)).Times(1); @@ -844,7 +844,7 @@ TEST_F(DisplayPresentAndGetFrameFencesTest, returnsPresentAndLayerFences) {      sp<Fence> layer1Fence = new Fence();      sp<Fence> layer2Fence = new Fence(); -    EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID), _)) +    EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(HalDisplayId(DEFAULT_DISPLAY_ID), _, _))              .Times(1);      EXPECT_CALL(mHwComposer, getPresentFence(HalDisplayId(DEFAULT_DISPLAY_ID)))              .WillOnce(Return(presentFence)); @@ -1020,7 +1020,7 @@ TEST_F(DisplayFunctionalTest, postFramebufferCriticalCallsAreOrdered) {      mDisplay->editState().isEnabled = true; -    EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_, _)); +    EXPECT_CALL(mHwComposer, presentAndGetReleaseFences(_, _, _));      EXPECT_CALL(*mDisplaySurface, onFrameCommitted());      mDisplay->postFramebuffer(); diff --git a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h index 64cbea91a3..a195e5808a 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h @@ -52,14 +52,16 @@ public:                        std::optional<PhysicalDisplayId>));      MOCK_METHOD2(allocatePhysicalDisplay, void(hal::HWDisplayId, PhysicalDisplayId));      MOCK_METHOD1(createLayer, std::shared_ptr<HWC2::Layer>(HalDisplayId)); -    MOCK_METHOD4(getDeviceCompositionChanges, +    MOCK_METHOD5(getDeviceCompositionChanges,                   status_t(HalDisplayId, bool, std::chrono::steady_clock::time_point, +                          const std::shared_ptr<FenceTime>&,                            std::optional<android::HWComposer::DeviceRequestedChanges>*));      MOCK_METHOD5(setClientTarget,                   status_t(HalDisplayId, uint32_t, const sp<Fence>&, const sp<GraphicBuffer>&,                            ui::Dataspace)); -    MOCK_METHOD2(presentAndGetReleaseFences, -                 status_t(HalDisplayId, std::chrono::steady_clock::time_point)); +    MOCK_METHOD3(presentAndGetReleaseFences, +                 status_t(HalDisplayId, std::chrono::steady_clock::time_point, +                          const std::shared_ptr<FenceTime>&));      MOCK_METHOD2(setPowerMode, status_t(PhysicalDisplayId, hal::PowerMode));      MOCK_METHOD2(setActiveConfig, status_t(HalDisplayId, size_t));      MOCK_METHOD2(setColorTransform, status_t(HalDisplayId, const mat4&)); diff --git a/services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h b/services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h index b738096479..fc8cb507c4 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockPowerAdvisor.h @@ -29,8 +29,10 @@ public:      PowerAdvisor();      ~PowerAdvisor() override; +    MOCK_METHOD0(init, void());      MOCK_METHOD0(onBootFinished, void());      MOCK_METHOD2(setExpensiveRenderingExpected, void(DisplayId displayId, bool expected)); +    MOCK_METHOD0(isUsingExpensiveRendering, bool());      MOCK_METHOD0(notifyDisplayUpdateImminent, void());  }; diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp index e9ecf3ecc5..c8c6012ef9 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp @@ -324,6 +324,27 @@ TEST_F(OutputLayerDisplayFrameTest, outputTransformAffectsDisplayFrame) {      EXPECT_THAT(calculateOutputDisplayFrame(), expected);  } +TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame) { +    const int kShadowRadius = 5; +    mLayerFEState.shadowRadius = kShadowRadius; +    mLayerFEState.forceClientComposition = true; + +    mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f}; +    Rect expected{mLayerFEState.geomLayerBounds}; +    expected.inset(-kShadowRadius, -kShadowRadius, -kShadowRadius, -kShadowRadius); +    EXPECT_THAT(calculateOutputDisplayFrame(), expected); +} + +TEST_F(OutputLayerDisplayFrameTest, shadowExpandsDisplayFrame_onlyIfForcingClientComposition) { +    const int kShadowRadius = 5; +    mLayerFEState.shadowRadius = kShadowRadius; +    mLayerFEState.forceClientComposition = false; + +    mLayerFEState.geomLayerBounds = FloatRect{100.f, 100.f, 200.f, 200.f}; +    Rect expected{mLayerFEState.geomLayerBounds}; +    EXPECT_THAT(calculateOutputDisplayFrame(), expected); +} +  /*   * OutputLayer::calculateOutputRelativeBufferTransform()   */ diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index 742b155c9f..ee73cfc0c1 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -3487,7 +3487,7 @@ TEST_F(OutputComposeSurfacesTest_HandlesProtectedContent, ifDisplayIsNotSecure)      mLayer2.mLayerFEState.hasProtectedContent = true;      EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(true));      EXPECT_CALL(mRenderEngine, isProtected).WillOnce(Return(true)); -    EXPECT_CALL(mRenderEngine, useProtectedContext(false)).WillOnce(Return(true)); +    EXPECT_CALL(mRenderEngine, useProtectedContext(false));      mOutput.composeSurfaces(kDebugRegion, kDefaultRefreshArgs);  } diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp index 0acc31765a..ec81322afa 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp @@ -51,6 +51,15 @@ MATCHER_P(ClientCompositionTargetSettingsBlurSettingsEq, expectedBlurSetting, ""      return expectedBlurSetting == arg.blurSetting;  } + +MATCHER_P(ClientCompositionTargetSettingsSecureEq, expectedSecureSetting, "") { +    *result_listener << "ClientCompositionTargetSettings' SecureSettings aren't equal \n"; +    *result_listener << "expected " << expectedSecureSetting << "\n"; +    *result_listener << "actual " << arg.isSecure << "\n"; + +    return expectedSecureSetting == arg.isSecure; +} +  static const ui::Size kOutputSize = ui::Size(1, 1);  class CachedSetTest : public testing::Test { @@ -315,7 +324,7 @@ TEST_F(CachedSetTest, updateAge_BufferUpdate) {      EXPECT_EQ(0u, cachedSet.getAge());  } -TEST_F(CachedSetTest, render) { +TEST_F(CachedSetTest, renderUnsecureOutput) {      // Skip the 0th layer to ensure that the bounding box of the layers is offset from (0, 0)      CachedSet::Layer& layer1 = *mTestLayers[1]->cachedSetLayer.get();      sp<mock::LayerFE> layerFE1 = mTestLayers[1]->layerFE; @@ -348,14 +357,71 @@ TEST_F(CachedSetTest, render) {          return NO_ERROR;      }; -    EXPECT_CALL(*layerFE1, prepareClientCompositionList(_)).WillOnce(Return(clientCompList1)); -    EXPECT_CALL(*layerFE2, prepareClientCompositionList(_)).WillOnce(Return(clientCompList2)); +    EXPECT_CALL(*layerFE1, +                prepareClientCompositionList(ClientCompositionTargetSettingsSecureEq(false))) +            .WillOnce(Return(clientCompList1)); +    EXPECT_CALL(*layerFE2, +                prepareClientCompositionList(ClientCompositionTargetSettingsSecureEq(false))) +            .WillOnce(Return(clientCompList2));      EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Invoke(drawLayers)); +    mOutputState.isSecure = false;      cachedSet.render(mRenderEngine, mTexturePool, mOutputState);      expectReadyBuffer(cachedSet);      EXPECT_EQ(mOutputState.framebufferSpace, cachedSet.getOutputSpace()); -    EXPECT_EQ(mOutputState.framebufferSpace.content, cachedSet.getTextureBounds()); +    EXPECT_EQ(Rect(kOutputSize.width, kOutputSize.height), cachedSet.getTextureBounds()); + +    // Now check that appending a new cached set properly cleans up RenderEngine resources. +    CachedSet::Layer& layer3 = *mTestLayers[2]->cachedSetLayer.get(); +    cachedSet.append(CachedSet(layer3)); +} + +TEST_F(CachedSetTest, renderSecureOutput) { +    // Skip the 0th layer to ensure that the bounding box of the layers is offset from (0, 0) +    CachedSet::Layer& layer1 = *mTestLayers[1]->cachedSetLayer.get(); +    sp<mock::LayerFE> layerFE1 = mTestLayers[1]->layerFE; +    CachedSet::Layer& layer2 = *mTestLayers[2]->cachedSetLayer.get(); +    sp<mock::LayerFE> layerFE2 = mTestLayers[2]->layerFE; + +    CachedSet cachedSet(layer1); +    cachedSet.append(CachedSet(layer2)); + +    std::vector<compositionengine::LayerFE::LayerSettings> clientCompList1; +    clientCompList1.push_back({}); +    clientCompList1[0].alpha = 0.5f; + +    std::vector<compositionengine::LayerFE::LayerSettings> clientCompList2; +    clientCompList2.push_back({}); +    clientCompList2[0].alpha = 0.75f; + +    const auto drawLayers = [&](const renderengine::DisplaySettings& displaySettings, +                                const std::vector<const renderengine::LayerSettings*>& layers, +                                const std::shared_ptr<renderengine::ExternalTexture>&, const bool, +                                base::unique_fd&&, base::unique_fd*) -> size_t { +        EXPECT_EQ(mOutputState.framebufferSpace.content, displaySettings.physicalDisplay); +        EXPECT_EQ(mOutputState.layerStackSpace.content, displaySettings.clip); +        EXPECT_EQ(ui::Transform::toRotationFlags(mOutputState.framebufferSpace.orientation), +                  displaySettings.orientation); +        EXPECT_EQ(0.5f, layers[0]->alpha); +        EXPECT_EQ(0.75f, layers[1]->alpha); +        EXPECT_EQ(ui::Dataspace::SRGB, displaySettings.outputDataspace); + +        return NO_ERROR; +    }; + +    EXPECT_CALL(*layerFE1, +                prepareClientCompositionList(ClientCompositionTargetSettingsSecureEq(true))) +            .WillOnce(Return(clientCompList1)); +    EXPECT_CALL(*layerFE2, +                prepareClientCompositionList(ClientCompositionTargetSettingsSecureEq(true))) +            .WillOnce(Return(clientCompList2)); +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Invoke(drawLayers)); +    mOutputState.isSecure = true; +    cachedSet.render(mRenderEngine, mTexturePool, mOutputState); +    expectReadyBuffer(cachedSet); + +    EXPECT_EQ(mOutputState.framebufferSpace, cachedSet.getOutputSpace()); +    EXPECT_EQ(Rect(kOutputSize.width, kOutputSize.height), cachedSet.getTextureBounds());      // Now check that appending a new cached set properly cleans up RenderEngine resources.      CachedSet::Layer& layer3 = *mTestLayers[2]->cachedSetLayer.get(); @@ -457,6 +523,20 @@ TEST_F(CachedSetTest, holePunch_requiresNonHdr) {      EXPECT_FALSE(cachedSet.requiresHolePunch());  } +TEST_F(CachedSetTest, holePunch_requiresNonBT601_625) { +    mTestLayers[0]->outputLayerCompositionState.dataspace = ui::Dataspace::STANDARD_BT601_625; +    mTestLayers[0]->layerState->update(&mTestLayers[0]->outputLayer); + +    CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get(); +    mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make(); +    sp<mock::LayerFE> layerFE = mTestLayers[0]->layerFE; + +    CachedSet cachedSet(layer); +    EXPECT_CALL(*layerFE, hasRoundedCorners()).WillRepeatedly(Return(true)); + +    EXPECT_FALSE(cachedSet.requiresHolePunch()); +} +  TEST_F(CachedSetTest, requiresHolePunch) {      CachedSet::Layer& layer = *mTestLayers[0]->cachedSetLayer.get();      mTestLayers[0]->layerFECompositionState.buffer = sp<GraphicBuffer>::make(); @@ -576,12 +656,22 @@ TEST_F(CachedSetTest, addHolePunch) {                                  base::unique_fd&&, base::unique_fd*) -> size_t {          // If the highlight layer is enabled, it will increase the size by 1.          // We're interested in the third layer either way. -        EXPECT_GE(layers.size(), 3u); -        const auto* holePunchSettings = layers[2]; -        EXPECT_EQ(nullptr, holePunchSettings->source.buffer.buffer); -        EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchSettings->source.solidColor); -        EXPECT_TRUE(holePunchSettings->disableBlending); -        EXPECT_EQ(0.0f, holePunchSettings->alpha); +        EXPECT_GE(layers.size(), 4u); +        { +            const auto* holePunchSettings = layers[3]; +            EXPECT_EQ(nullptr, holePunchSettings->source.buffer.buffer); +            EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchSettings->source.solidColor); +            EXPECT_TRUE(holePunchSettings->disableBlending); +            EXPECT_EQ(0.0f, holePunchSettings->alpha); +        } + +        { +            const auto* holePunchBackgroundSettings = layers[0]; +            EXPECT_EQ(nullptr, holePunchBackgroundSettings->source.buffer.buffer); +            EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchBackgroundSettings->source.solidColor); +            EXPECT_FALSE(holePunchBackgroundSettings->disableBlending); +            EXPECT_EQ(1.0f, holePunchBackgroundSettings->alpha); +        }          return NO_ERROR;      }; @@ -626,12 +716,23 @@ TEST_F(CachedSetTest, addHolePunch_noBuffer) {                                  base::unique_fd&&, base::unique_fd*) -> size_t {          // If the highlight layer is enabled, it will increase the size by 1.          // We're interested in the third layer either way. -        EXPECT_GE(layers.size(), 3u); -        const auto* holePunchSettings = layers[2]; -        EXPECT_EQ(nullptr, holePunchSettings->source.buffer.buffer); -        EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchSettings->source.solidColor); -        EXPECT_TRUE(holePunchSettings->disableBlending); -        EXPECT_EQ(0.0f, holePunchSettings->alpha); +        EXPECT_GE(layers.size(), 4u); + +        { +            const auto* holePunchSettings = layers[3]; +            EXPECT_EQ(nullptr, holePunchSettings->source.buffer.buffer); +            EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchSettings->source.solidColor); +            EXPECT_TRUE(holePunchSettings->disableBlending); +            EXPECT_EQ(0.0f, holePunchSettings->alpha); +        } + +        { +            const auto* holePunchBackgroundSettings = layers[0]; +            EXPECT_EQ(nullptr, holePunchBackgroundSettings->source.buffer.buffer); +            EXPECT_EQ(half3(0.0f, 0.0f, 0.0f), holePunchBackgroundSettings->source.solidColor); +            EXPECT_FALSE(holePunchBackgroundSettings->disableBlending); +            EXPECT_EQ(1.0f, holePunchBackgroundSettings->alpha); +        }          return NO_ERROR;      }; diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp index 334b855c22..f5cfd2f115 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp @@ -937,5 +937,152 @@ TEST_F(FlattenerRenderSchedulingTest, flattenLayers_renderCachedSets_defersUpToM                                           (kCachedSetRenderDuration + 10ms));  } +TEST_F(FlattenerTest, flattenLayers_skipsBT601_625) { +    auto& layerState1 = mTestLayers[0]->layerState; +    const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer; + +    auto& layerState2 = mTestLayers[1]->layerState; +    const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer; + +    // The third layer uses a dataspace that will not be flattened due to +    // possible mismatch with DPU rendering. +    auto& layerState3 = mTestLayers[2]->layerState; +    const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer; +    mTestLayers[2]->outputLayerCompositionState.dataspace = ui::Dataspace::STANDARD_BT601_625; +    mTestLayers[2]->layerState->update(&mTestLayers[2]->outputLayer); + +    const std::vector<const LayerState*> layers = { +            layerState1.get(), +            layerState2.get(), +            layerState3.get(), +    }; + +    initializeFlattener(layers); + +    mTime += 200ms; +    initializeOverrideBuffer(layers); +    EXPECT_EQ(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); + +    // This will render a CachedSet. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    // We've rendered a CachedSet, but we haven't merged it in. +    EXPECT_EQ(nullptr, overrideBuffer1); +    EXPECT_EQ(nullptr, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); + +    // This time we merge the CachedSet in, so we have a new hash, and we should +    // only have two sets. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0); +    initializeOverrideBuffer(layers); +    EXPECT_NE(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    EXPECT_NE(nullptr, overrideBuffer1); +    EXPECT_EQ(overrideBuffer1, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); +} + +TEST_F(FlattenerTest, flattenLayers_skipsHDR) { +    auto& layerState1 = mTestLayers[0]->layerState; +    const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer; + +    auto& layerState2 = mTestLayers[1]->layerState; +    const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer; + +    // The third layer uses a dataspace that will not be flattened due to +    // possible mismatch with DPU rendering. +    auto& layerState3 = mTestLayers[2]->layerState; +    const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer; +    mTestLayers[2]->outputLayerCompositionState.dataspace = ui::Dataspace::BT2020_ITU_HLG; +    mTestLayers[2]->layerState->update(&mTestLayers[2]->outputLayer); + +    const std::vector<const LayerState*> layers = { +            layerState1.get(), +            layerState2.get(), +            layerState3.get(), +    }; + +    initializeFlattener(layers); + +    mTime += 200ms; +    initializeOverrideBuffer(layers); +    EXPECT_EQ(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); + +    // This will render a CachedSet. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    // We've rendered a CachedSet, but we haven't merged it in. +    EXPECT_EQ(nullptr, overrideBuffer1); +    EXPECT_EQ(nullptr, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); + +    // This time we merge the CachedSet in, so we have a new hash, and we should +    // only have two sets. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0); +    initializeOverrideBuffer(layers); +    EXPECT_NE(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    EXPECT_NE(nullptr, overrideBuffer1); +    EXPECT_EQ(overrideBuffer1, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); +} + +TEST_F(FlattenerTest, flattenLayers_skipsHDR2) { +    auto& layerState1 = mTestLayers[0]->layerState; +    const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer; + +    auto& layerState2 = mTestLayers[1]->layerState; +    const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer; + +    // The third layer uses a dataspace that will not be flattened due to +    // possible mismatch with DPU rendering. +    auto& layerState3 = mTestLayers[2]->layerState; +    const auto& overrideBuffer3 = layerState3->getOutputLayer()->getState().overrideInfo.buffer; +    mTestLayers[2]->outputLayerCompositionState.dataspace = ui::Dataspace::BT2020_PQ; +    mTestLayers[2]->layerState->update(&mTestLayers[2]->outputLayer); + +    const std::vector<const LayerState*> layers = { +            layerState1.get(), +            layerState2.get(), +            layerState3.get(), +    }; + +    initializeFlattener(layers); + +    mTime += 200ms; +    initializeOverrideBuffer(layers); +    EXPECT_EQ(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); + +    // This will render a CachedSet. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    // We've rendered a CachedSet, but we haven't merged it in. +    EXPECT_EQ(nullptr, overrideBuffer1); +    EXPECT_EQ(nullptr, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); + +    // This time we merge the CachedSet in, so we have a new hash, and we should +    // only have two sets. +    EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0); +    initializeOverrideBuffer(layers); +    EXPECT_NE(getNonBufferHash(layers), +              mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); +    mFlattener->renderCachedSets(mOutputState, std::nullopt); + +    EXPECT_NE(nullptr, overrideBuffer1); +    EXPECT_EQ(overrideBuffer1, overrideBuffer2); +    EXPECT_EQ(nullptr, overrideBuffer3); +} +  } // namespace  } // namespace android::compositionengine diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 32f04e56bc..7e45dabdea 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -471,6 +471,7 @@ status_t HWComposer::setClientTarget(HalDisplayId displayId, uint32_t slot,  status_t HWComposer::getDeviceCompositionChanges(          HalDisplayId displayId, bool frameUsesClientComposition,          std::chrono::steady_clock::time_point earliestPresentTime, +        const std::shared_ptr<FenceTime>& previousPresentFence,          std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) {      ATRACE_CALL(); @@ -487,12 +488,16 @@ status_t HWComposer::getDeviceCompositionChanges(      hal::Error error = hal::Error::NONE; -    // First try to skip validate altogether when we passed the earliest time -    // to present and there is no client. Otherwise, we may present a frame too -    // early or in case of client composition we first need to render the +    // First try to skip validate altogether. We can do that when +    // 1. The previous frame has not been presented yet or already passed the +    // earliest time to present. Otherwise, we may present a frame too early. +    // 2. There is no client composition. Otherwise, we first need to render the      // client target buffer. -    const bool canSkipValidate = -            std::chrono::steady_clock::now() >= earliestPresentTime && !frameUsesClientComposition; +    const bool prevFencePending = +            previousPresentFence->getSignalTime() == Fence::SIGNAL_TIME_PENDING; +    const bool canPresentEarly = +            !prevFencePending && std::chrono::steady_clock::now() < earliestPresentTime; +    const bool canSkipValidate = !canPresentEarly && !frameUsesClientComposition;      displayData.validateWasSkipped = false;      if (canSkipValidate) {          sp<Fence> outPresentFence; @@ -559,7 +564,8 @@ sp<Fence> HWComposer::getLayerReleaseFence(HalDisplayId displayId, HWC2::Layer*  }  status_t HWComposer::presentAndGetReleaseFences( -        HalDisplayId displayId, std::chrono::steady_clock::time_point earliestPresentTime) { +        HalDisplayId displayId, std::chrono::steady_clock::time_point earliestPresentTime, +        const std::shared_ptr<FenceTime>& previousPresentFence) {      ATRACE_CALL();      RETURN_IF_INVALID_DISPLAY(displayId, BAD_INDEX); @@ -575,7 +581,9 @@ status_t HWComposer::presentAndGetReleaseFences(          return NO_ERROR;      } -    { +    const bool previousFramePending = +            previousPresentFence->getSignalTime() == Fence::SIGNAL_TIME_PENDING; +    if (!previousFramePending) {          ATRACE_NAME("wait for earliest present time");          std::this_thread::sleep_until(earliestPresentTime);      } diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index cd6f9f516f..b1849e8c11 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -27,7 +27,7 @@  #include <vector>  #include <android-base/thread_annotations.h> -#include <ui/Fence.h> +#include <ui/FenceTime.h>  // TODO(b/129481165): remove the #pragma below and fix conversion issues  #pragma clang diagnostic push @@ -134,6 +134,7 @@ public:      virtual status_t getDeviceCompositionChanges(              HalDisplayId, bool frameUsesClientComposition,              std::chrono::steady_clock::time_point earliestPresentTime, +            const std::shared_ptr<FenceTime>& previousPresentFence,              std::optional<DeviceRequestedChanges>* outChanges) = 0;      virtual status_t setClientTarget(HalDisplayId, uint32_t slot, const sp<Fence>& acquireFence, @@ -141,7 +142,8 @@ public:      // Present layers to the display and read releaseFences.      virtual status_t presentAndGetReleaseFences( -            HalDisplayId, std::chrono::steady_clock::time_point earliestPresentTime) = 0; +            HalDisplayId, std::chrono::steady_clock::time_point earliestPresentTime, +            const std::shared_ptr<FenceTime>& previousPresentFence) = 0;      // set power mode      virtual status_t setPowerMode(PhysicalDisplayId, hal::PowerMode) = 0; @@ -275,6 +277,7 @@ public:      status_t getDeviceCompositionChanges(              HalDisplayId, bool frameUsesClientComposition,              std::chrono::steady_clock::time_point earliestPresentTime, +            const std::shared_ptr<FenceTime>& previousPresentFence,              std::optional<DeviceRequestedChanges>* outChanges) override;      status_t setClientTarget(HalDisplayId, uint32_t slot, const sp<Fence>& acquireFence, @@ -282,7 +285,8 @@ public:      // Present layers to the display and read releaseFences.      status_t presentAndGetReleaseFences( -            HalDisplayId, std::chrono::steady_clock::time_point earliestPresentTime) override; +            HalDisplayId, std::chrono::steady_clock::time_point earliestPresentTime, +            const std::shared_ptr<FenceTime>& previousPresentFence) override;      // set power mode      status_t setPowerMode(PhysicalDisplayId, hal::PowerMode mode) override; diff --git a/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp b/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp index 901e19a6a2..1765caf847 100644 --- a/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp +++ b/services/surfaceflinger/DisplayHardware/PowerAdvisor.cpp @@ -32,6 +32,7 @@  #include "../SurfaceFlingerProperties.h"  #include "PowerAdvisor.h" +#include "SurfaceFlinger.h"  namespace android {  namespace Hwc2 { @@ -61,14 +62,22 @@ int32_t getUpdateTimeout() {  } // namespace -PowerAdvisor::PowerAdvisor() -      : mUseUpdateImminentTimer(getUpdateTimeout() > 0), -        mUpdateImminentTimer( +PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger) +      : mFlinger(flinger), +        mUseScreenUpdateTimer(getUpdateTimeout() > 0), +        mScreenUpdateTimer(                  "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()),                  /* resetCallback */ [this] { mSendUpdateImminent.store(false); }, -                /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); }) { -    if (mUseUpdateImminentTimer) { -        mUpdateImminentTimer.start(); +                /* timeoutCallback */ +                [this] { +                    mSendUpdateImminent.store(true); +                    mFlinger.disableExpensiveRendering(); +                }) {} + +void PowerAdvisor::init() { +    // Defer starting the screen update timer until SurfaceFlinger finishes construction. +    if (mUseScreenUpdateTimer) { +        mScreenUpdateTimer.start();      }  } @@ -122,8 +131,8 @@ void PowerAdvisor::notifyDisplayUpdateImminent() {          }      } -    if (mUseUpdateImminentTimer) { -        mUpdateImminentTimer.reset(); +    if (mUseScreenUpdateTimer) { +        mScreenUpdateTimer.reset();      }  } diff --git a/services/surfaceflinger/DisplayHardware/PowerAdvisor.h b/services/surfaceflinger/DisplayHardware/PowerAdvisor.h index 95eb0e2bb7..f2d076691a 100644 --- a/services/surfaceflinger/DisplayHardware/PowerAdvisor.h +++ b/services/surfaceflinger/DisplayHardware/PowerAdvisor.h @@ -25,14 +25,20 @@  #include "DisplayIdentification.h"  namespace android { + +class SurfaceFlinger; +  namespace Hwc2 {  class PowerAdvisor {  public:      virtual ~PowerAdvisor(); +    // Initializes resources that cannot be initialized on construction +    virtual void init() = 0;      virtual void onBootFinished() = 0;      virtual void setExpensiveRenderingExpected(DisplayId displayId, bool expected) = 0; +    virtual bool isUsingExpensiveRendering() = 0;      virtual void notifyDisplayUpdateImminent() = 0;  }; @@ -50,11 +56,13 @@ public:          virtual bool notifyDisplayUpdateImminent() = 0;      }; -    PowerAdvisor(); +    PowerAdvisor(SurfaceFlinger& flinger);      ~PowerAdvisor() override; +    void init() override;      void onBootFinished() override;      void setExpensiveRenderingExpected(DisplayId displayId, bool expected) override; +    bool isUsingExpensiveRendering() override { return mNotifiedExpensiveRendering; }      void notifyDisplayUpdateImminent() override;  private: @@ -67,9 +75,10 @@ private:      std::unordered_set<DisplayId> mExpensiveDisplays;      bool mNotifiedExpensiveRendering = false; -    const bool mUseUpdateImminentTimer; +    SurfaceFlinger& mFlinger; +    const bool mUseScreenUpdateTimer;      std::atomic_bool mSendUpdateImminent = true; -    scheduler::OneShotTimer mUpdateImminentTimer; +    scheduler::OneShotTimer mScreenUpdateTimer;  };  } // namespace impl diff --git a/services/surfaceflinger/FrameTimeline/FrameTimeline.h b/services/surfaceflinger/FrameTimeline/FrameTimeline.h index 15ecf130e7..139f91f3bc 100644 --- a/services/surfaceflinger/FrameTimeline/FrameTimeline.h +++ b/services/surfaceflinger/FrameTimeline/FrameTimeline.h @@ -96,7 +96,7 @@ struct JankClassificationThresholds {      // The various thresholds for App and SF. If the actual timestamp falls within the threshold      // compared to prediction, we treat it as on time.      nsecs_t presentThreshold = std::chrono::duration_cast<std::chrono::nanoseconds>(2ms).count(); -    nsecs_t deadlineThreshold = std::chrono::duration_cast<std::chrono::nanoseconds>(2ms).count(); +    nsecs_t deadlineThreshold = std::chrono::duration_cast<std::chrono::nanoseconds>(0ms).count();      nsecs_t startThreshold = std::chrono::duration_cast<std::chrono::nanoseconds>(2ms).count();  }; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index ad31b3fcad..e4a777f3c7 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -177,6 +177,9 @@ Layer::~Layer() {      if (mDrawingState.sidebandStream != nullptr) {          mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();      } +    if (mHadClonedChild) { +        mFlinger->mNumClones--; +    }  }  LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, sp<Client> client, std::string name, @@ -254,6 +257,7 @@ void Layer::addToCurrentState() {      if (mRemovedFromDrawingState) {          mRemovedFromDrawingState = false;          mFlinger->mScheduler->registerLayer(this); +        mFlinger->removeFromOffscreenLayers(this);      }      for (const auto& child : mCurrentChildren) { @@ -576,8 +580,8 @@ std::optional<compositionengine::LayerFE::LayerSettings> Layer::prepareClientCom      layerSettings.geometry.positionTransform = getTransform().asMatrix4();      // skip drawing content if the targetSettings indicate the content will be occluded -    layerSettings.skipContentDraw = -            layerSettings.skipContentDraw || !targetSettings.realContentIsVisible; +    const bool drawContent = targetSettings.realContentIsVisible || targetSettings.clearContent; +    layerSettings.skipContentDraw = !drawContent;      if (hasColorTransform()) {          layerSettings.colorTransform = getColorTransform(); @@ -847,6 +851,23 @@ bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relati      return true;  } +bool Layer::setTrustedOverlay(bool isTrustedOverlay) { +    if (mDrawingState.isTrustedOverlay == isTrustedOverlay) return false; +    mDrawingState.isTrustedOverlay = isTrustedOverlay; +    mDrawingState.modified = true; +    mFlinger->mInputInfoChanged = true; +    setTransactionFlags(eTransactionNeeded); +    return true; +} + +bool Layer::isTrustedOverlay() const { +    if (getDrawingState().isTrustedOverlay) { +        return true; +    } +    const auto& p = mDrawingParent.promote(); +    return (p != nullptr) && p->isTrustedOverlay(); +} +  bool Layer::setSize(uint32_t w, uint32_t h) {      if (mDrawingState.requested_legacy.w == w && mDrawingState.requested_legacy.h == h)          return false; @@ -954,7 +975,6 @@ bool Layer::setTransparentRegionHint(const Region& transparent) {  }  bool Layer::setBlurRegions(const std::vector<BlurRegion>& blurRegions) { -    mDrawingState.sequence++;      mDrawingState.blurRegions = blurRegions;      mDrawingState.modified = true;      setTransactionFlags(eTransactionNeeded); @@ -1097,46 +1117,59 @@ StretchEffect Layer::getStretchEffect() const {      return StretchEffect{};  } -void Layer::updateTreeHasFrameRateVote() { -    const auto traverseTree = [&](const LayerVector::Visitor& visitor) { -        auto parent = getParent(); -        while (parent) { -            visitor(parent.get()); -            parent = parent->getParent(); +bool Layer::propagateFrameRateForLayerTree(FrameRate parentFrameRate, bool* transactionNeeded) { +    // The frame rate for layer tree is this layer's frame rate if present, or the parent frame rate +    const auto frameRate = [&] { +        if (mDrawingState.frameRate.rate.isValid() || +            mDrawingState.frameRate.type == FrameRateCompatibility::NoVote) { +            return mDrawingState.frameRate;          } -        traverse(LayerVector::StateSet::Current, visitor); -    }; - -    // update parents and children about the vote -    // First traverse the tree and count how many layers has votes. -    int layersWithVote = 0; -    traverseTree([&layersWithVote](Layer* layer) { -        const auto layerVotedWithDefaultCompatibility = -                layer->mDrawingState.frameRate.rate.isValid() && -                layer->mDrawingState.frameRate.type == FrameRateCompatibility::Default; -        const auto layerVotedWithNoVote = -                layer->mDrawingState.frameRate.type == FrameRateCompatibility::NoVote; -        const auto layerVotedWithExactCompatibility = -                layer->mDrawingState.frameRate.type == FrameRateCompatibility::Exact; - -        // We do not count layers that are ExactOrMultiple for the same reason -        // we are allowing touch boost for those layers. See -        // RefreshRateConfigs::getBestRefreshRate for more details. -        if (layerVotedWithDefaultCompatibility || layerVotedWithNoVote || -            layerVotedWithExactCompatibility) { -            layersWithVote++; +        return parentFrameRate; +    }(); + +    *transactionNeeded |= setFrameRateForLayerTree(frameRate); + +    // The frame rate is propagated to the children +    bool childrenHaveFrameRate = false; +    for (const sp<Layer>& child : mCurrentChildren) { +        childrenHaveFrameRate |= +                child->propagateFrameRateForLayerTree(frameRate, transactionNeeded); +    } + +    // If we don't have a valid frame rate, but the children do, we set this +    // layer as NoVote to allow the children to control the refresh rate +    if (!frameRate.rate.isValid() && frameRate.type != FrameRateCompatibility::NoVote && +        childrenHaveFrameRate) { +        *transactionNeeded |= +                setFrameRateForLayerTree(FrameRate(Fps(0.0f), FrameRateCompatibility::NoVote)); +    } + +    // We return whether this layer ot its children has a vote. We ignore ExactOrMultiple votes for +    // the same reason we are allowing touch boost for those layers. See +    // RefreshRateConfigs::getBestRefreshRate for more details. +    const auto layerVotedWithDefaultCompatibility = +            frameRate.rate.isValid() && frameRate.type == FrameRateCompatibility::Default; +    const auto layerVotedWithNoVote = frameRate.type == FrameRateCompatibility::NoVote; +    const auto layerVotedWithExactCompatibility = +            frameRate.rate.isValid() && frameRate.type == FrameRateCompatibility::Exact; +    return layerVotedWithDefaultCompatibility || layerVotedWithNoVote || +            layerVotedWithExactCompatibility || childrenHaveFrameRate; +} + +void Layer::updateTreeHasFrameRateVote() { +    const auto root = [&]() -> sp<Layer> { +        sp<Layer> layer = this; +        while (auto parent = layer->getParent()) { +            layer = parent;          } -    }); +        return layer; +    }(); -    // Now we can update the tree frame rate vote for each layer in the tree -    const bool treeHasFrameRateVote = layersWithVote > 0;      bool transactionNeeded = false; +    root->propagateFrameRateForLayerTree({}, &transactionNeeded); -    traverseTree([treeHasFrameRateVote, &transactionNeeded](Layer* layer) { -        transactionNeeded = layer->updateFrameRateForLayerTree(treeHasFrameRateVote); -    }); - +    // TODO(b/195668952): we probably don't need eTraversalNeeded here      if (transactionNeeded) {          mFlinger->setTransactionFlags(eTraversalNeeded);      } @@ -1263,42 +1296,23 @@ std::shared_ptr<frametimeline::SurfaceFrame> Layer::createSurfaceFrameForBuffer(      return surfaceFrame;  } -bool Layer::updateFrameRateForLayerTree(bool treeHasFrameRateVote) { -    const auto updateDrawingState = [&](FrameRate frameRate) { -        if (mDrawingState.frameRateForLayerTree == frameRate) { -            return false; -        } - -        mDrawingState.frameRateForLayerTree = frameRate; -        mDrawingState.sequence++; -        mDrawingState.modified = true; -        setTransactionFlags(eTransactionNeeded); - -        mFlinger->mScheduler->recordLayerHistory(this, systemTime(), -                                                 LayerHistory::LayerUpdateType::SetFrameRate); - -        return true; -    }; - -    const auto frameRate = mDrawingState.frameRate; -    if (frameRate.rate.isValid() || frameRate.type == FrameRateCompatibility::NoVote) { -        return updateDrawingState(frameRate); +bool Layer::setFrameRateForLayerTree(FrameRate frameRate) { +    if (mDrawingState.frameRateForLayerTree == frameRate) { +        return false;      } -    // This layer doesn't have a frame rate. Check if its ancestors have a vote -    for (sp<Layer> parent = getParent(); parent; parent = parent->getParent()) { -        if (parent->mDrawingState.frameRate.rate.isValid()) { -            return updateDrawingState(parent->mDrawingState.frameRate); -        } -    } +    mDrawingState.frameRateForLayerTree = frameRate; -    // This layer and its ancestors don't have a frame rate. If one of successors -    // has a vote, return a NoVote for successors to set the vote -    if (treeHasFrameRateVote) { -        return updateDrawingState(FrameRate(Fps(0.0f), FrameRateCompatibility::NoVote)); -    } +    // TODO(b/195668952): we probably don't need to dirty visible regions here +    // or even store frameRateForLayerTree in mDrawingState +    mDrawingState.sequence++; +    mDrawingState.modified = true; +    setTransactionFlags(eTransactionNeeded); + +    mFlinger->mScheduler->recordLayerHistory(this, systemTime(), +                                             LayerHistory::LayerUpdateType::SetFrameRate); -    return updateDrawingState(frameRate); +    return true;  }  Layer::FrameRate Layer::getFrameRateForLayerTree() const { @@ -2038,6 +2052,7 @@ void Layer::writeToProtoDrawingState(LayerProto* layerInfo, uint32_t traceFlags,          layerInfo->set_corner_radius(getRoundedCornerState().radius);          layerInfo->set_background_blur_radius(getBackgroundBlurRadius()); +        layerInfo->set_is_trusted_overlay(isTrustedOverlay());          LayerProtoHelper::writeToProto(transform, layerInfo->mutable_transform());          LayerProtoHelper::writePositionToProto(transform.tx(), transform.ty(),                                                 [&]() { return layerInfo->mutable_position(); }); @@ -2324,6 +2339,11 @@ InputWindowInfo Layer::fillInputInfo(const sp<DisplayDevice>& display) {                  toPhysicalDisplay.transform(Rect{cropLayer->mScreenBounds}));      } +    // Inherit the trusted state from the parent hierarchy, but don't clobber the trusted state +    // if it was set by WM for a known system overlay +    info.trustedOverlay = info.trustedOverlay || isTrustedOverlay(); + +      // If the layer is a clone, we need to crop the input region to cloned root to prevent      // touches from going outside the cloned area.      if (isClone()) { @@ -2535,6 +2555,12 @@ bool Layer::getPrimaryDisplayOnly() const {      return parent == nullptr ? false : parent->getPrimaryDisplayOnly();  } +void Layer::setClonedChild(const sp<Layer>& clonedChild) { +    mClonedChild = clonedChild; +    mHadClonedChild = true; +    mFlinger->mNumClones++; +} +  // ---------------------------------------------------------------------------  std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index ec9bb7c27f..59f5b0dc73 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -275,6 +275,9 @@ public:          // Stretch effect to apply to this layer          StretchEffect stretchEffect; +        // Whether or not this layer is a trusted overlay for input +        bool isTrustedOverlay; +          Rect bufferCrop;          Rect destinationFrame;      }; @@ -393,6 +396,7 @@ public:      virtual bool setBackgroundBlurRadius(int backgroundBlurRadius);      virtual bool setBlurRegions(const std::vector<BlurRegion>& effectRegions);      virtual bool setTransparentRegionHint(const Region& transparent); +    virtual bool setTrustedOverlay(bool);      virtual bool setFlags(uint32_t flags, uint32_t mask);      virtual bool setLayerStack(uint32_t layerStack);      virtual uint32_t getLayerStack() const; @@ -699,12 +703,6 @@ public:      virtual uint32_t doTransaction(uint32_t transactionFlags);      /* -     * Called before updating the drawing state buffer. Used by BufferStateLayer to release any -     * unlatched buffers in the drawing state. -     */ -    virtual void bufferMayChange(const sp<GraphicBuffer>& /* newBuffer */){}; - -    /*       * Remove relative z for the layer if its relative parent is not part of the       * provided layer tree.       */ @@ -796,6 +794,11 @@ public:      // for symmetry with Vector::remove      ssize_t removeChild(const sp<Layer>& layer);      sp<Layer> getParent() const { return mCurrentParent.promote(); } + +    // Should be called with the surfaceflinger statelock held +    bool isAtRoot() const { return mIsAtRoot; } +    void setIsAtRoot(bool isAtRoot) { mIsAtRoot = isAtRoot; } +      bool hasParent() const { return getParent() != nullptr; }      Rect getScreenBounds(bool reduceTransparentRegion = true) const;      bool setChildLayer(const sp<Layer>& childLayer, int32_t z); @@ -863,6 +866,8 @@ public:      // The layers in the cloned hierarchy will match the lifetime of the real layers. That is      // if the real layer is destroyed, then the clone layer will also be destroyed.      sp<Layer> mClonedChild; +    bool mHadClonedChild = false; +    void setClonedChild(const sp<Layer>& mClonedChild);      mutable bool contentDirty{false};      Region surfaceDamageRegion; @@ -1042,7 +1047,10 @@ private:                                            const std::vector<Layer*>& layersInTree);      void updateTreeHasFrameRateVote(); +    bool propagateFrameRateForLayerTree(FrameRate parentFrameRate, bool* transactionNeeded); +    bool setFrameRateForLayerTree(FrameRate);      void setZOrderRelativeOf(const wp<Layer>& relativeOf); +    bool isTrustedOverlay() const;      // Find the root of the cloned hierarchy, this means the first non cloned parent.      // This will return null if first non cloned parent is not found. @@ -1059,8 +1067,6 @@ private:      // Fills in the frame and transform info for the InputWindowInfo      void fillInputFrameInfo(InputWindowInfo& info, const ui::Transform& toPhysicalDisplay); -    bool updateFrameRateForLayerTree(bool treeHasFrameRateVote); -      // Cached properties computed from drawing state      // Effective transform taking into account parent transforms and any parent scaling, which is      // a transform from the current layer coordinate space to display(screen) coordinate space. @@ -1101,6 +1107,8 @@ private:      // A list of regions on this layer that should have blurs.      const std::vector<BlurRegion> getBlurRegions() const; + +    bool mIsAtRoot = false;  };  std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate); diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index 663e62a2f5..27a1c280fb 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -197,6 +197,7 @@ bool RefreshRateOverlay::createLayer() {      Mutex::Autolock _l(mFlinger.mStateLock);      mLayer = mClient->getLayerUser(mIBinder);      mLayer->setFrameRate(Layer::FrameRate(Fps(0.0f), Layer::FrameRateCompatibility::NoVote)); +    mLayer->setIsAtRoot(true);      // setting Layer's Z requires resorting layersSortedByZ      ssize_t idx = mFlinger.mDrawingState.layersSortedByZ.indexOf(mLayer); diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 653aca6cde..aa2fec56ad 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -287,33 +287,12 @@ void RegionSamplingThread::captureSample() {          descriptors.emplace_back(descriptor);      } -    auto dx = 0; -    auto dy = 0; -    switch (orientation) { -        case ui::Transform::ROT_90: -            dx = displaySize.getWidth(); -            break; -        case ui::Transform::ROT_180: -            dx = displaySize.getWidth(); -            dy = displaySize.getHeight(); -            break; -        case ui::Transform::ROT_270: -            dy = displaySize.getHeight(); -            break; -        default: -            break; -    } - -    ui::Transform t(orientation); -    auto screencapRegion = t.transform(sampleRegion); -    screencapRegion = screencapRegion.translate(dx, dy); -      const Rect sampledBounds = sampleRegion.bounds(); +    constexpr bool kUseIdentityTransform = false;      SurfaceFlinger::RenderAreaFuture renderAreaFuture = ftl::defer([=] { -        return DisplayRenderArea::create(displayWeak, screencapRegion.bounds(), -                                         sampledBounds.getSize(), ui::Dataspace::V0_SRGB, -                                         orientation); +        return DisplayRenderArea::create(displayWeak, sampledBounds, sampledBounds.getSize(), +                                         ui::Dataspace::V0_SRGB, kUseIdentityTransform);      });      std::unordered_set<sp<IRegionSamplingListener>, SpHash<IRegionSamplingListener>> listeners; diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp index 0eb16e2384..0334d70bd5 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp @@ -107,9 +107,39 @@ std::pair<nsecs_t, nsecs_t> RefreshRateConfigs::getDisplayFrames(nsecs_t layerPe      return {quotient, remainder};  } +bool RefreshRateConfigs::isVoteAllowed(const LayerRequirement& layer, +                                       const RefreshRate& refreshRate) const { +    switch (layer.vote) { +        case LayerVoteType::ExplicitExactOrMultiple: +        case LayerVoteType::Heuristic: +            if (mConfig.frameRateMultipleThreshold != 0 && +                refreshRate.fps.greaterThanOrEqualWithMargin( +                        Fps(mConfig.frameRateMultipleThreshold)) && +                layer.desiredRefreshRate.lessThanWithMargin( +                        Fps(mConfig.frameRateMultipleThreshold / 2))) { +                // Don't vote high refresh rates past the threshold for layers with a low desired +                // refresh rate. For example, desired 24 fps with 120 Hz threshold means no vote for +                // 120 Hz, but desired 60 fps should have a vote. +                return false; +            } +            break; +        case LayerVoteType::ExplicitDefault: +        case LayerVoteType::ExplicitExact: +        case LayerVoteType::Max: +        case LayerVoteType::Min: +        case LayerVoteType::NoVote: +            break; +    } +    return true; +} +  float RefreshRateConfigs::calculateLayerScoreLocked(const LayerRequirement& layer,                                                      const RefreshRate& refreshRate,                                                      bool isSeamlessSwitch) const { +    if (!isVoteAllowed(layer, refreshRate)) { +        return 0; +    } +      // Slightly prefer seamless switches.      constexpr float kSeamedSwitchPenalty = 0.95f;      const float seamlessness = isSeamlessSwitch ? 1.0f : kSeamedSwitchPenalty; @@ -331,8 +361,9 @@ RefreshRate RefreshRateConfigs::getBestRefreshRateLocked(      const auto& defaultMode = mRefreshRates.at(policy->defaultMode);      for (const auto& layer : layers) { -        ALOGV("Calculating score for %s (%s, weight %.2f)", layer.name.c_str(), -              layerVoteTypeString(layer.vote).c_str(), layer.weight); +        ALOGV("Calculating score for %s (%s, weight %.2f, desired %.2f) ", layer.name.c_str(), +              layerVoteTypeString(layer.vote).c_str(), layer.weight, +              layer.desiredRefreshRate.getValue());          if (layer.vote == LayerVoteType::NoVote || layer.vote == LayerVoteType::Min) {              continue;          } @@ -646,9 +677,8 @@ void RefreshRateConfigs::setCurrentModeId(DisplayModeId modeId) {  }  RefreshRateConfigs::RefreshRateConfigs(const DisplayModes& modes, DisplayModeId currentModeId, -                                       bool enableFrameRateOverride) -      : mKnownFrameRates(constructKnownFrameRates(modes)), -        mEnableFrameRateOverride(enableFrameRateOverride) { +                                       Config config) +      : mKnownFrameRates(constructKnownFrameRates(modes)), mConfig(config) {      updateDisplayModes(modes, currentModeId);  } @@ -685,7 +715,7 @@ void RefreshRateConfigs::updateDisplayModes(const DisplayModes& modes,      mMaxSupportedRefreshRate = sortedModes.back();      mSupportsFrameRateOverride = false; -    if (mEnableFrameRateOverride) { +    if (mConfig.enableFrameRateOverride) {          for (const auto& mode1 : sortedModes) {              for (const auto& mode2 : sortedModes) {                  if (getFrameRateDivider(mode1->getFps(), mode2->getFps()) >= 2) { @@ -859,6 +889,7 @@ RefreshRateConfigs::KernelIdleTimerAction RefreshRateConfigs::getIdleTimerAction      const auto& deviceMin = *mMinSupportedRefreshRate;      const auto& minByPolicy = getMinRefreshRateByPolicyLocked();      const auto& maxByPolicy = getMaxRefreshRateByPolicyLocked(); +    const auto& currentPolicy = getCurrentPolicyLocked();      // Kernel idle timer will set the refresh rate to the device min. If DisplayManager says that      // the min allowed refresh rate is higher than the device min, we do not want to enable the @@ -867,6 +898,10 @@ RefreshRateConfigs::KernelIdleTimerAction RefreshRateConfigs::getIdleTimerAction          return RefreshRateConfigs::KernelIdleTimerAction::TurnOff;      }      if (minByPolicy == maxByPolicy) { +        // when min primary range in display manager policy is below device min turn on the timer. +        if (currentPolicy->primaryRange.min.lessThanWithMargin(deviceMin.getFps())) { +            return RefreshRateConfigs::KernelIdleTimerAction::TurnOn; +        }          return RefreshRateConfigs::KernelIdleTimerAction::TurnOff;      }      // Turn on the timer in all other cases. diff --git a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h index 6cd0f422e9..dfd13953e7 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateConfigs.h +++ b/services/surfaceflinger/Scheduler/RefreshRateConfigs.h @@ -53,7 +53,7 @@ class RefreshRateConfigs {  public:      // Margin used when matching refresh rates to the content desired ones.      static constexpr nsecs_t MARGIN_FOR_PERIOD_CALCULATION = -        std::chrono::nanoseconds(800us).count(); +            std::chrono::nanoseconds(800us).count();      class RefreshRate {      private: @@ -302,8 +302,19 @@ public:      // Returns a known frame rate that is the closest to frameRate      Fps findClosestKnownFrameRate(Fps frameRate) const; +    // Configuration flags. +    struct Config { +        bool enableFrameRateOverride = false; + +        // Specifies the upper refresh rate threshold (inclusive) for layer vote types of multiple +        // or heuristic, such that refresh rates higher than this value will not be voted for. 0 if +        // no threshold is set. +        int frameRateMultipleThreshold = 0; +    }; +      RefreshRateConfigs(const DisplayModes& modes, DisplayModeId currentModeId, -                       bool enableFrameRateOverride = false); +                       Config config = {.enableFrameRateOverride = false, +                                        .frameRateMultipleThreshold = 0});      void updateDisplayModes(const DisplayModes& mode, DisplayModeId currentModeId) EXCLUDES(mLock); @@ -315,8 +326,7 @@ public:          return mRefreshRates.size() > 1;      } -    // Class to enumerate options around toggling the kernel timer on and off. We have an option -    // for no change to avoid extra calls to kernel. +    // Class to enumerate options around toggling the kernel timer on and off.      enum class KernelIdleTimerAction {          TurnOff,  // Turn off the idle timer.          TurnOn    // Turn on the idle timer. @@ -387,6 +397,9 @@ private:      const Policy* getCurrentPolicyLocked() const REQUIRES(mLock);      bool isPolicyValidLocked(const Policy& policy) const REQUIRES(mLock); +    // Returns whether the layer is allowed to vote for the given refresh rate. +    bool isVoteAllowed(const LayerRequirement&, const RefreshRate&) const; +      // calculates a score for a layer. Used to determine the display refresh rate      // and the frame rate override for certains applications.      float calculateLayerScoreLocked(const LayerRequirement&, const RefreshRate&, @@ -424,7 +437,7 @@ private:      // from based on the closest value.      const std::vector<Fps> mKnownFrameRates; -    const bool mEnableFrameRateOverride; +    const Config mConfig;      bool mSupportsFrameRateOverride;      struct GetBestRefreshRateInvocation { diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp index 28be962f2c..b805bf68e4 100644 --- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp +++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp @@ -84,10 +84,13 @@ ScheduleResult VSyncDispatchTimerQueueEntry::schedule(VSyncDispatch::ScheduleTim                                                        VSyncTracker& tracker, nsecs_t now) {      auto nextVsyncTime = tracker.nextAnticipatedVSyncTimeFrom(              std::max(timing.earliestVsync, now + timing.workDuration + timing.readyDuration)); +    auto nextWakeupTime = nextVsyncTime - timing.workDuration - timing.readyDuration;      bool const wouldSkipAVsyncTarget =              mArmedInfo && (nextVsyncTime > (mArmedInfo->mActualVsyncTime + mMinVsyncDistance)); -    if (wouldSkipAVsyncTarget) { +    bool const wouldSkipAWakeup = +            mArmedInfo && ((nextWakeupTime > (mArmedInfo->mActualWakeupTime + mMinVsyncDistance))); +    if (wouldSkipAVsyncTarget && wouldSkipAWakeup) {          return getExpectedCallbackTime(nextVsyncTime, timing);      } @@ -97,9 +100,9 @@ ScheduleResult VSyncDispatchTimerQueueEntry::schedule(VSyncDispatch::ScheduleTim      if (alreadyDispatchedForVsync) {          nextVsyncTime =                  tracker.nextAnticipatedVSyncTimeFrom(*mLastDispatchTime + mMinVsyncDistance); +        nextWakeupTime = nextVsyncTime - timing.workDuration - timing.readyDuration;      } -    auto const nextWakeupTime = nextVsyncTime - timing.workDuration - timing.readyDuration;      auto const nextReadyTime = nextVsyncTime - timing.readyDuration;      mScheduleTiming = timing;      mArmedInfo = {nextWakeupTime, nextVsyncTime, nextReadyTime}; diff --git a/services/surfaceflinger/Scheduler/VsyncModulator.cpp b/services/surfaceflinger/Scheduler/VsyncModulator.cpp index 194d808836..245db0f5c7 100644 --- a/services/surfaceflinger/Scheduler/VsyncModulator.cpp +++ b/services/surfaceflinger/Scheduler/VsyncModulator.cpp @@ -46,27 +46,36 @@ VsyncModulator::VsyncConfig VsyncModulator::setVsyncConfigSet(const VsyncConfigS      return updateVsyncConfigLocked();  } -VsyncModulator::VsyncConfigOpt VsyncModulator::setTransactionSchedule( -        TransactionSchedule schedule) { +VsyncModulator::VsyncConfigOpt VsyncModulator::setTransactionSchedule(TransactionSchedule schedule, +                                                                      const sp<IBinder>& token) { +    std::lock_guard<std::mutex> lock(mMutex);      switch (schedule) {          case Schedule::EarlyStart: -            ALOGW_IF(mEarlyWakeup, "%s: Duplicate EarlyStart", __FUNCTION__); -            mEarlyWakeup = true; +            if (token) { +                mEarlyWakeupRequests.emplace(token); +                token->linkToDeath(this); +            } else { +                ALOGW("%s: EarlyStart requested without a valid token", __func__); +            }              break; -        case Schedule::EarlyEnd: -            ALOGW_IF(!mEarlyWakeup, "%s: Unexpected EarlyEnd", __FUNCTION__); -            mEarlyWakeup = false; +        case Schedule::EarlyEnd: { +            if (token && mEarlyWakeupRequests.erase(token) > 0) { +                token->unlinkToDeath(this); +            } else { +                ALOGW("%s: Unexpected EarlyEnd", __func__); +            }              break; +        }          case Schedule::Late:              // No change to mEarlyWakeup for non-explicit states.              break;      }      if (mTraceDetailedInfo) { -        ATRACE_INT("mEarlyWakeup", mEarlyWakeup); +        ATRACE_INT("mEarlyWakeup", static_cast<int>(mEarlyWakeupRequests.size()));      } -    if (!mEarlyWakeup && schedule == Schedule::EarlyEnd) { +    if (mEarlyWakeupRequests.empty() && schedule == Schedule::EarlyEnd) {          mEarlyTransactionFrames = MIN_EARLY_TRANSACTION_FRAMES;          mEarlyTransactionStartTime = mNow();      } @@ -76,7 +85,7 @@ VsyncModulator::VsyncConfigOpt VsyncModulator::setTransactionSchedule(          return std::nullopt;      }      mTransactionSchedule = schedule; -    return updateVsyncConfig(); +    return updateVsyncConfigLocked();  }  VsyncModulator::VsyncConfigOpt VsyncModulator::onTransactionCommit() { @@ -128,8 +137,8 @@ VsyncModulator::VsyncConfig VsyncModulator::getVsyncConfig() const {  const VsyncModulator::VsyncConfig& VsyncModulator::getNextVsyncConfig() const {      // Early offsets are used if we're in the middle of a refresh rate      // change, or if we recently begin a transaction. -    if (mEarlyWakeup || mTransactionSchedule == Schedule::EarlyEnd || mEarlyTransactionFrames > 0 || -        mRefreshRateChangePending) { +    if (!mEarlyWakeupRequests.empty() || mTransactionSchedule == Schedule::EarlyEnd || +        mEarlyTransactionFrames > 0 || mRefreshRateChangePending) {          return mVsyncConfigSet.early;      } else if (mEarlyGpuFrames > 0) {          return mVsyncConfigSet.earlyGpu; @@ -160,4 +169,11 @@ VsyncModulator::VsyncConfig VsyncModulator::updateVsyncConfigLocked() {      return offsets;  } +void VsyncModulator::binderDied(const wp<IBinder>& who) { +    std::lock_guard<std::mutex> lock(mMutex); +    mEarlyWakeupRequests.erase(who); + +    static_cast<void>(updateVsyncConfigLocked()); +} +  } // namespace android::scheduler diff --git a/services/surfaceflinger/Scheduler/VsyncModulator.h b/services/surfaceflinger/Scheduler/VsyncModulator.h index 9410768b2d..b2b0451666 100644 --- a/services/surfaceflinger/Scheduler/VsyncModulator.h +++ b/services/surfaceflinger/Scheduler/VsyncModulator.h @@ -19,8 +19,10 @@  #include <chrono>  #include <mutex>  #include <optional> +#include <unordered_set>  #include <android-base/thread_annotations.h> +#include <binder/IBinder.h>  #include <utils/Timers.h>  namespace android::scheduler { @@ -35,7 +37,7 @@ enum class TransactionSchedule {  };  // Modulates VSYNC phase depending on transaction schedule and refresh rate changes. -class VsyncModulator { +class VsyncModulator : public IBinder::DeathRecipient {  public:      // Number of frames to keep early offsets after an early transaction or GPU composition.      // This acts as a low-pass filter in case subsequent transactions are delayed, or if the @@ -91,7 +93,8 @@ public:      [[nodiscard]] VsyncConfig setVsyncConfigSet(const VsyncConfigSet&) EXCLUDES(mMutex);      // Changes offsets in response to transaction flags or commit. -    [[nodiscard]] VsyncConfigOpt setTransactionSchedule(TransactionSchedule); +    [[nodiscard]] VsyncConfigOpt setTransactionSchedule(TransactionSchedule, +                                                        const sp<IBinder>& = {}) EXCLUDES(mMutex);      [[nodiscard]] VsyncConfigOpt onTransactionCommit();      // Called when we send a refresh rate change to hardware composer, so that @@ -104,6 +107,10 @@ public:      [[nodiscard]] VsyncConfigOpt onDisplayRefresh(bool usedGpuComposition); +protected: +    // Called from unit tests as well +    void binderDied(const wp<IBinder>&) override EXCLUDES(mMutex); +  private:      const VsyncConfig& getNextVsyncConfig() const REQUIRES(mMutex);      [[nodiscard]] VsyncConfig updateVsyncConfig() EXCLUDES(mMutex); @@ -116,8 +123,14 @@ private:      using Schedule = TransactionSchedule;      std::atomic<Schedule> mTransactionSchedule = Schedule::Late; -    std::atomic<bool> mEarlyWakeup = false; +    struct WpHash { +        size_t operator()(const wp<IBinder>& p) const { +            return std::hash<IBinder*>()(p.unsafe_get()); +        } +    }; + +    std::unordered_set<wp<IBinder>, WpHash> mEarlyWakeupRequests GUARDED_BY(mMutex);      std::atomic<bool> mRefreshRateChangePending = false;      std::atomic<int> mEarlyTransactionFrames = 0; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index f346465c89..230810c936 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -45,6 +45,7 @@  #include <compositionengine/OutputLayer.h>  #include <compositionengine/RenderSurface.h>  #include <compositionengine/impl/OutputCompositionState.h> +#include <compositionengine/impl/OutputLayerCompositionState.h>  #include <configstore/Utils.h>  #include <cutils/compiler.h>  #include <cutils/properties.h> @@ -310,6 +311,7 @@ Dataspace SurfaceFlinger::wideColorGamutCompositionDataspace = Dataspace::V0_SRG  ui::PixelFormat SurfaceFlinger::wideColorGamutCompositionPixelFormat = ui::PixelFormat::RGBA_8888;  bool SurfaceFlinger::useFrameRateApi;  bool SurfaceFlinger::enableSdrDimming; +bool SurfaceFlinger::enableLatchUnsignaled;  std::string decodeDisplayColorSetting(DisplayColorSetting displayColorSetting) {      switch(displayColorSetting) { @@ -344,7 +346,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)          mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),          mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()),          mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)), -        mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) { +        mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)), +        mPowerAdvisor(*this) {      ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());      mSetInputWindowsListener = new SetInputWindowsListener([&]() { setInputWindowsFinished(); }); @@ -479,6 +482,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI      // Debug property overrides ro. property      enableSdrDimming = property_get_bool("debug.sf.enable_sdr_dimming", enable_sdr_dimming(false)); + +    enableLatchUnsignaled = base::GetBoolProperty("debug.sf.latch_unsignaled"s, false);  }  SurfaceFlinger::~SurfaceFlinger() = default; @@ -816,6 +821,8 @@ void SurfaceFlinger::init() {      // set initial conditions (e.g. unblank default device)      initializeDisplays(); +    mPowerAdvisor.init(); +      char primeShaderCache[PROPERTY_VALUE_MAX];      property_get("service.sf.prime_shader_cache", primeShaderCache, "1");      if (atoi(primeShaderCache)) { @@ -1183,6 +1190,10 @@ void SurfaceFlinger::setActiveModeInternal() {      updatePhaseConfiguration(refreshRate);      ATRACE_INT("ActiveConfigFPS", refreshRate.getValue()); +    if (mRefreshRateOverlay) { +        mRefreshRateOverlay->changeRefreshRate(upcomingMode->getFps()); +    } +      if (mUpcomingActiveMode.event != Scheduler::ModeEvent::None) {          const nsecs_t vsyncPeriod = refreshRate.getPeriodNsecs();          const auto physicalId = display->getPhysicalId(); @@ -1265,14 +1276,24 @@ void SurfaceFlinger::performSetActiveMode() {      }      mScheduler->onNewVsyncPeriodChangeTimeline(outTimeline); -    if (mRefreshRateOverlay) { -        mRefreshRateOverlay->changeRefreshRate(desiredMode->getFps()); -    }      // Scheduler will submit an empty frame to HWC if needed.      mSetActiveModePending = true;  } +void SurfaceFlinger::disableExpensiveRendering() { +    schedule([=]() MAIN_THREAD { +        ATRACE_CALL(); +        if (mPowerAdvisor.isUsingExpensiveRendering()) { +            const auto& displays = ON_MAIN_THREAD(mDisplays); +            for (const auto& [_, display] : displays) { +                const static constexpr auto kDisable = false; +                mPowerAdvisor.setExpensiveRenderingExpected(display->getId(), kDisable); +            } +        } +    }).wait(); +} +  std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(PhysicalDisplayId displayId) {      auto modes = getHwComposer().getColorModes(displayId);      bool isInternalDisplay = displayId == getInternalDisplayIdLocked(); @@ -1622,6 +1643,9 @@ status_t SurfaceFlinger::addHdrLayerInfoListener(const sp<IBinder>& displayToken          hdrInfoReporter = sp<HdrLayerInfoReporter>::make();      }      hdrInfoReporter->addListener(listener); + + +    mAddingHDRLayerInfoListener = true;      return OK;  } @@ -2070,6 +2094,7 @@ void SurfaceFlinger::onMessageRefresh() {      const auto prevVsyncTime = mScheduler->getPreviousVsyncFrom(mExpectedPresentTime);      const auto hwcMinWorkDuration = mVsyncConfiguration->getCurrentConfigs().hwcMinWorkDuration;      refreshArgs.earliestPresentTime = prevVsyncTime - hwcMinWorkDuration; +    refreshArgs.previousPresentFence = mPreviousPresentFences[0].fenceTime;      refreshArgs.nextInvalidateTime = mEventQueue->nextExpectedInvalidate();      mGeometryInvalid = false; @@ -2121,6 +2146,8 @@ void SurfaceFlinger::onMessageRefresh() {              mTracing.notify("bufferLatched");          }      } + +    mVisibleRegionsWereDirtyThisFrame = mVisibleRegionsDirty; // Cache value for use in post-comp      mVisibleRegionsDirty = false;      if (mCompositionEngine->needsAnotherUpdate()) { @@ -2265,6 +2292,7 @@ void SurfaceFlinger::postComposition() {      std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>              hdrInfoListeners; +    bool haveNewListeners = false;      {          Mutex::Autolock lock(mStateLock);          if (mFpsReporter) { @@ -2282,34 +2310,45 @@ void SurfaceFlinger::postComposition() {                  }              }          } +        haveNewListeners = mAddingHDRLayerInfoListener; // grab this with state lock +        mAddingHDRLayerInfoListener = false;      } -    for (auto& [compositionDisplay, listener] : hdrInfoListeners) { -        HdrLayerInfoReporter::HdrLayerInfo info; -        int32_t maxArea = 0; -        mDrawingState.traverse([&, compositionDisplay = compositionDisplay](Layer* layer) { -            if (layer->isVisible() && -                compositionDisplay->belongsInOutput(layer->getCompositionEngineLayerFE())) { -                const Dataspace transfer = +    if (haveNewListeners || mSomeDataspaceChanged || mVisibleRegionsWereDirtyThisFrame) { +        for (auto& [compositionDisplay, listener] : hdrInfoListeners) { +            HdrLayerInfoReporter::HdrLayerInfo info; +            int32_t maxArea = 0; +            mDrawingState.traverse([&, compositionDisplay = compositionDisplay](Layer* layer) { +                const auto layerFe = layer->getCompositionEngineLayerFE(); +                if (layer->isVisible() && compositionDisplay->belongsInOutput(layerFe)) { +                    const Dataspace transfer =                          static_cast<Dataspace>(layer->getDataSpace() & Dataspace::TRANSFER_MASK); -                const bool isHdr = (transfer == Dataspace::TRANSFER_ST2084 || -                                    transfer == Dataspace::TRANSFER_HLG); - -                if (isHdr) { -                    info.numberOfHdrLayers++; -                    auto bufferRect = layer->getCompositionState()->geomBufferSize; -                    int32_t area = bufferRect.width() * bufferRect.height(); -                    if (area > maxArea) { -                        maxArea = area; -                        info.maxW = bufferRect.width(); -                        info.maxH = bufferRect.height(); +                    const bool isHdr = (transfer == Dataspace::TRANSFER_ST2084 || +                                        transfer == Dataspace::TRANSFER_HLG); + +                    if (isHdr) { +                        const auto* outputLayer = +                            compositionDisplay->getOutputLayerForLayer(layerFe); +                        if (outputLayer) { +                            info.numberOfHdrLayers++; +                            const auto displayFrame = outputLayer->getState().displayFrame; +                            const int32_t area = displayFrame.width() * displayFrame.height(); +                            if (area > maxArea) { +                                maxArea = area; +                                info.maxW = displayFrame.width(); +                                info.maxH = displayFrame.height(); +                            } +                        }                      }                  } -            } -        }); -        listener->dispatchHdrLayerInfo(info); +            }); +            listener->dispatchHdrLayerInfo(info); +        }      } +    mSomeDataspaceChanged = false; +    mVisibleRegionsWereDirtyThisFrame = false; +      mTransactionCallbackInvoker.addPresentFence(mPreviousPresentFences[0].fence);      mTransactionCallbackInvoker.sendCallbacks(); @@ -2456,7 +2495,6 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) {      handleTransactionLocked(transactionFlags);      mDebugInTransaction = 0; -    invalidateHwcGeometry();      // here the transaction has been committed  } @@ -3118,16 +3156,21 @@ void SurfaceFlinger::initScheduler(const DisplayDeviceState& displayState) {          return;      }      const auto displayId = displayState.physical->id; -    mRefreshRateConfigs = std::make_unique< -            scheduler::RefreshRateConfigs>(displayState.physical->supportedModes, -                                           displayState.physical->activeMode->getId(), -                                           android::sysprop::enable_frame_rate_override(false)); +    scheduler::RefreshRateConfigs::Config config = +            {.enableFrameRateOverride = android::sysprop::enable_frame_rate_override(false), +             .frameRateMultipleThreshold = +                     base::GetIntProperty("debug.sf.frame_rate_multiple_threshold", 0)}; +    mRefreshRateConfigs = +            std::make_unique<scheduler::RefreshRateConfigs>(displayState.physical->supportedModes, +                                                            displayState.physical->activeMode +                                                                    ->getId(), +                                                            config);      const auto currRefreshRate = displayState.physical->activeMode->getFps();      mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate,                                                                        hal::PowerMode::OFF);      mVsyncConfiguration = getFactory().createVsyncConfiguration(currRefreshRate); -    mVsyncModulator.emplace(mVsyncConfiguration->getCurrentConfigs()); +    mVsyncModulator = sp<VsyncModulator>::make(mVsyncConfiguration->getCurrentConfigs());      // start the EventThread      mScheduler = getFactory().createScheduler(*mRefreshRateConfigs, *this); @@ -3228,19 +3271,10 @@ void SurfaceFlinger::commitTransactionLocked() {          }      } -    // TODO(b/163019109): See if this traversal is needed at all... -    if (!mOffscreenLayers.empty()) { -        mDrawingState.traverse([&](Layer* layer) { -            // If the layer can be reached when traversing mDrawingState, then the layer is no -            // longer offscreen. Remove the layer from the offscreenLayer set. -            if (mOffscreenLayers.count(layer)) { -                mOffscreenLayers.erase(layer); -            } -        }); -    } -      commitOffscreenLayers(); -    mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); +    if (mNumClones > 0) { +        mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); }); +    }  }  void SurfaceFlinger::commitOffscreenLayers() { @@ -3346,7 +3380,9 @@ bool SurfaceFlinger::handlePageFlip() {          mBootStage = BootStage::BOOTANIMATION;      } -    mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); }); +    if (mNumClones > 0) { +        mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); }); +    }      // Only continue with the refresh if there is actually new work to do      return !mLayersWithQueuedFrames.empty() && newDataLatched; @@ -3359,7 +3395,7 @@ void SurfaceFlinger::invalidateHwcGeometry() {  status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,                                          const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc,                                          const sp<IBinder>& parentHandle, -                                        const sp<Layer>& parentLayer, bool addToCurrentState, +                                        const sp<Layer>& parentLayer, bool addToRoot,                                          uint32_t* outTransformHint) {      if (mNumLayers >= ISurfaceComposer::MAX_LAYERS) {          ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers.load(), @@ -3371,7 +3407,7 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBind      if (gbc != nullptr) {          initialProducer = IInterface::asBinder(gbc);      } -    setLayerCreatedState(handle, lbc, parentHandle, parentLayer, initialProducer); +    setLayerCreatedState(handle, lbc, parentHandle, parentLayer, initialProducer, addToRoot);      // Create a transaction includes the initial parent and producer.      Vector<ComposerState> states; @@ -3414,9 +3450,10 @@ uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {      return setTransactionFlags(flags, TransactionSchedule::Late);  } -uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags, TransactionSchedule schedule) { +uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags, TransactionSchedule schedule, +                                             const sp<IBinder>& token) {      uint32_t old = mTransactionFlags.fetch_or(flags); -    modulateVsync(&VsyncModulator::setTransactionSchedule, schedule); +    modulateVsync(&VsyncModulator::setTransactionSchedule, schedule, token);      if ((old & flags) == 0) signalTransaction();      return old;  } @@ -3566,7 +3603,7 @@ bool SurfaceFlinger::transactionIsReadyToBeApplied(      for (const ComposerState& state : states) {          const layer_state_t& s = state.state;          const bool acquireFenceChanged = (s.what & layer_state_t::eAcquireFenceChanged); -        if (acquireFenceChanged && s.acquireFence && +        if (acquireFenceChanged && s.acquireFence && !enableLatchUnsignaled &&              s.acquireFence->getStatus() == Fence::Status::Unsignaled) {              ATRACE_NAME("fence unsignaled");              return false; @@ -3636,7 +3673,7 @@ void SurfaceFlinger::queueTransaction(TransactionState& state) {          return TransactionSchedule::Late;      }(state.flags); -    setTransactionFlags(eTransactionFlushNeeded, schedule); +    setTransactionFlags(eTransactionFlushNeeded, schedule, state.applyToken);  }  void SurfaceFlinger::waitForSynchronousTransaction( @@ -3894,7 +3931,7 @@ uint32_t SurfaceFlinger::setClientStateLocked(      sp<Layer> layer = nullptr;      if (s.surface) {          if (what & layer_state_t::eLayerCreated) { -            layer = handleLayerCreatedLocked(s.surface, privileged); +            layer = handleLayerCreatedLocked(s.surface);              if (layer) {                  // put the created layer into mLayersByLocalBinderToken.                  mLayersByLocalBinderToken.emplace(s.surface->localBinder(), layer); @@ -4132,6 +4169,15 @@ uint32_t SurfaceFlinger::setClientStateLocked(      if (what & layer_state_t::eAutoRefreshChanged) {          layer->setAutoRefresh(s.autoRefresh);      } +    if (what & layer_state_t::eTrustedOverlayChanged) { +        if (privileged) { +            if (layer->setTrustedOverlay(s.isTrustedOverlay)) { +                flags |= eTraversalNeeded; +            } +        } else { +            ALOGE("Attempt to set trusted overlay without permission ACCESS_SURFACE_FLINGER"); +        } +    }      if (what & layer_state_t::eStretchChanged) {          if (layer->setStretchEffect(s.stretchEffect)) {              flags |= eTraversalNeeded; @@ -4158,6 +4204,7 @@ uint32_t SurfaceFlinger::setClientStateLocked(                  : nullptr;          if (layer->reparent(parentHandle)) {              if (!hadParent) { +                layer->setIsAtRoot(false);                  mCurrentState.layersSortedByZ.remove(layer);              }              flags |= eTransactionNeeded | eTraversalNeeded; @@ -4231,7 +4278,7 @@ status_t SurfaceFlinger::mirrorLayer(const sp<Client>& client, const sp<IBinder>              return result;          } -        mirrorLayer->mClonedChild = mirrorFrom->createClone(); +        mirrorLayer->setClonedChild(mirrorFrom->createClone());      }      *outLayerId = mirrorLayer->sequence; @@ -4303,9 +4350,9 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie          return result;      } -    bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess(); -    result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer, -                            addToCurrentState, outTransformHint); +    bool addToRoot = callingThreadHasUnscopedSurfaceFlingerAccess(); +    result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer, addToRoot, +                            outTransformHint);      if (result != NO_ERROR) {          return result;      } @@ -4424,7 +4471,8 @@ void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer) {      // with the idea that the parent holds a reference and will eventually      // be cleaned up. However no one cleans up the top-level so we do so      // here. -    if (layer->getParent() == nullptr) { +    if (layer->isAtRoot()) { +        layer->setIsAtRoot(false);          mCurrentState.layersSortedByZ.remove(layer);      }      markLayerPendingRemovalLocked(layer); @@ -6597,7 +6645,7 @@ void SurfaceFlinger::onLayerFirstRef(Layer* layer) {  void SurfaceFlinger::onLayerDestroyed(Layer* layer) {      mNumLayers--; -    removeFromOffscreenLayers(layer); +    removeHierarchyFromOffscreenLayers(layer);      if (!layer->isRemovedFromCurrentState()) {          mScheduler->deregisterLayer(layer);      } @@ -6610,13 +6658,17 @@ void SurfaceFlinger::onLayerDestroyed(Layer* layer) {  // from dangling children layers such that they are not reachable from the  // Drawing state nor the offscreen layer list  // See b/141111965 -void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { +void SurfaceFlinger::removeHierarchyFromOffscreenLayers(Layer* layer) {      for (auto& child : layer->getCurrentChildren()) {          mOffscreenLayers.emplace(child.get());      }      mOffscreenLayers.erase(layer);  } +void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { +    mOffscreenLayers.erase(layer); +} +  status_t SurfaceFlinger::setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor,                                                   float lightPosY, float lightPosZ,                                                   float lightRadius) { @@ -6835,7 +6887,7 @@ int SurfaceFlinger::getMaxAcquiredBufferCountForRefreshRate(Fps refreshRate) con  void SurfaceFlinger::TransactionState::traverseStatesWithBuffers(          std::function<void(const layer_state_t&)> visitor) {      for (const auto& state : states) { -        if (state.state.hasBufferChanges() && (state.state.surface)) { +        if (state.state.hasBufferChanges() && state.state.hasValidBuffer() && state.state.surface) {              visitor(state.state);          }      } @@ -6843,10 +6895,10 @@ void SurfaceFlinger::TransactionState::traverseStatesWithBuffers(  void SurfaceFlinger::setLayerCreatedState(const sp<IBinder>& handle, const wp<Layer>& layer,                                            const wp<IBinder>& parent, const wp<Layer> parentLayer, -                                          const wp<IBinder>& producer) { +                                          const wp<IBinder>& producer, bool addToRoot) {      Mutex::Autolock lock(mCreatedLayersLock);      mCreatedLayers[handle->localBinder()] = -            std::make_unique<LayerCreatedState>(layer, parent, parentLayer, producer); +            std::make_unique<LayerCreatedState>(layer, parent, parentLayer, producer, addToRoot);  }  auto SurfaceFlinger::getLayerCreatedState(const sp<IBinder>& handle) { @@ -6871,7 +6923,7 @@ auto SurfaceFlinger::getLayerCreatedState(const sp<IBinder>& handle) {      return state;  } -sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle, bool privileged) { +sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle) {      const auto& state = getLayerCreatedState(handle);      if (!state) {          return nullptr; @@ -6884,7 +6936,7 @@ sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle, bo      }      sp<Layer> parent; -    bool allowAddRoot = privileged; +    bool allowAddRoot = state->addToRoot;      if (state->initialParent != nullptr) {          parent = fromHandleLocked(state->initialParent.promote()).promote();          if (parent == nullptr) { @@ -6897,6 +6949,7 @@ sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle, bo      }      if (parent == nullptr && allowAddRoot) { +        layer->setIsAtRoot(true);          mCurrentState.layersSortedByZ.add(layer);      } else if (parent == nullptr) {          layer->onRemovedFromCurrentState(); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index f33df86494..380f444221 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -270,6 +270,8 @@ public:      // being treated as native display brightness      static bool enableSdrDimming; +    static bool enableLatchUnsignaled; +      // must be called before clients can connect      void init() ANDROID_API; @@ -311,8 +313,12 @@ public:      void onLayerFirstRef(Layer*);      void onLayerDestroyed(Layer*); +    void removeHierarchyFromOffscreenLayers(Layer* layer);      void removeFromOffscreenLayers(Layer* layer); +    // TODO: Remove atomic if move dtor to main thread CL lands +    std::atomic<uint32_t> mNumClones; +      TransactionCallbackInvoker& getTransactionCallbackInvoker() {          return mTransactionCallbackInvoker;      } @@ -329,6 +335,10 @@ public:      bool mDisableClientCompositionCache = false;      void setInputWindowsFinished(); +    // Disables expensive rendering for all displays +    // This is scheduled on the main thread +    void disableExpensiveRendering(); +  protected:      // We're reference counted, never destroy SurfaceFlinger directly      virtual ~SurfaceFlinger(); @@ -841,7 +851,7 @@ private:      // but there is no need to try and wake up immediately to do it. Rather we rely on      // onFrameAvailable or another layer update to wake us up.      void setTraversalNeeded(); -    uint32_t setTransactionFlags(uint32_t flags, TransactionSchedule); +    uint32_t setTransactionFlags(uint32_t flags, TransactionSchedule, const sp<IBinder>& = {});      void commitTransaction() REQUIRES(mStateLock);      void commitOffscreenLayers();      bool transactionIsReadyToBeApplied( @@ -895,7 +905,7 @@ private:      status_t addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,                              const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc,                              const sp<IBinder>& parentHandle, const sp<Layer>& parentLayer, -                            bool addToCurrentState, uint32_t* outTransformHint); +                            bool addToRoot, uint32_t* outTransformHint);      // Traverse through all the layers and compute and cache its bounds.      void computeLayerBounds(); @@ -1230,11 +1240,19 @@ private:      State mDrawingState{LayerVector::StateSet::Drawing};      bool mVisibleRegionsDirty = false; +    // VisibleRegions dirty is already cleared by postComp, but we need to track it to prevent +    // extra work in the HDR layer info listener. +    bool mVisibleRegionsWereDirtyThisFrame = false; +    // Used to ensure we omit a callback when HDR layer info listener is newly added but the +    // scene hasn't changed +    bool mAddingHDRLayerInfoListener = false; +      // Set during transaction application stage to track if the input info or children      // for a layer has changed.      // TODO: Also move visibleRegions over to a boolean system.      bool mInputInfoChanged = false;      bool mSomeChildrenChanged; +    bool mSomeDataspaceChanged = false;      bool mForceTransactionDisplayChange = false;      bool mGeometryInvalid = false; @@ -1379,7 +1397,7 @@ private:      std::unique_ptr<scheduler::VsyncConfiguration> mVsyncConfiguration;      // Optional to defer construction until PhaseConfiguration is created. -    std::optional<scheduler::VsyncModulator> mVsyncModulator; +    sp<VsyncModulator> mVsyncModulator;      std::unique_ptr<scheduler::RefreshRateConfigs> mRefreshRateConfigs;      std::unique_ptr<scheduler::RefreshRateStats> mRefreshRateStats; @@ -1444,11 +1462,12 @@ private:      mutable Mutex mCreatedLayersLock;      struct LayerCreatedState {          LayerCreatedState(const wp<Layer>& layer, const wp<IBinder>& parent, -                          const wp<Layer> parentLayer, const wp<IBinder>& producer) +                          const wp<Layer> parentLayer, const wp<IBinder>& producer, bool addToRoot)                : layer(layer),                  initialParent(parent),                  initialParentLayer(parentLayer), -                initialProducer(producer) {} +                initialProducer(producer), +                addToRoot(addToRoot) {}          wp<Layer> layer;          // Indicates the initial parent of the created layer, only used for creating layer in          // SurfaceFlinger. If nullptr, it may add the created layer into the current root layers. @@ -1457,6 +1476,10 @@ private:          // Indicates the initial graphic buffer producer of the created layer, only used for          // creating layer in SurfaceFlinger.          wp<IBinder> initialProducer; +        // Indicates whether the layer getting created should be added at root if there's no parent +        // and has permission ACCESS_SURFACE_FLINGER. If set to false and no parent, the layer will +        // be added offscreen. +        bool addToRoot;      };      // A temporay pool that store the created layers and will be added to current state in main @@ -1464,10 +1487,9 @@ private:      std::unordered_map<BBinder*, std::unique_ptr<LayerCreatedState>> mCreatedLayers;      void setLayerCreatedState(const sp<IBinder>& handle, const wp<Layer>& layer,                                const wp<IBinder>& parent, const wp<Layer> parentLayer, -                              const wp<IBinder>& producer); +                              const wp<IBinder>& producer, bool addToRoot);      auto getLayerCreatedState(const sp<IBinder>& handle); -    sp<Layer> handleLayerCreatedLocked(const sp<IBinder>& handle, bool privileged) -            REQUIRES(mStateLock); +    sp<Layer> handleLayerCreatedLocked(const sp<IBinder>& handle) REQUIRES(mStateLock);      std::atomic<ui::Transform::RotationFlags> mDefaultDisplayTransformHint; diff --git a/services/surfaceflinger/SurfaceInterceptor.cpp b/services/surfaceflinger/SurfaceInterceptor.cpp index 8ca241e53d..23ab7c8bab 100644 --- a/services/surfaceflinger/SurfaceInterceptor.cpp +++ b/services/surfaceflinger/SurfaceInterceptor.cpp @@ -149,6 +149,7 @@ void SurfaceInterceptor::addInitialSurfaceStateLocked(Increment* increment,                              getLayerIdFromWeakRef(layer->mDrawingState.zOrderRelativeOf),                              layer->mDrawingState.z);      addShadowRadiusLocked(transaction, layerId, layer->mDrawingState.shadowRadius); +    addTrustedOverlayLocked(transaction, layerId, layer->mDrawingState.isTrustedOverlay);  }  void SurfaceInterceptor::addInitialDisplayStateLocked(Increment* increment, @@ -397,6 +398,13 @@ void SurfaceInterceptor::addShadowRadiusLocked(Transaction* transaction, int32_t      overrideChange->set_radius(shadowRadius);  } +void SurfaceInterceptor::addTrustedOverlayLocked(Transaction* transaction, int32_t layerId, +                                                 bool isTrustedOverlay) { +    SurfaceChange* change(createSurfaceChangeLocked(transaction, layerId)); +    TrustedOverlayChange* overrideChange(change->mutable_trusted_overlay()); +    overrideChange->set_is_trusted_overlay(isTrustedOverlay); +} +  void SurfaceInterceptor::addSurfaceChangesLocked(Transaction* transaction,          const layer_state_t& state)  { @@ -460,6 +468,9 @@ void SurfaceInterceptor::addSurfaceChangesLocked(Transaction* transaction,      if (state.what & layer_state_t::eShadowRadiusChanged) {          addShadowRadiusLocked(transaction, layerId, state.shadowRadius);      } +    if (state.what & layer_state_t::eTrustedOverlayChanged) { +        addTrustedOverlayLocked(transaction, layerId, state.isTrustedOverlay); +    }      if (state.what & layer_state_t::eStretchChanged) {          ALOGW("SurfaceInterceptor not implemented for eStretchChanged");      } diff --git a/services/surfaceflinger/SurfaceInterceptor.h b/services/surfaceflinger/SurfaceInterceptor.h index 30aca8340e..673f9e789d 100644 --- a/services/surfaceflinger/SurfaceInterceptor.h +++ b/services/surfaceflinger/SurfaceInterceptor.h @@ -177,6 +177,7 @@ private:      void addRelativeParentLocked(Transaction* transaction, int32_t layerId, int32_t parentId,                                   int z);      void addShadowRadiusLocked(Transaction* transaction, int32_t layerId, float shadowRadius); +    void addTrustedOverlayLocked(Transaction* transaction, int32_t layerId, bool isTrustedOverlay);      // Add display transactions to the trace      DisplayChange* createDisplayChangeLocked(Transaction* transaction, int32_t sequenceId); diff --git a/services/surfaceflinger/TransactionCallbackInvoker.cpp b/services/surfaceflinger/TransactionCallbackInvoker.cpp index fdf16a797f..6af69f0ef2 100644 --- a/services/surfaceflinger/TransactionCallbackInvoker.cpp +++ b/services/surfaceflinger/TransactionCallbackInvoker.cpp @@ -237,7 +237,8 @@ status_t TransactionCallbackInvoker::addCallbackHandle(const sp<CallbackHandle>&                                                      handle->previousReleaseFence,                                                      handle->transformHint,                                                      handle->currentMaxAcquiredBufferCount, -                                                    eventStats, jankData, handle->previousBufferId); +                                                    eventStats, jankData, +                                                    handle->previousReleaseCallbackId);      }      return NO_ERROR;  } diff --git a/services/surfaceflinger/TransactionCallbackInvoker.h b/services/surfaceflinger/TransactionCallbackInvoker.h index 444bec646e..6f4d812ec5 100644 --- a/services/surfaceflinger/TransactionCallbackInvoker.h +++ b/services/surfaceflinger/TransactionCallbackInvoker.h @@ -51,7 +51,7 @@ public:      nsecs_t refreshStartTime = 0;      nsecs_t dequeueReadyTime = 0;      uint64_t frameNumber = 0; -    uint64_t previousBufferId = 0; +    ReleaseCallbackId previousReleaseCallbackId = ReleaseCallbackId::INVALID_ID;  };  class TransactionCallbackInvoker { diff --git a/services/surfaceflinger/layerproto/LayerProtoParser.cpp b/services/surfaceflinger/layerproto/LayerProtoParser.cpp index aef670da33..2841f7c2fd 100644 --- a/services/surfaceflinger/layerproto/LayerProtoParser.cpp +++ b/services/surfaceflinger/layerproto/LayerProtoParser.cpp @@ -105,6 +105,7 @@ LayerProtoParser::Layer LayerProtoParser::generateLayer(const LayerProto& layerP      layer.queuedFrames = layerProto.queued_frames();      layer.refreshPending = layerProto.refresh_pending();      layer.isProtected = layerProto.is_protected(); +    layer.isTrustedOverlay = layerProto.is_trusted_overlay();      layer.cornerRadius = layerProto.corner_radius();      layer.backgroundBlurRadius = layerProto.background_blur_radius();      for (const auto& entry : layerProto.metadata()) { @@ -289,6 +290,7 @@ std::string LayerProtoParser::Layer::to_string() const {      StringAppendF(&result, "crop=%s, ", crop.to_string().c_str());      StringAppendF(&result, "cornerRadius=%f, ", cornerRadius);      StringAppendF(&result, "isProtected=%1d, ", isProtected); +    StringAppendF(&result, "isTrustedOverlay=%1d, ", isTrustedOverlay);      StringAppendF(&result, "isOpaque=%1d, invalidate=%1d, ", isOpaque, invalidate);      StringAppendF(&result, "dataspace=%s, ", dataspace.c_str());      StringAppendF(&result, "defaultPixelFormat=%s, ", pixelFormat.c_str()); diff --git a/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h b/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h index c48354fe95..52503bad3a 100644 --- a/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h +++ b/services/surfaceflinger/layerproto/include/layerproto/LayerProtoParser.h @@ -109,6 +109,7 @@ public:          int32_t queuedFrames;          bool refreshPending;          bool isProtected; +        bool isTrustedOverlay;          float cornerRadius;          int backgroundBlurRadius;          LayerMetadata metadata; diff --git a/services/surfaceflinger/layerproto/layers.proto b/services/surfaceflinger/layerproto/layers.proto index 9f25674f1b..dddc677715 100644 --- a/services/surfaceflinger/layerproto/layers.proto +++ b/services/surfaceflinger/layerproto/layers.proto @@ -128,6 +128,8 @@ message LayerProto {    // Regions of a layer, where blur should be applied.    repeated BlurRegion blur_regions = 54; + +  bool is_trusted_overlay = 55;  }  message PositionProto { diff --git a/services/surfaceflinger/tests/MirrorLayer_test.cpp b/services/surfaceflinger/tests/MirrorLayer_test.cpp index ccf434d63a..d02786504e 100644 --- a/services/surfaceflinger/tests/MirrorLayer_test.cpp +++ b/services/surfaceflinger/tests/MirrorLayer_test.cpp @@ -18,7 +18,9 @@  #pragma clang diagnostic push  #pragma clang diagnostic ignored "-Wconversion" +#include <private/android_filesystem_config.h>  #include "LayerTransactionTest.h" +#include "utils/TransactionUtils.h"  namespace android { @@ -227,6 +229,50 @@ TEST_F(MirrorLayerTest, MirrorBufferLayer) {      }  } +// Test that the mirror layer is initially offscreen. +TEST_F(MirrorLayerTest, InitialMirrorState) { +    const auto display = SurfaceComposerClient::getInternalDisplayToken(); +    ui::DisplayMode mode; +    SurfaceComposerClient::getActiveDisplayMode(display, &mode); +    const ui::Size& size = mode.resolution; + +    sp<SurfaceControl> mirrorLayer = nullptr; +    { +        // Run as system to get the ACCESS_SURFACE_FLINGER permission when mirroring +        UIDFaker f(AID_SYSTEM); +        // Mirror mChildLayer +        mirrorLayer = mClient->mirrorSurface(mChildLayer.get()); +        ASSERT_NE(mirrorLayer, nullptr); +    } + +    // Show the mirror layer, but don't reparent to a layer on screen. +    Transaction() +            .setPosition(mirrorLayer, 500, 500) +            .show(mirrorLayer) +            .setLayer(mirrorLayer, INT32_MAX - 1) +            .apply(); + +    { +        SCOPED_TRACE("Offscreen Mirror"); +        auto shot = screenshot(); +        shot->expectColor(Rect(0, 0, size.getWidth(), 50), Color::RED); +        shot->expectColor(Rect(0, 0, 50, size.getHeight()), Color::RED); +        shot->expectColor(Rect(450, 0, size.getWidth(), size.getHeight()), Color::RED); +        shot->expectColor(Rect(0, 450, size.getWidth(), size.getHeight()), Color::RED); +        shot->expectColor(Rect(50, 50, 450, 450), Color::GREEN); +    } + +    // Add mirrorLayer as child of mParentLayer so it's shown on the display +    Transaction().reparent(mirrorLayer, mParentLayer).apply(); + +    { +        SCOPED_TRACE("On Screen Mirror"); +        auto shot = screenshot(); +        // Child mirror +        shot->expectColor(Rect(550, 550, 950, 950), Color::GREEN); +    } +} +  } // namespace android  // TODO(b/129481165): remove the #pragma below and fix conversion issues diff --git a/services/surfaceflinger/tests/ReleaseBufferCallback_test.cpp b/services/surfaceflinger/tests/ReleaseBufferCallback_test.cpp index 5aa809dc8b..579a26ebf4 100644 --- a/services/surfaceflinger/tests/ReleaseBufferCallback_test.cpp +++ b/services/surfaceflinger/tests/ReleaseBufferCallback_test.cpp @@ -29,7 +29,7 @@ using android::hardware::graphics::common::V1_1::BufferUsage;  // b/181132765 - disabled until cuttlefish failures are investigated  class ReleaseBufferCallbackHelper {  public: -    static void function(void* callbackContext, uint64_t graphicsBufferId, +    static void function(void* callbackContext, ReleaseCallbackId callbackId,                           const sp<Fence>& releaseFence,                           uint32_t /*currentMaxAcquiredBufferCount*/) {          if (!callbackContext) { @@ -38,11 +38,11 @@ public:          ReleaseBufferCallbackHelper* helper =                  static_cast<ReleaseBufferCallbackHelper*>(callbackContext);          std::lock_guard lock(helper->mMutex); -        helper->mCallbackDataQueue.emplace(graphicsBufferId, releaseFence); +        helper->mCallbackDataQueue.emplace(callbackId, releaseFence);          helper->mConditionVariable.notify_all();      } -    void getCallbackData(uint64_t* bufferId) { +    void getCallbackData(ReleaseCallbackId* callbackId) {          std::unique_lock lock(mMutex);          if (mCallbackDataQueue.empty()) {              if (!mConditionVariable.wait_for(lock, std::chrono::seconds(3), @@ -53,7 +53,7 @@ public:          auto callbackData = mCallbackDataQueue.front();          mCallbackDataQueue.pop(); -        *bufferId = callbackData.first; +        *callbackId = callbackData.first;      }      void verifyNoCallbacks() { @@ -72,7 +72,7 @@ public:      std::mutex mMutex;      std::condition_variable mConditionVariable; -    std::queue<std::pair<uint64_t, sp<Fence>>> mCallbackDataQueue; +    std::queue<std::pair<ReleaseCallbackId, sp<Fence>>> mCallbackDataQueue;  };  class ReleaseBufferCallbackTest : public LayerTransactionTest { @@ -82,10 +82,11 @@ public:      }      static void submitBuffer(const sp<SurfaceControl>& layer, sp<GraphicBuffer> buffer, -                             sp<Fence> fence, CallbackHelper& callback, +                             sp<Fence> fence, CallbackHelper& callback, const ReleaseCallbackId& id,                               ReleaseBufferCallbackHelper& releaseCallback) {          Transaction t; -        t.setBuffer(layer, buffer, releaseCallback.getCallback()); +        t.setFrameNumber(layer, id.framenumber); +        t.setBuffer(layer, buffer, id, releaseCallback.getCallback());          t.setAcquireFence(layer, fence);          t.addTransactionCompletedCallback(callback.function, callback.getContext());          t.apply(); @@ -98,10 +99,10 @@ public:      }      static void waitForReleaseBufferCallback(ReleaseBufferCallbackHelper& releaseCallback, -                                             uint64_t expectedReleaseBufferId) { -        uint64_t actualReleaseBufferId; +                                             const ReleaseCallbackId& expectedCallbackId) { +        ReleaseCallbackId actualReleaseBufferId;          releaseCallback.getCallbackData(&actualReleaseBufferId); -        EXPECT_EQ(expectedReleaseBufferId, actualReleaseBufferId); +        EXPECT_EQ(expectedCallbackId, actualReleaseBufferId);          releaseCallback.verifyNoCallbacks();      }      static ReleaseBufferCallbackHelper* getReleaseBufferCallbackHelper() { @@ -116,6 +117,10 @@ public:                                           BufferUsage::COMPOSER_OVERLAY,                                   "test");      } +    static uint64_t generateFrameNumber() { +        static uint64_t sFrameNumber = 0; +        return ++sFrameNumber; +    }  };  TEST_F(ReleaseBufferCallbackTest, DISABLED_PresentBuffer) { @@ -125,7 +130,9 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_PresentBuffer) {      // If a buffer is being presented, we should not emit a release callback.      sp<GraphicBuffer> firstBuffer = getBuffer(); -    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, *releaseCallback); +    ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, firstBufferCallbackId, +                 *releaseCallback);      ExpectedResult expected;      expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                          ExpectedResult::Buffer::NOT_ACQUIRED); @@ -143,13 +150,15 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_PresentBuffer) {      // If a presented buffer is replaced, we should emit a release callback for the      // previously presented buffer.      sp<GraphicBuffer> secondBuffer = getBuffer(); -    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, *releaseCallback); +    ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, secondBufferCallbackId, +                 *releaseCallback);      expected = ExpectedResult();      expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                          ExpectedResult::Buffer::NOT_ACQUIRED,                          ExpectedResult::PreviousBuffer::RELEASED);      ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected)); -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));  }  TEST_F(ReleaseBufferCallbackTest, DISABLED_OffScreenLayer) { @@ -160,7 +169,9 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_OffScreenLayer) {      // If a buffer is being presented, we should not emit a release callback.      sp<GraphicBuffer> firstBuffer = getBuffer(); -    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, *releaseCallback); +    ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, firstBufferCallbackId, +                 *releaseCallback);      ExpectedResult expected;      expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                          ExpectedResult::Buffer::NOT_ACQUIRED); @@ -184,23 +195,27 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_OffScreenLayer) {      // If a presented buffer is replaced, we should emit a release callback for the      // previously presented buffer.      sp<GraphicBuffer> secondBuffer = getBuffer(); -    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, *releaseCallback); +    ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, secondBufferCallbackId, +                 *releaseCallback);      expected = ExpectedResult();      expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                          ExpectedResult::Buffer::NOT_ACQUIRED,                          ExpectedResult::PreviousBuffer::NOT_RELEASED);      ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected)); -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));      // If continue to submit buffer we continue to get release callbacks      sp<GraphicBuffer> thirdBuffer = getBuffer(); -    submitBuffer(layer, thirdBuffer, Fence::NO_FENCE, transactionCallback, *releaseCallback); +    ReleaseCallbackId thirdBufferCallbackId(secondBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, thirdBuffer, Fence::NO_FENCE, transactionCallback, thirdBufferCallbackId, +                 *releaseCallback);      expected = ExpectedResult();      expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                          ExpectedResult::Buffer::NOT_ACQUIRED,                          ExpectedResult::PreviousBuffer::NOT_RELEASED);      ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected)); -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBufferCallbackId));  }  TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_layerdestroy) { @@ -210,7 +225,9 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_layerdestroy) {      // If a buffer is being presented, we should not emit a release callback.      sp<GraphicBuffer> firstBuffer = getBuffer(); -    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, *releaseCallback); +    ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, firstBufferCallbackId, +                 *releaseCallback);      {          ExpectedResult expected;          expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer, @@ -225,7 +242,7 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_layerdestroy) {      t.apply();      layer = nullptr; -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));  }  // Destroying a never presented layer emits a callback. @@ -242,7 +259,9 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_OffScreenLayerDestroy)      // Submitting a buffer does not emit a callback.      sp<GraphicBuffer> firstBuffer = getBuffer(); -    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, *releaseCallback); +    ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, firstBufferCallbackId, +                 *releaseCallback);      {          ExpectedResult expected;          expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer, @@ -253,19 +272,21 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_OffScreenLayerDestroy)      // Submitting a second buffer will replace the drawing state buffer and emit a callback.      sp<GraphicBuffer> secondBuffer = getBuffer(); -    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, *transactionCallback, *releaseCallback); +    ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber()); +    submitBuffer(layer, secondBuffer, Fence::NO_FENCE, *transactionCallback, secondBufferCallbackId, +                 *releaseCallback);      {          ExpectedResult expected;          expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,                              ExpectedResult::Buffer::NOT_ACQUIRED);          ASSERT_NO_FATAL_FAILURE(waitForCallback(*transactionCallback, expected));          ASSERT_NO_FATAL_FAILURE( -                waitForReleaseBufferCallback(*releaseCallback, firstBuffer->getId())); +                waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));      }      // Destroying the offscreen layer emits a callback.      layer = nullptr; -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBufferCallbackId));  }  TEST_F(ReleaseBufferCallbackTest, DISABLED_FrameDropping) { @@ -275,12 +296,13 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_FrameDropping) {      // If a buffer is being presented, we should not emit a release callback.      sp<GraphicBuffer> firstBuffer = getBuffer(); +    ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());      // Try to present 100ms in the future      nsecs_t time = systemTime() + std::chrono::nanoseconds(100ms).count();      Transaction t; -    t.setBuffer(layer, firstBuffer, releaseCallback->getCallback()); +    t.setBuffer(layer, firstBuffer, firstBufferCallbackId, releaseCallback->getCallback());      t.setAcquireFence(layer, Fence::NO_FENCE);      t.addTransactionCompletedCallback(transactionCallback.function,                                        transactionCallback.getContext()); @@ -295,7 +317,8 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_FrameDropping) {      // Dropping frames in transaction queue emits a callback      sp<GraphicBuffer> secondBuffer = getBuffer(); -    t.setBuffer(layer, secondBuffer, releaseCallback->getCallback()); +    ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber()); +    t.setBuffer(layer, secondBuffer, secondBufferCallbackId, releaseCallback->getCallback());      t.setAcquireFence(layer, Fence::NO_FENCE);      t.addTransactionCompletedCallback(transactionCallback.function,                                        transactionCallback.getContext()); @@ -307,7 +330,7 @@ TEST_F(ReleaseBufferCallbackTest, DISABLED_FrameDropping) {                          ExpectedResult::Buffer::NOT_ACQUIRED,                          ExpectedResult::PreviousBuffer::RELEASED);      ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected)); -    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBuffer->getId())); +    ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));  }  } // namespace android diff --git a/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp b/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp index ee4e863474..d5890ffa79 100644 --- a/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp +++ b/services/surfaceflinger/tests/SurfaceInterceptor_test.cpp @@ -193,6 +193,7 @@ public:      bool reparentUpdateFound(const SurfaceChange& change, bool found);      bool relativeParentUpdateFound(const SurfaceChange& change, bool found);      bool shadowRadiusUpdateFound(const SurfaceChange& change, bool found); +    bool trustedOverlayUpdateFound(const SurfaceChange& change, bool found);      bool surfaceUpdateFound(const Trace& trace, SurfaceChange::SurfaceChangeCase changeCase);      // Find all of the updates in the single trace @@ -228,6 +229,7 @@ public:      void reparentUpdate(Transaction&);      void relativeParentUpdate(Transaction&);      void shadowRadiusUpdate(Transaction&); +    void trustedOverlayUpdate(Transaction&);      void surfaceCreation(Transaction&);      void displayCreation(Transaction&);      void displayDeletion(Transaction&); @@ -405,6 +407,10 @@ void SurfaceInterceptorTest::shadowRadiusUpdate(Transaction& t) {      t.setShadowRadius(mBGSurfaceControl, SHADOW_RADIUS_UPDATE);  } +void SurfaceInterceptorTest::trustedOverlayUpdate(Transaction& t) { +    t.setTrustedOverlay(mBGSurfaceControl, true); +} +  void SurfaceInterceptorTest::displayCreation(Transaction&) {      sp<IBinder> testDisplay = SurfaceComposerClient::createDisplay(DISPLAY_NAME, false);      SurfaceComposerClient::destroyDisplay(testDisplay); @@ -433,6 +439,7 @@ void SurfaceInterceptorTest::runAllUpdates() {      runInTransaction(&SurfaceInterceptorTest::reparentUpdate);      runInTransaction(&SurfaceInterceptorTest::relativeParentUpdate);      runInTransaction(&SurfaceInterceptorTest::shadowRadiusUpdate); +    runInTransaction(&SurfaceInterceptorTest::trustedOverlayUpdate);  }  void SurfaceInterceptorTest::surfaceCreation(Transaction&) { @@ -644,6 +651,17 @@ bool SurfaceInterceptorTest::shadowRadiusUpdateFound(const SurfaceChange& change      return foundShadowRadius;  } +bool SurfaceInterceptorTest::trustedOverlayUpdateFound(const SurfaceChange& change, +                                                       bool foundTrustedOverlay) { +    bool hasTrustedOverlay(change.trusted_overlay().is_trusted_overlay()); +    if (hasTrustedOverlay && !foundTrustedOverlay) { +        foundTrustedOverlay = true; +    } else if (hasTrustedOverlay && foundTrustedOverlay) { +        []() { FAIL(); }(); +    } +    return foundTrustedOverlay; +} +  bool SurfaceInterceptorTest::surfaceUpdateFound(const Trace& trace,          SurfaceChange::SurfaceChangeCase changeCase) {      bool foundUpdate = false; @@ -704,6 +722,9 @@ bool SurfaceInterceptorTest::surfaceUpdateFound(const Trace& trace,                          case SurfaceChange::SurfaceChangeCase::kShadowRadius:                              foundUpdate = shadowRadiusUpdateFound(change, foundUpdate);                              break; +                        case SurfaceChange::SurfaceChangeCase::kTrustedOverlay: +                            foundUpdate = trustedOverlayUpdateFound(change, foundUpdate); +                            break;                          case SurfaceChange::SurfaceChangeCase::SURFACECHANGE_NOT_SET:                              break;                      } @@ -897,6 +918,11 @@ TEST_F(SurfaceInterceptorTest, InterceptShadowRadiusUpdateWorks) {                  SurfaceChange::SurfaceChangeCase::kShadowRadius);  } +TEST_F(SurfaceInterceptorTest, InterceptTrustedOverlayUpdateWorks) { +    captureTest(&SurfaceInterceptorTest::trustedOverlayUpdate, +                SurfaceChange::SurfaceChangeCase::kTrustedOverlay); +} +  TEST_F(SurfaceInterceptorTest, InterceptAllUpdatesWorks) {      captureTest(&SurfaceInterceptorTest::runAllUpdates,                  &SurfaceInterceptorTest::assertAllUpdatesFound); diff --git a/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp b/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp index 0a8c7486f7..97b60e0d8b 100644 --- a/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +++ b/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp @@ -160,7 +160,7 @@ public:      size_t maxTokens;      static constexpr pid_t kSurfaceFlingerPid = 666;      static constexpr nsecs_t kPresentThreshold = std::chrono::nanoseconds(2ns).count(); -    static constexpr nsecs_t kDeadlineThreshold = std::chrono::nanoseconds(2ns).count(); +    static constexpr nsecs_t kDeadlineThreshold = std::chrono::nanoseconds(0ns).count();      static constexpr nsecs_t kStartThreshold = std::chrono::nanoseconds(2ns).count();      static constexpr JankClassificationThresholds kTestThresholds{kPresentThreshold,                                                                    kDeadlineThreshold, diff --git a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp index d4b229fa22..3423bd590b 100644 --- a/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +++ b/services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp @@ -165,6 +165,7 @@ protected:                                       RefreshRate::ConstructorTag(0)};      RefreshRate mExpected120Config = {HWC_CONFIG_ID_120, mConfig120, Fps(120),                                        RefreshRate::ConstructorTag(0)}; +  private:      DisplayModePtr createDisplayMode(DisplayModeId modeId, int32_t group, int64_t vsyncPeriod,                                       ui::Size resolution = ui::Size()); @@ -487,6 +488,52 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_90) {                refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));  } +TEST_F(RefreshRateConfigsTest, getBestRefreshRate_multipleThreshold_60_90) { +    RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 90}; +    auto refreshRateConfigs = +            std::make_unique<RefreshRateConfigs>(m60_90Device, +                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, config); + +    auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; +    auto& lr = layers[0]; + +    lr.vote = LayerVoteType::Min; +    lr.name = "Min"; +    EXPECT_EQ(mExpected60Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.vote = LayerVoteType::Max; +    lr.name = "Max"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.desiredRefreshRate = Fps(90.0f); +    lr.vote = LayerVoteType::Heuristic; +    lr.name = "90Hz Heuristic"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.desiredRefreshRate = Fps(60.0f); +    lr.name = "60Hz Heuristic"; +    EXPECT_EQ(mExpected60Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.desiredRefreshRate = Fps(45.0f); +    lr.name = "45Hz Heuristic"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.desiredRefreshRate = Fps(30.0f); +    lr.name = "30Hz Heuristic"; +    EXPECT_EQ(mExpected60Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr.desiredRefreshRate = Fps(24.0f); +    lr.name = "24Hz Heuristic"; +    EXPECT_EQ(mExpected60Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); +} +  TEST_F(RefreshRateConfigsTest, getBestRefreshRate_60_72_90) {      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m60_72_90Device, @@ -649,6 +696,99 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes) {                refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}));  } +TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60_90_120_DifferentTypes_multipleThreshold) { +    RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120}; +    auto refreshRateConfigs = +            std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, +                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, config); + +    auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}, +                                                LayerRequirement{.weight = 1.0f}}; +    auto& lr1 = layers[0]; +    auto& lr2 = layers[1]; + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitDefault; +    lr1.name = "24Hz ExplicitDefault"; +    lr2.desiredRefreshRate = Fps(60.0f); +    lr2.vote = LayerVoteType::Heuristic; +    lr2.name = "60Hz Heuristic"; +    EXPECT_EQ(mExpected120Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr1.name = "24Hz ExplicitExactOrMultiple"; +    lr2.desiredRefreshRate = Fps(60.0f); +    lr2.vote = LayerVoteType::Heuristic; +    lr2.name = "60Hz Heuristic"; +    EXPECT_EQ(mExpected60Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr1.name = "24Hz ExplicitExactOrMultiple"; +    lr2.desiredRefreshRate = Fps(60.0f); +    lr2.vote = LayerVoteType::ExplicitDefault; +    lr2.name = "60Hz ExplicitDefault"; +    EXPECT_EQ(mExpected72Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr1.name = "24Hz ExplicitExactOrMultiple"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::Heuristic; +    lr2.name = "90Hz Heuristic"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr1.name = "24Hz ExplicitExactOrMultiple"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::ExplicitDefault; +    lr2.name = "90Hz Heuristic"; +    EXPECT_EQ(mExpected72Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitDefault; +    lr1.name = "24Hz ExplicitDefault"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::Heuristic; +    lr2.name = "90Hz Heuristic"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::Heuristic; +    lr1.name = "24Hz Heuristic"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::ExplicitDefault; +    lr2.name = "90Hz ExplicitDefault"; +    EXPECT_EQ(mExpected72Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr1.name = "24Hz ExplicitExactOrMultiple"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::ExplicitDefault; +    lr2.name = "90Hz ExplicitDefault"; +    EXPECT_EQ(mExpected72Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); + +    lr1.desiredRefreshRate = Fps(24.0f); +    lr1.vote = LayerVoteType::ExplicitDefault; +    lr1.name = "24Hz ExplicitDefault"; +    lr2.desiredRefreshRate = Fps(90.0f); +    lr2.vote = LayerVoteType::ExplicitExactOrMultiple; +    lr2.name = "90Hz ExplicitExactOrMultiple"; +    EXPECT_EQ(mExpected90Config, +              refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false})); +} +  TEST_F(RefreshRateConfigsTest, getBestRefreshRate_30_60) {      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60Device, @@ -819,6 +959,24 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo) {      }  } +TEST_F(RefreshRateConfigsTest, getBestRefreshRate_24FpsVideo_multipleThreshold_60_120) { +    RefreshRateConfigs::Config config = {.frameRateMultipleThreshold = 120}; +    auto refreshRateConfigs = +            std::make_unique<RefreshRateConfigs>(m60_120Device, +                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, config); + +    auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}}; +    auto& lr = layers[0]; + +    lr.vote = LayerVoteType::ExplicitExactOrMultiple; +    for (float fps = 23.0f; fps < 25.0f; fps += 0.1f) { +        lr.desiredRefreshRate = Fps(fps); +        const auto& refreshRate = +                refreshRateConfigs->getBestRefreshRate(layers, {.touch = false, .idle = false}); +        EXPECT_EQ(mExpected60Config, refreshRate) << fps << "Hz chooses " << refreshRate.getName(); +    } +} +  TEST_F(RefreshRateConfigsTest, twoDeviceConfigs_getBestRefreshRate_Explicit) {      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m60_90Device, @@ -1732,10 +1890,10 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExact) {  }  TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactEnableFrameRateOverride) { +    RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, -                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, -                                                 /*enableFrameRateOverride=*/true); +                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, config);      auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},                                                  LayerRequirement{.weight = 0.5f}}; @@ -1846,10 +2004,10 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_WritesCache) {  }  TEST_F(RefreshRateConfigsTest, getBestRefreshRate_ExplicitExactTouchBoost) { +    RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m60_120Device, -                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, -                                                 /*enableFrameRateOverride=*/true); +                                                 /*currentConfigId=*/HWC_CONFIG_ID_60, config);      auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f},                                                  LayerRequirement{.weight = 0.5f}}; @@ -1908,6 +2066,35 @@ TEST_F(RefreshRateConfigsTest, testKernelIdleTimerAction) {      EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction());  } +TEST_F(RefreshRateConfigsTest, testKernelIdleTimerActionFor120Hz) { +    using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction; + +    // Tests with 120Hz +    auto refreshRateConfigs = +            std::make_unique<RefreshRateConfigs>(m60_120Device, +                                                 /*currentConfigId=*/HWC_CONFIG_ID_120); +    // SetPolicy(0, 60), current 60Hz => TurnOn. +    ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(0), Fps(60)}}), +              0); +    EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction()); + +    // SetPolicy(60, 60), current 60Hz => TurnOff. +    ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(60)}}), +              0); +    EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction()); + +    // SetPolicy(60, 120), current 60Hz => TurnOn. +    ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {Fps(60), Fps(120)}}), +              0); +    EXPECT_EQ(KernelIdleTimerAction::TurnOn, refreshRateConfigs->getIdleTimerAction()); + +    // SetPolicy(120, 120), current 120Hz => TurnOff. +    ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy( +                      {HWC_CONFIG_ID_120, {Fps(120), Fps(120)}}), +              0); +    EXPECT_EQ(KernelIdleTimerAction::TurnOff, refreshRateConfigs->getIdleTimerAction()); +} +  TEST_F(RefreshRateConfigsTest, getFrameRateDivider) {      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, @@ -1950,10 +2137,10 @@ TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_noLayers) {  }  TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) { +    RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/ -                                                 HWC_CONFIG_ID_120, -                                                 /*enableFrameRateOverride=*/true); +                                                 HWC_CONFIG_ID_120, config);      auto layers = std::vector<LayerRequirement>{LayerRequirement{.weight = 1.0f}};      layers[0].name = "Test layer"; @@ -1995,10 +2182,10 @@ TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_60on120) {  }  TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) { +    RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/ -                                                 HWC_CONFIG_ID_120, -                                                 /*enableFrameRateOverride=*/true); +                                                 HWC_CONFIG_ID_120, config);      auto layers = std::vector<LayerRequirement>{              LayerRequirement{.ownerUid = 1234, .weight = 1.0f}, @@ -2035,10 +2222,10 @@ TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_twoUids) {  }  TEST_F(RefreshRateConfigsTest, getFrameRateOverrides_touch) { +    RefreshRateConfigs::Config config = {.enableFrameRateOverride = true};      auto refreshRateConfigs =              std::make_unique<RefreshRateConfigs>(m30_60_72_90_120Device, /*currentConfigId=*/ -                                                 HWC_CONFIG_ID_120, -                                                 /*enableFrameRateOverride=*/true); +                                                 HWC_CONFIG_ID_120, config);      auto layers = std::vector<LayerRequirement>{              LayerRequirement{.ownerUid = 1234, .weight = 1.0f}, diff --git a/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp b/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp index 1ed52ea389..2761470c31 100644 --- a/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp +++ b/services/surfaceflinger/tests/unittests/SetFrameRateTest.cpp @@ -485,5 +485,40 @@ TEST_P(SetFrameRateTest, SetOnParentActivatesTree) {      EXPECT_TRUE(FRAME_RATE_VOTE1.rate.equalsWithMargin(layerHistorySummary[1].desiredRefreshRate));  } +TEST_P(SetFrameRateTest, addChildForParentWithTreeVote) { +    EXPECT_CALL(*mMessageQueue, invalidate()).Times(1); + +    const auto& layerFactory = GetParam(); + +    const auto parent = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); +    const auto child1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); +    const auto child2 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); +    const auto childOfChild1 = mLayers.emplace_back(layerFactory->createLayer(mFlinger)); + +    addChild(parent, child1); +    addChild(child1, childOfChild1); + +    childOfChild1->setFrameRate(FRAME_RATE_VOTE1); +    commitTransaction(); +    EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree()); + +    addChild(parent, child2); +    commitTransaction(); +    EXPECT_EQ(FRAME_RATE_TREE, parent->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_TREE, child1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_VOTE1, childOfChild1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree()); + +    childOfChild1->setFrameRate(FRAME_RATE_NO_VOTE); +    commitTransaction(); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, parent->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, child1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, childOfChild1->getFrameRateForLayerTree()); +    EXPECT_EQ(FRAME_RATE_NO_VOTE, child2->getFrameRateForLayerTree()); +} +  } // namespace  } // namespace android diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h index 7f6e05ec9f..cf67593174 100644 --- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h @@ -230,7 +230,8 @@ public:                  std::make_unique<scheduler::RefreshRateStats>(*mFlinger->mTimeStats, currFps,                                                                /*powerMode=*/hal::PowerMode::OFF);          mFlinger->mVsyncConfiguration = mFactory.createVsyncConfiguration(currFps); -        mFlinger->mVsyncModulator.emplace(mFlinger->mVsyncConfiguration->getCurrentConfigs()); +        mFlinger->mVsyncModulator = sp<scheduler::VsyncModulator>::make( +                mFlinger->mVsyncConfiguration->getCurrentConfigs());          mScheduler = new TestableScheduler(std::move(vsyncController), std::move(vsyncTracker),                                             *mFlinger->mRefreshRateConfigs, *(callback ?: this)); diff --git a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp index d59d64bc02..ddc02bfbe6 100644 --- a/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp +++ b/services/surfaceflinger/tests/unittests/VSyncDispatchTimerQueueTest.cpp @@ -942,6 +942,27 @@ TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFutureWithReadyDuration) {      EXPECT_THAT(cb.mReadyTime[0], 970);  } +TEST_F(VSyncDispatchTimerQueueTest, updatesVsyncTimeForCloseWakeupTime) { +    Sequence seq; +    EXPECT_CALL(mMockClock, alarmAt(_, 600)).InSequence(seq); + +    CountingCallback cb(mDispatch); + +    mDispatch.schedule(cb, {.workDuration = 400, .readyDuration = 0, .earliestVsync = 1000}); +    mDispatch.schedule(cb, {.workDuration = 1400, .readyDuration = 0, .earliestVsync = 1000}); + +    advanceToNextCallback(); + +    advanceToNextCallback(); + +    ASSERT_THAT(cb.mCalls.size(), Eq(1)); +    EXPECT_THAT(cb.mCalls[0], Eq(2000)); +    ASSERT_THAT(cb.mWakeupTime.size(), Eq(1)); +    EXPECT_THAT(cb.mWakeupTime[0], Eq(600)); +    ASSERT_THAT(cb.mReadyTime.size(), Eq(1)); +    EXPECT_THAT(cb.mReadyTime[0], Eq(2000)); +} +  class VSyncDispatchTimerQueueEntryTest : public testing::Test {  protected:      nsecs_t const mPeriod = 1000; diff --git a/services/surfaceflinger/tests/unittests/VsyncModulatorTest.cpp b/services/surfaceflinger/tests/unittests/VsyncModulatorTest.cpp index 60952bfa2f..b5195826b1 100644 --- a/services/surfaceflinger/tests/unittests/VsyncModulatorTest.cpp +++ b/services/surfaceflinger/tests/unittests/VsyncModulatorTest.cpp @@ -14,6 +14,7 @@   * limitations under the License.   */ +#include <binder/Binder.h>  #include <gmock/gmock.h>  #include <gtest/gtest.h> @@ -21,6 +22,13 @@  namespace android::scheduler { +class TestableVsyncModulator : public VsyncModulator { +public: +    TestableVsyncModulator(const VsyncConfigSet& config, Now now) : VsyncModulator(config, now) {} + +    void binderDied(const wp<IBinder>& token) { VsyncModulator::binderDied(token); } +}; +  class VsyncModulatorTest : public testing::Test {      enum {          SF_OFFSET_LATE, @@ -60,30 +68,31 @@ protected:      const VsyncModulator::VsyncConfigSet mOffsets = {kEarly, kEarlyGpu, kLate,                                                       nanos(HWC_MIN_WORK_DURATION)}; -    VsyncModulator mVsyncModulator{mOffsets, Now}; +    sp<TestableVsyncModulator> mVsyncModulator = sp<TestableVsyncModulator>::make(mOffsets, Now); -    void SetUp() override { EXPECT_EQ(kLate, mVsyncModulator.setVsyncConfigSet(mOffsets)); } +    void SetUp() override { EXPECT_EQ(kLate, mVsyncModulator->setVsyncConfigSet(mOffsets)); }  }; -#define CHECK_COMMIT(result, configs)                         \ -    EXPECT_EQ(result, mVsyncModulator.onTransactionCommit()); \ -    EXPECT_EQ(configs, mVsyncModulator.getVsyncConfig()); +#define CHECK_COMMIT(result, configs)                          \ +    EXPECT_EQ(result, mVsyncModulator->onTransactionCommit()); \ +    EXPECT_EQ(configs, mVsyncModulator->getVsyncConfig()); -#define CHECK_REFRESH(N, result, configs)                           \ -    for (int i = 0; i < N; i++) {                                   \ -        EXPECT_EQ(result, mVsyncModulator.onDisplayRefresh(false)); \ -        EXPECT_EQ(configs, mVsyncModulator.getVsyncConfig());       \ +#define CHECK_REFRESH(N, result, configs)                            \ +    for (int i = 0; i < N; i++) {                                    \ +        EXPECT_EQ(result, mVsyncModulator->onDisplayRefresh(false)); \ +        EXPECT_EQ(configs, mVsyncModulator->getVsyncConfig());       \      }  TEST_F(VsyncModulatorTest, Late) { -    EXPECT_FALSE(mVsyncModulator.setTransactionSchedule(Schedule::Late)); +    EXPECT_FALSE(mVsyncModulator->setTransactionSchedule(Schedule::Late));      CHECK_COMMIT(std::nullopt, kLate);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kLate);  }  TEST_F(VsyncModulatorTest, EarlyEnd) { -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); @@ -91,12 +100,13 @@ TEST_F(VsyncModulatorTest, EarlyEnd) {  }  TEST_F(VsyncModulatorTest, EarlyStart) { -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyStart)); +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); @@ -104,16 +114,17 @@ TEST_F(VsyncModulatorTest, EarlyStart) {  }  TEST_F(VsyncModulatorTest, EarlyStartWithMoreTransactions) { -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyStart)); +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token));      CHECK_COMMIT(kEarly, kEarly);      for (int i = 0; i < 5 * MIN_EARLY_TRANSACTION_FRAMES; i++) { -        EXPECT_FALSE(mVsyncModulator.setTransactionSchedule(Schedule::Late)); +        EXPECT_FALSE(mVsyncModulator->setTransactionSchedule(Schedule::Late));          CHECK_REFRESH(1, std::nullopt, kEarly);      } -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); @@ -121,18 +132,19 @@ TEST_F(VsyncModulatorTest, EarlyStartWithMoreTransactions) {  }  TEST_F(VsyncModulatorTest, EarlyStartAfterEarlyEnd) { -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyStart)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(1, kEarly, kEarly);      CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); @@ -140,26 +152,64 @@ TEST_F(VsyncModulatorTest, EarlyStartAfterEarlyEnd) {  }  TEST_F(VsyncModulatorTest, EarlyStartAfterEarlyEndWithMoreTransactions) { -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyStart)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(1, kEarly, kEarly);      for (int i = 0; i < 5 * MIN_EARLY_TRANSACTION_FRAMES; i++) { -        EXPECT_FALSE(mVsyncModulator.setTransactionSchedule(Schedule::Late)); +        EXPECT_FALSE(mVsyncModulator->setTransactionSchedule(Schedule::Late));          CHECK_REFRESH(1, std::nullopt, kEarly);      } -    EXPECT_EQ(kEarly, mVsyncModulator.setTransactionSchedule(Schedule::EarlyEnd)); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token));      CHECK_COMMIT(kEarly, kEarly);      CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly);      CHECK_REFRESH(1, kLate, kLate);  } +TEST_F(VsyncModulatorTest, EarlyStartDifferentClients) { +    const auto token1 = sp<BBinder>::make(); +    const auto token2 = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token1)); + +    CHECK_COMMIT(kEarly, kEarly); +    CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); + +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token2)); + +    CHECK_COMMIT(kEarly, kEarly); +    CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); + +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token1)); + +    CHECK_COMMIT(kEarly, kEarly); +    CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); + +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyEnd, token2)); + +    CHECK_COMMIT(kEarly, kEarly); +    CHECK_REFRESH(MIN_EARLY_TRANSACTION_FRAMES - 1, kEarly, kEarly); +    CHECK_REFRESH(1, kLate, kLate); +} + +TEST_F(VsyncModulatorTest, EarlyStartWithBinderDeath) { +    const auto token = sp<BBinder>::make(); +    EXPECT_EQ(kEarly, mVsyncModulator->setTransactionSchedule(Schedule::EarlyStart, token)); + +    CHECK_COMMIT(kEarly, kEarly); +    CHECK_REFRESH(5 * MIN_EARLY_TRANSACTION_FRAMES, std::nullopt, kEarly); + +    mVsyncModulator->binderDied(token); + +    CHECK_COMMIT(std::nullopt, kLate); +} +  } // namespace android::scheduler diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockPowerAdvisor.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockPowerAdvisor.h index 7450b5dfa4..159bdf1c01 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockPowerAdvisor.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockPowerAdvisor.h @@ -27,8 +27,10 @@ public:      PowerAdvisor();      ~PowerAdvisor() override; +    MOCK_METHOD0(init, void());      MOCK_METHOD0(onBootFinished, void());      MOCK_METHOD2(setExpensiveRenderingExpected, void(DisplayId displayId, bool expected)); +    MOCK_METHOD0(isUsingExpensiveRendering, bool());      MOCK_METHOD0(notifyDisplayUpdateImminent, void());  };  |