1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2021 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_LIBARTBASE_BASE_FLAGS_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_FLAGS_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <forward_list> 21*795d594fSAndroid Build Coastguard Worker #include <optional> 22*795d594fSAndroid Build Coastguard Worker #include <string> 23*795d594fSAndroid Build Coastguard Worker #include <variant> 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker #include "logging.h" 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker // This file defines a set of flags that can be used to enable/disable features within ART or 28*795d594fSAndroid Build Coastguard Worker // otherwise tune ART's behavior. Flags can be set through command line options, server side 29*795d594fSAndroid Build Coastguard Worker // configuration, system properties, or default values. This flexibility enables easier development 30*795d594fSAndroid Build Coastguard Worker // and also larger experiments. 31*795d594fSAndroid Build Coastguard Worker // 32*795d594fSAndroid Build Coastguard Worker // The value is retrieved in the following oder: 33*795d594fSAndroid Build Coastguard Worker // 1) server side (device config) property 34*795d594fSAndroid Build Coastguard Worker // 2) system property 35*795d594fSAndroid Build Coastguard Worker // 3) cmdline flag 36*795d594fSAndroid Build Coastguard Worker // 4) default value 37*795d594fSAndroid Build Coastguard Worker // 38*795d594fSAndroid Build Coastguard Worker // The flags are defined in the Flags struct near the bottom of the file. To define a new flag, add 39*795d594fSAndroid Build Coastguard Worker // a Flag field to the struct. Then to read the value of the flag, use gFlag.MyNewFlag(). 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic push 42*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic error "-Wconversion" 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker namespace art { 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker // Enum representing the type of the ART flag. 47*795d594fSAndroid Build Coastguard Worker enum class FlagType { 48*795d594fSAndroid Build Coastguard Worker // A flag that only looks at the cmdline argument to retrieve its value. 49*795d594fSAndroid Build Coastguard Worker kCmdlineOnly, 50*795d594fSAndroid Build Coastguard Worker // A flag that also looks at system properties and device config 51*795d594fSAndroid Build Coastguard Worker // (phenotype properties) when retrieving its value. 52*795d594fSAndroid Build Coastguard Worker kDeviceConfig, 53*795d594fSAndroid Build Coastguard Worker }; 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker // FlagMetaBase handles automatically adding flags to the command line parser. It is parameterized 56*795d594fSAndroid Build Coastguard Worker // by all supported flag types. In general, this should be treated as though it does not exist and 57*795d594fSAndroid Build Coastguard Worker // FlagBase, which is already specialized to the types we support, should be used instead. 58*795d594fSAndroid Build Coastguard Worker template <typename... T> 59*795d594fSAndroid Build Coastguard Worker class FlagMetaBase { 60*795d594fSAndroid Build Coastguard Worker public: FlagMetaBase(const std::string && command_line_argument_name,const std::string && system_property_name,const std::string && server_setting_name,FlagType type)61*795d594fSAndroid Build Coastguard Worker FlagMetaBase(const std::string&& command_line_argument_name, 62*795d594fSAndroid Build Coastguard Worker const std::string&& system_property_name, 63*795d594fSAndroid Build Coastguard Worker const std::string&& server_setting_name, 64*795d594fSAndroid Build Coastguard Worker FlagType type) : 65*795d594fSAndroid Build Coastguard Worker command_line_argument_name_(command_line_argument_name), 66*795d594fSAndroid Build Coastguard Worker system_property_name_(system_property_name), 67*795d594fSAndroid Build Coastguard Worker server_setting_name_(server_setting_name), 68*795d594fSAndroid Build Coastguard Worker type_(type) {} ~FlagMetaBase()69*795d594fSAndroid Build Coastguard Worker virtual ~FlagMetaBase() {} 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker template <typename Builder> AddFlagsToCmdlineParser(Builder * builder)72*795d594fSAndroid Build Coastguard Worker static void AddFlagsToCmdlineParser(Builder* builder) { 73*795d594fSAndroid Build Coastguard Worker for (auto* flag : ALL_FLAGS) { 74*795d594fSAndroid Build Coastguard Worker // Each flag can return a pointer to where its command line value is stored. Because these can 75*795d594fSAndroid Build Coastguard Worker // be different types, the return value comes as a variant. The cases list below contains a 76*795d594fSAndroid Build Coastguard Worker // lambda that is specialized to handle each branch of the variant and call the correct 77*795d594fSAndroid Build Coastguard Worker // methods on the command line parser builder. 78*795d594fSAndroid Build Coastguard Worker FlagValuePointer location = flag->GetCmdLineLocation(); 79*795d594fSAndroid Build Coastguard Worker auto cases = {std::function<void()>([&]() { 80*795d594fSAndroid Build Coastguard Worker if (std::holds_alternative<std::optional<T>*>(location)) { 81*795d594fSAndroid Build Coastguard Worker builder = &builder->Define(flag->command_line_argument_name_.c_str()) 82*795d594fSAndroid Build Coastguard Worker .template WithType<T>() 83*795d594fSAndroid Build Coastguard Worker .IntoLocation(std::get<std::optional<T>*>(location)); 84*795d594fSAndroid Build Coastguard Worker } 85*795d594fSAndroid Build Coastguard Worker })...}; 86*795d594fSAndroid Build Coastguard Worker for (auto c : cases) { 87*795d594fSAndroid Build Coastguard Worker c(); 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker // Reload the value of the flags. 93*795d594fSAndroid Build Coastguard Worker // 94*795d594fSAndroid Build Coastguard Worker // DO NOT CALL this outside Runtime Init or Zygote post fork. 95*795d594fSAndroid Build Coastguard Worker // This is a convention, as we should strive to have a constant view 96*795d594fSAndroid Build Coastguard Worker // of the flags and not change the runtime behaviour midway during execution. ReloadAllFlags(const std::string & caller)97*795d594fSAndroid Build Coastguard Worker static void ReloadAllFlags(const std::string& caller) { 98*795d594fSAndroid Build Coastguard Worker // Check the caller. This is a simple workaround to attract the attention 99*795d594fSAndroid Build Coastguard Worker // to a possible dangerous call to ReloadAllFlags, while avoid building 100*795d594fSAndroid Build Coastguard Worker // a lot of infra for it or having a complex friend definition. 101*795d594fSAndroid Build Coastguard Worker DCHECK(caller == "Init" 102*795d594fSAndroid Build Coastguard Worker || caller == "ZygoteHooks_nativePostForkChild" 103*795d594fSAndroid Build Coastguard Worker || caller == "ZygoteHooks_nativePostForkSystemServer" 104*795d594fSAndroid Build Coastguard Worker || caller == "test") << caller; 105*795d594fSAndroid Build Coastguard Worker for (auto* flag : ALL_FLAGS) { 106*795d594fSAndroid Build Coastguard Worker flag->Reload(); 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker if (VLOG_IS_ON(startup)) { 110*795d594fSAndroid Build Coastguard Worker VLOG_STREAM(startup) << "Dumping flags for " << caller; 111*795d594fSAndroid Build Coastguard Worker DumpFlags(VLOG_STREAM(startup)); 112*795d594fSAndroid Build Coastguard Worker } 113*795d594fSAndroid Build Coastguard Worker } 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker // Dump all the flags info to the given stream. DumpFlags(std::ostream & oss)116*795d594fSAndroid Build Coastguard Worker static void DumpFlags(std::ostream& oss) { 117*795d594fSAndroid Build Coastguard Worker for (auto* flag : ALL_FLAGS) { 118*795d594fSAndroid Build Coastguard Worker oss << "\n{\n"; 119*795d594fSAndroid Build Coastguard Worker flag->Dump(oss); 120*795d594fSAndroid Build Coastguard Worker oss << "\n}"; 121*795d594fSAndroid Build Coastguard Worker } 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker protected: 125*795d594fSAndroid Build Coastguard Worker using FlagValuePointer = std::variant<std::optional<T>*...>; 126*795d594fSAndroid Build Coastguard Worker // Return the pointer to the value holder associated with the cmd line location. 127*795d594fSAndroid Build Coastguard Worker virtual FlagValuePointer GetCmdLineLocation() = 0; 128*795d594fSAndroid Build Coastguard Worker // Reloads the flag values. 129*795d594fSAndroid Build Coastguard Worker virtual void Reload() = 0; 130*795d594fSAndroid Build Coastguard Worker // Dumps the flags info to the given stream. 131*795d594fSAndroid Build Coastguard Worker virtual void Dump(std::ostream& oss) const = 0; 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker static std::forward_list<FlagMetaBase<T...>*> ALL_FLAGS; 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker const std::string command_line_argument_name_; 136*795d594fSAndroid Build Coastguard Worker const std::string system_property_name_; 137*795d594fSAndroid Build Coastguard Worker const std::string server_setting_name_; 138*795d594fSAndroid Build Coastguard Worker FlagType type_; 139*795d594fSAndroid Build Coastguard Worker }; 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker using FlagBase = FlagMetaBase<bool, int32_t, uint32_t, std::string>; 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker template <> 144*795d594fSAndroid Build Coastguard Worker std::forward_list<FlagBase*> FlagBase::ALL_FLAGS; 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker class FlagsTests; 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker // Describes the possible origins of a flag value. 149*795d594fSAndroid Build Coastguard Worker enum class FlagOrigin { 150*795d594fSAndroid Build Coastguard Worker kDefaultValue, 151*795d594fSAndroid Build Coastguard Worker kCmdlineArg, 152*795d594fSAndroid Build Coastguard Worker kSystemProperty, 153*795d594fSAndroid Build Coastguard Worker kServerSetting, 154*795d594fSAndroid Build Coastguard Worker }; 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker // This class defines a flag with a value of a particular type. 157*795d594fSAndroid Build Coastguard Worker template <typename Value> 158*795d594fSAndroid Build Coastguard Worker class Flag : public FlagBase { 159*795d594fSAndroid Build Coastguard Worker public: 160*795d594fSAndroid Build Coastguard Worker // Create a new Flag. The name parameter is used to generate the names from the various parameter 161*795d594fSAndroid Build Coastguard Worker // sources. See the documentation on the Flags struct for an example. 162*795d594fSAndroid Build Coastguard Worker Flag(const std::string& name, Value default_value, FlagType type); 163*795d594fSAndroid Build Coastguard Worker virtual ~Flag(); 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker // Returns the flag value. 167*795d594fSAndroid Build Coastguard Worker // 168*795d594fSAndroid Build Coastguard Worker // The value is retrieved in the following oder: 169*795d594fSAndroid Build Coastguard Worker // 1) server side (device config) property 170*795d594fSAndroid Build Coastguard Worker // 2) system property 171*795d594fSAndroid Build Coastguard Worker // 3) cmdline flag 172*795d594fSAndroid Build Coastguard Worker // 4) default value GetValue()173*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE Value GetValue() const { 174*795d594fSAndroid Build Coastguard Worker return std::get<0>(GetValueAndOrigin()); 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker operator()177*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE Value operator()() const { 178*795d594fSAndroid Build Coastguard Worker return GetValue(); 179*795d594fSAndroid Build Coastguard Worker } 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker // Return the value of the flag as optional. 182*795d594fSAndroid Build Coastguard Worker // 183*795d594fSAndroid Build Coastguard Worker // Returns the value of the flag if and only if the flag is set via 184*795d594fSAndroid Build Coastguard Worker // a server side setting, system property or a cmdline arg. 185*795d594fSAndroid Build Coastguard Worker // Otherwise it returns nullopt (meaning this never returns the default value). 186*795d594fSAndroid Build Coastguard Worker // 187*795d594fSAndroid Build Coastguard Worker // This is useful for properties that do not have a good default natural value 188*795d594fSAndroid Build Coastguard Worker // (e.g. file path arguments). GetValueOptional()189*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE std::optional<Value> GetValueOptional() const { 190*795d594fSAndroid Build Coastguard Worker std::pair<Value, FlagOrigin> result = GetValueAndOrigin(); 191*795d594fSAndroid Build Coastguard Worker return std::get<1>(result) == FlagOrigin::kDefaultValue 192*795d594fSAndroid Build Coastguard Worker ? std::nullopt 193*795d594fSAndroid Build Coastguard Worker : std::make_optional(std::get<0>(result)); 194*795d594fSAndroid Build Coastguard Worker } 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker // Returns the value and the origin of that value for the given flag. GetValueAndOrigin()197*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE std::pair<Value, FlagOrigin> GetValueAndOrigin() const { 198*795d594fSAndroid Build Coastguard Worker DCHECK(initialized_); 199*795d594fSAndroid Build Coastguard Worker if (from_server_setting_.has_value()) { 200*795d594fSAndroid Build Coastguard Worker return std::pair{from_server_setting_.value(), FlagOrigin::kServerSetting}; 201*795d594fSAndroid Build Coastguard Worker } 202*795d594fSAndroid Build Coastguard Worker if (from_system_property_.has_value()) { 203*795d594fSAndroid Build Coastguard Worker return std::pair{from_system_property_.value(), FlagOrigin::kSystemProperty}; 204*795d594fSAndroid Build Coastguard Worker } 205*795d594fSAndroid Build Coastguard Worker if (from_command_line_.has_value()) { 206*795d594fSAndroid Build Coastguard Worker return std::pair{from_command_line_.value(), FlagOrigin::kCmdlineArg}; 207*795d594fSAndroid Build Coastguard Worker } 208*795d594fSAndroid Build Coastguard Worker return std::pair{default_, FlagOrigin::kDefaultValue}; 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker void Dump(std::ostream& oss) const override; 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker protected: GetCmdLineLocation()214*795d594fSAndroid Build Coastguard Worker FlagValuePointer GetCmdLineLocation() override { return &from_command_line_; } 215*795d594fSAndroid Build Coastguard Worker 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker // Reload the server-configured value and system property values. In general this should not be 218*795d594fSAndroid Build Coastguard Worker // used directly, but it can be used to support reloading the value without restarting the device. 219*795d594fSAndroid Build Coastguard Worker void Reload() override; 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker private: 222*795d594fSAndroid Build Coastguard Worker bool initialized_; 223*795d594fSAndroid Build Coastguard Worker const Value default_; 224*795d594fSAndroid Build Coastguard Worker std::optional<Value> from_command_line_; 225*795d594fSAndroid Build Coastguard Worker std::optional<Value> from_system_property_; 226*795d594fSAndroid Build Coastguard Worker std::optional<Value> from_server_setting_; 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker friend class TestFlag; 229*795d594fSAndroid Build Coastguard Worker }; 230*795d594fSAndroid Build Coastguard Worker 231*795d594fSAndroid Build Coastguard Worker // This struct contains the list of ART flags. Flags are parameterized by the type of value they 232*795d594fSAndroid Build Coastguard Worker // support (bool, int, string, etc.). In addition to field name, flags have a name for the parameter 233*795d594fSAndroid Build Coastguard Worker // as well. 234*795d594fSAndroid Build Coastguard Worker // 235*795d594fSAndroid Build Coastguard Worker // Example: 236*795d594fSAndroid Build Coastguard Worker // 237*795d594fSAndroid Build Coastguard Worker // Flag<int> WriteMetricsToLog{"my-feature-test.flag", 42, FlagType::kDeviceConfig}; 238*795d594fSAndroid Build Coastguard Worker // 239*795d594fSAndroid Build Coastguard Worker // This creates an integer flag that can be read through gFlags.WriteMetricsToLog(). The default 240*795d594fSAndroid Build Coastguard Worker // value is 42. Note that the default value can be left unspecified, in which case the value of the 241*795d594fSAndroid Build Coastguard Worker // type's default constructor will be used. 242*795d594fSAndroid Build Coastguard Worker // 243*795d594fSAndroid Build Coastguard Worker // The flag can be set through the following generated means: 244*795d594fSAndroid Build Coastguard Worker // 245*795d594fSAndroid Build Coastguard Worker // Command Line: 246*795d594fSAndroid Build Coastguard Worker // 247*795d594fSAndroid Build Coastguard Worker // -Xmy-feature-test-flag=1 248*795d594fSAndroid Build Coastguard Worker // 249*795d594fSAndroid Build Coastguard Worker // Server Side (Phenotype) Configuration: 250*795d594fSAndroid Build Coastguard Worker // 251*795d594fSAndroid Build Coastguard Worker // persist.device_config.runtime_native.my-feature-test.flag 252*795d594fSAndroid Build Coastguard Worker // 253*795d594fSAndroid Build Coastguard Worker // System Property: 254*795d594fSAndroid Build Coastguard Worker // 255*795d594fSAndroid Build Coastguard Worker // setprop dalvik.vm.metrics.my-feature-test.flag 2 256*795d594fSAndroid Build Coastguard Worker struct Flags { 257*795d594fSAndroid Build Coastguard Worker // Flag used to test the infra. 258*795d594fSAndroid Build Coastguard Worker // TODO: can be removed once we add real flags. 259*795d594fSAndroid Build Coastguard Worker Flag<int32_t> MyFeatureTestFlag{"my-feature-test.flag", 42, FlagType::kDeviceConfig}; 260*795d594fSAndroid Build Coastguard Worker 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker // Metric infra flags. 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker // The reporting spec for regular apps. An example of valid value is "S,1,2,4,*". 265*795d594fSAndroid Build Coastguard Worker // See metrics::ReportingPeriodSpec for complete docs. 266*795d594fSAndroid Build Coastguard Worker Flag<std::string> MetricsReportingSpec{ 267*795d594fSAndroid Build Coastguard Worker "metrics.reporting-spec", "1,5,30,60,600", FlagType::kDeviceConfig}; 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker // The reporting spec for the system server. See MetricsReportingSpec as well. 270*795d594fSAndroid Build Coastguard Worker Flag<std::string> MetricsReportingSpecSystemServer{ 271*795d594fSAndroid Build Coastguard Worker "metrics.reporting-spec-server", "1,10,60,3600,*", FlagType::kDeviceConfig}; 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Worker // The mods that should report metrics. Together with MetricsReportingNumMods, they 274*795d594fSAndroid Build Coastguard Worker // dictate what percentage of the runtime execution will report metrics. 275*795d594fSAndroid Build Coastguard Worker // If the `session_id (a random number) % MetricsReportingNumMods < MetricsReportingMods` 276*795d594fSAndroid Build Coastguard Worker // then the runtime session will report metrics. 277*795d594fSAndroid Build Coastguard Worker // 278*795d594fSAndroid Build Coastguard Worker // By default, the mods are 2, which means that 2 out of #{reporting-num-mods} of Android sessions 279*795d594fSAndroid Build Coastguard Worker // will be reported (with the default values this is 2/100 = 2%). 280*795d594fSAndroid Build Coastguard Worker Flag<uint32_t> MetricsReportingMods{"metrics.reporting-mods", 2, FlagType::kDeviceConfig}; 281*795d594fSAndroid Build Coastguard Worker Flag<uint32_t> MetricsReportingModsServer{ 282*795d594fSAndroid Build Coastguard Worker "metrics.reporting-mods-server", 2, FlagType::kDeviceConfig}; 283*795d594fSAndroid Build Coastguard Worker 284*795d594fSAndroid Build Coastguard Worker // See MetricsReportingMods docs. 285*795d594fSAndroid Build Coastguard Worker // 286*795d594fSAndroid Build Coastguard Worker // By default the number of mods is 100, so MetricsReportingMods will naturally 287*795d594fSAndroid Build Coastguard Worker // read as the percent of runtime sessions that will report metrics. If a finer 288*795d594fSAndroid Build Coastguard Worker // grain unit is needed (e.g. a tenth of a percent), the num-mods can be increased. 289*795d594fSAndroid Build Coastguard Worker Flag<uint32_t> MetricsReportingNumMods{"metrics.reporting-num-mods", 100, 290*795d594fSAndroid Build Coastguard Worker FlagType::kDeviceConfig}; 291*795d594fSAndroid Build Coastguard Worker Flag<uint32_t> MetricsReportingNumModsServer{"metrics.reporting-num-mods-server", 100, 292*795d594fSAndroid Build Coastguard Worker FlagType::kDeviceConfig}; 293*795d594fSAndroid Build Coastguard Worker 294*795d594fSAndroid Build Coastguard Worker // Whether or not we should write metrics to statsd. 295*795d594fSAndroid Build Coastguard Worker // Note that the actual write is still controlled by 296*795d594fSAndroid Build Coastguard Worker // MetricsReportingMods and MetricsReportingNumMods. 297*795d594fSAndroid Build Coastguard Worker Flag<bool> MetricsWriteToStatsd{"metrics.write-to-statsd", true, FlagType::kDeviceConfig}; 298*795d594fSAndroid Build Coastguard Worker 299*795d594fSAndroid Build Coastguard Worker // Whether or not we should write metrics to logcat. 300*795d594fSAndroid Build Coastguard Worker // Note that the actual write is still controlled by 301*795d594fSAndroid Build Coastguard Worker // MetricsReportingMods and MetricsReportingNumMods. 302*795d594fSAndroid Build Coastguard Worker Flag<bool> MetricsWriteToLogcat{ "metrics.write-to-logcat", false, FlagType::kCmdlineOnly}; 303*795d594fSAndroid Build Coastguard Worker 304*795d594fSAndroid Build Coastguard Worker // Whether or not we should write metrics to a file. 305*795d594fSAndroid Build Coastguard Worker // Note that the actual write is still controlled by 306*795d594fSAndroid Build Coastguard Worker // MetricsReportingMods and MetricsReportingNumMods. 307*795d594fSAndroid Build Coastguard Worker Flag<std::string> MetricsWriteToFile{"metrics.write-to-file", "", FlagType::kCmdlineOnly}; 308*795d594fSAndroid Build Coastguard Worker 309*795d594fSAndroid Build Coastguard Worker // The output format for metrics. This is only used 310*795d594fSAndroid Build Coastguard Worker // when writing metrics to a file; metrics written 311*795d594fSAndroid Build Coastguard Worker // to logcat will be in human-readable text format. 312*795d594fSAndroid Build Coastguard Worker // Supported values are "text" and "xml". 313*795d594fSAndroid Build Coastguard Worker Flag<std::string> MetricsFormat{"metrics.format", "text", FlagType::kCmdlineOnly}; 314*795d594fSAndroid Build Coastguard Worker 315*795d594fSAndroid Build Coastguard Worker // Whether or not to force the metrics initialization. 316*795d594fSAndroid Build Coastguard Worker Flag<bool> MetricsForceEnable{"metrics.force-enable", false, FlagType::kCmdlineOnly}; 317*795d594fSAndroid Build Coastguard Worker }; 318*795d594fSAndroid Build Coastguard Worker 319*795d594fSAndroid Build Coastguard Worker // This is the actual instance of all the flags. 320*795d594fSAndroid Build Coastguard Worker extern Flags gFlags; 321*795d594fSAndroid Build Coastguard Worker 322*795d594fSAndroid Build Coastguard Worker } // namespace art 323*795d594fSAndroid Build Coastguard Worker 324*795d594fSAndroid Build Coastguard Worker #pragma clang diagnostic pop // -Wconversion 325*795d594fSAndroid Build Coastguard Worker 326*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBARTBASE_BASE_FLAGS_H_ 327