xref: /aosp_15_r20/art/libartbase/base/flags.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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