1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_COMPAT_FRAMEWORK_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_COMPAT_FRAMEWORK_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <set> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker // ART counterpart of the compat framework (go/compat-framework). 28*795d594fSAndroid Build Coastguard Worker // Created in order to avoid repeated up-calls to Java. 29*795d594fSAndroid Build Coastguard Worker class CompatFramework { 30*795d594fSAndroid Build Coastguard Worker public: 31*795d594fSAndroid Build Coastguard Worker // Compat change reported state 32*795d594fSAndroid Build Coastguard Worker // This must be kept in sync with AppCompatibilityChangeReported.State in 33*795d594fSAndroid Build Coastguard Worker // frameworks/proto_logging/stats/atoms.proto 34*795d594fSAndroid Build Coastguard Worker enum class ChangeState { 35*795d594fSAndroid Build Coastguard Worker kUnknown, 36*795d594fSAndroid Build Coastguard Worker kEnabled, 37*795d594fSAndroid Build Coastguard Worker kDisabled, 38*795d594fSAndroid Build Coastguard Worker kLogged 39*795d594fSAndroid Build Coastguard Worker }; 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker CompatFramework(); 42*795d594fSAndroid Build Coastguard Worker ~CompatFramework(); 43*795d594fSAndroid Build Coastguard Worker SetDisabledCompatChanges(const std::set<uint64_t> & disabled_changes)44*795d594fSAndroid Build Coastguard Worker void SetDisabledCompatChanges(const std::set<uint64_t>& disabled_changes) { 45*795d594fSAndroid Build Coastguard Worker disabled_compat_changes_ = disabled_changes; 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker GetDisabledCompatChanges()48*795d594fSAndroid Build Coastguard Worker const std::set<uint64_t>& GetDisabledCompatChanges() const { 49*795d594fSAndroid Build Coastguard Worker return disabled_compat_changes_; 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker // Query if a given compatibility change is enabled for the current process. 52*795d594fSAndroid Build Coastguard Worker // This also gets logged to logcat, and we add the information we logged in 53*795d594fSAndroid Build Coastguard Worker // reported_compat_changes_. This ensures we only log once per change id for the app's lifetime. 54*795d594fSAndroid Build Coastguard Worker bool IsChangeEnabled(uint64_t change_id); 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker // Logs that the code path for this compatibility change has been reached. 57*795d594fSAndroid Build Coastguard Worker // This also gets logged to logcat, and we add the information we logged in 58*795d594fSAndroid Build Coastguard Worker // reported_compat_changes_. This ensures we only log once per change id for the app's lifetime. 59*795d594fSAndroid Build Coastguard Worker void LogChange(uint64_t change_id); 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker private: 62*795d594fSAndroid Build Coastguard Worker // Get a string equivalent for a compatibility change state. 63*795d594fSAndroid Build Coastguard Worker static std::string_view ChangeStateToString(ChangeState s); 64*795d594fSAndroid Build Coastguard Worker // Report the state of a compatibility change to logcat. 65*795d594fSAndroid Build Coastguard Worker // TODO(145743810): also report to statsd. 66*795d594fSAndroid Build Coastguard Worker void ReportChange(uint64_t change_id, ChangeState state); 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker // A set of disabled compat changes for the running app, all other changes are enabled. 69*795d594fSAndroid Build Coastguard Worker std::set<uint64_t> disabled_compat_changes_; 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker // A set of reported compat changes for the running app. 72*795d594fSAndroid Build Coastguard Worker std::set<uint64_t> reported_compat_changes_ GUARDED_BY(reported_compat_changes_lock_); 73*795d594fSAndroid Build Coastguard Worker Mutex reported_compat_changes_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER; 74*795d594fSAndroid Build Coastguard Worker }; 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker } // namespace art 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker #endif // ART_RUNTIME_COMPAT_FRAMEWORK_H_ 79