Loading tools/aconfig/aconfig/src/codegen/java.rs +31 −10 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ pub struct JavaCodegenConfig { pub allow_instrumentation: bool, pub package_fingerprint: u64, pub new_exported: bool, pub single_exported_file: bool, pub check_api_level: bool, } Loading Loading @@ -71,8 +72,15 @@ where is_platform_container, package_fingerprint: format!("0x{:X}L", config.package_fingerprint), new_exported: config.new_exported, single_exported_file: config.single_exported_file, }; let mut template = TinyTemplate::new(); if library_exported && config.single_exported_file { template.add_template( "ExportedFlags.java", include_str!("../../templates/ExportedFlags.java.template"), )?; } template.add_template("Flags.java", include_str!("../../templates/Flags.java.template"))?; add_feature_flags_impl_template(&context, &mut template)?; template.add_template( Loading @@ -89,16 +97,23 @@ where )?; let path: PathBuf = package.split('.').collect(); [ let mut files = vec![ "Flags.java", "FeatureFlags.java", "FeatureFlagsImpl.java", "CustomFeatureFlags.java", "FakeFeatureFlagsImpl.java", ] ]; if library_exported && config.single_exported_file { files.push("ExportedFlags.java"); } files .iter() .map(|file| { Ok(OutputFile { contents: template.render(file, &context)?.into(), path: path.join(file) }) Ok(OutputFile { contents: template.render(file, &context)?.into(), path: path.join(file), }) }) .collect::<Result<Vec<OutputFile>>>() } Loading Loading @@ -138,6 +153,7 @@ struct Context { pub is_platform_container: bool, pub package_fingerprint: String, pub new_exported: bool, pub single_exported_file: bool, } #[derive(Serialize, Debug)] Loading Loading @@ -259,7 +275,7 @@ fn add_feature_flags_impl_template( (true, false, _) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), include_str!("../../templates/FeatureFlagsImpl.deviceConfig.java.template"), )?; } Loading @@ -275,7 +291,7 @@ fn add_feature_flags_impl_template( (false, _, false) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), include_str!("../../templates/FeatureFlagsImpl.deviceConfig.java.template"), )?; } }; Loading Loading @@ -592,6 +608,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -752,6 +769,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -956,6 +974,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: true, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -1022,7 +1041,7 @@ mod tests { } catch (LinkageError e) { // for mainline module running on older devices. // This should be replaces to version check, after the version bump. Log.e(TAG, e.toString()); Log.w(TAG, e.toString()); } isCached = true; } Loading Loading @@ -1150,6 +1169,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -1277,6 +1297,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading tools/aconfig/aconfig/src/commands.rs +2 −0 Original line number Diff line number Diff line Loading @@ -219,6 +219,7 @@ pub fn create_java_lib( codegen_mode: CodegenMode, allow_instrumentation: bool, new_exported: bool, single_exported_file: bool, check_api_level: bool, ) -> Result<Vec<OutputFile>> { let parsed_flags = input.try_parse_flags()?; Loading @@ -237,6 +238,7 @@ pub fn create_java_lib( allow_instrumentation, package_fingerprint, new_exported, single_exported_file, check_api_level, }; generate_java_code(&package, modified_parsed_flags.into_iter(), config) Loading tools/aconfig/aconfig/src/main.rs +11 −0 Original line number Diff line number Diff line Loading @@ -157,12 +157,20 @@ fn cli() -> Command { .value_parser(EnumValueParser::<CodegenMode>::new()) .default_value("production"), ) .arg( Arg::new("single-exported-file") .long("single-exported-file") .value_parser(clap::value_parser!(bool)) .default_value("false"), ) // TODO: b/395899938 - clean up flags for switching to new storage .arg( Arg::new("allow-instrumentation") .long("allow-instrumentation") .value_parser(clap::value_parser!(bool)) .default_value("false"), ) // TODO: b/395899938 - clean up flags for switching to new storage .arg( Arg::new("new-exported") .long("new-exported") Loading Loading @@ -373,12 +381,15 @@ fn main() -> Result<()> { let allow_instrumentation = get_required_arg::<bool>(sub_matches, "allow-instrumentation")?; let new_exported = get_required_arg::<bool>(sub_matches, "new-exported")?; let single_exported_file = get_required_arg::<bool>(sub_matches, "single-exported-file")?; let check_api_level = get_required_arg::<bool>(sub_matches, "check-api-level")?; let generated_files = commands::create_java_lib( cache, *mode, *allow_instrumentation, *new_exported, *single_exported_file, *check_api_level, ) .context("failed to create java lib")?; Loading tools/aconfig/aconfig/templates/CustomFeatureFlags.java.template +6 −0 Original line number Diff line number Diff line Loading @@ -11,7 +11,13 @@ import java.util.Set; import java.util.function.BiPredicate; import java.util.function.Predicate; {{ -if single_exported_file }} {{ -if library_exported }} @Deprecated {#- PREFER ExportedFlags #} {{ -endif }} {{ -else }} /** @hide */ {{ -endif }} public class CustomFeatureFlags implements FeatureFlags \{ private BiPredicate<String, Predicate<FeatureFlags>> mGetValueImpl; Loading tools/aconfig/aconfig/templates/ExportedFlags.java.template 0 → 100644 +49 −0 Original line number Diff line number Diff line package {package_name}; {#- CODEGEN FOR EXPORTED MODE FOR NEW STORAGE SINGLE EXPORTED FILE#} import android.os.Build; import android.os.flagging.AconfigPackage; import android.util.Log; public final class ExportedFlags \{ {{ -for item in flag_elements}} public static final String FLAG_{item.flag_name_constant_suffix} = "{item.device_config_flag}"; {{- endfor }} private static final String TAG = "ExportedFlags"; private static volatile boolean isCached = false; {{ for flag in flag_elements }} private static boolean {flag.method_name} = false; {{ -endfor }} {#- end flag_elements #} private ExportedFlags() \{} private void init() \{ try \{ AconfigPackage reader = AconfigPackage.load("{package_name}"); {{ -for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ -if flag.finalized_sdk_present }} {flag.method_name} = Build.VERSION.SDK_INT >= {flag.finalized_sdk_value} ? true : reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ - else }} {#- else finalized_sdk_present #} {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ -endif}} {#- end finalized_sdk_present#} {{ -endfor }} {#- end namespace_with_flags.flags #} {{ -endfor }} {#- end namespace_flags #} } catch (Exception e) \{ // pass Log.e(TAG, e.toString()); } catch (LinkageError e) \{ // for mainline module running on older devices. // This should be replaces to version check, after the version bump. Log.w(TAG, e.toString()); } isCached = true; } {{ -for flag in flag_elements }} public static boolean {flag.method_name}() \{ if (!featureFlags.isCached) \{ featureFlags.init(); } return featureFlags.{flag.method_name}; } {{ -endfor }} private static ExportedFlags featureFlags = new ExportedFlags(); } Loading
tools/aconfig/aconfig/src/codegen/java.rs +31 −10 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ pub struct JavaCodegenConfig { pub allow_instrumentation: bool, pub package_fingerprint: u64, pub new_exported: bool, pub single_exported_file: bool, pub check_api_level: bool, } Loading Loading @@ -71,8 +72,15 @@ where is_platform_container, package_fingerprint: format!("0x{:X}L", config.package_fingerprint), new_exported: config.new_exported, single_exported_file: config.single_exported_file, }; let mut template = TinyTemplate::new(); if library_exported && config.single_exported_file { template.add_template( "ExportedFlags.java", include_str!("../../templates/ExportedFlags.java.template"), )?; } template.add_template("Flags.java", include_str!("../../templates/Flags.java.template"))?; add_feature_flags_impl_template(&context, &mut template)?; template.add_template( Loading @@ -89,16 +97,23 @@ where )?; let path: PathBuf = package.split('.').collect(); [ let mut files = vec![ "Flags.java", "FeatureFlags.java", "FeatureFlagsImpl.java", "CustomFeatureFlags.java", "FakeFeatureFlagsImpl.java", ] ]; if library_exported && config.single_exported_file { files.push("ExportedFlags.java"); } files .iter() .map(|file| { Ok(OutputFile { contents: template.render(file, &context)?.into(), path: path.join(file) }) Ok(OutputFile { contents: template.render(file, &context)?.into(), path: path.join(file), }) }) .collect::<Result<Vec<OutputFile>>>() } Loading Loading @@ -138,6 +153,7 @@ struct Context { pub is_platform_container: bool, pub package_fingerprint: String, pub new_exported: bool, pub single_exported_file: bool, } #[derive(Serialize, Debug)] Loading Loading @@ -259,7 +275,7 @@ fn add_feature_flags_impl_template( (true, false, _) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), include_str!("../../templates/FeatureFlagsImpl.deviceConfig.java.template"), )?; } Loading @@ -275,7 +291,7 @@ fn add_feature_flags_impl_template( (false, _, false) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), include_str!("../../templates/FeatureFlagsImpl.deviceConfig.java.template"), )?; } }; Loading Loading @@ -592,6 +608,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -752,6 +769,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -956,6 +974,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: true, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -1022,7 +1041,7 @@ mod tests { } catch (LinkageError e) { // for mainline module running on older devices. // This should be replaces to version check, after the version bump. Log.e(TAG, e.toString()); Log.w(TAG, e.toString()); } isCached = true; } Loading Loading @@ -1150,6 +1169,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading Loading @@ -1277,6 +1297,7 @@ mod tests { allow_instrumentation: true, package_fingerprint: 5801144784618221668, new_exported: false, single_exported_file: false, check_api_level: false, }; let generated_files = generate_java_code( Loading
tools/aconfig/aconfig/src/commands.rs +2 −0 Original line number Diff line number Diff line Loading @@ -219,6 +219,7 @@ pub fn create_java_lib( codegen_mode: CodegenMode, allow_instrumentation: bool, new_exported: bool, single_exported_file: bool, check_api_level: bool, ) -> Result<Vec<OutputFile>> { let parsed_flags = input.try_parse_flags()?; Loading @@ -237,6 +238,7 @@ pub fn create_java_lib( allow_instrumentation, package_fingerprint, new_exported, single_exported_file, check_api_level, }; generate_java_code(&package, modified_parsed_flags.into_iter(), config) Loading
tools/aconfig/aconfig/src/main.rs +11 −0 Original line number Diff line number Diff line Loading @@ -157,12 +157,20 @@ fn cli() -> Command { .value_parser(EnumValueParser::<CodegenMode>::new()) .default_value("production"), ) .arg( Arg::new("single-exported-file") .long("single-exported-file") .value_parser(clap::value_parser!(bool)) .default_value("false"), ) // TODO: b/395899938 - clean up flags for switching to new storage .arg( Arg::new("allow-instrumentation") .long("allow-instrumentation") .value_parser(clap::value_parser!(bool)) .default_value("false"), ) // TODO: b/395899938 - clean up flags for switching to new storage .arg( Arg::new("new-exported") .long("new-exported") Loading Loading @@ -373,12 +381,15 @@ fn main() -> Result<()> { let allow_instrumentation = get_required_arg::<bool>(sub_matches, "allow-instrumentation")?; let new_exported = get_required_arg::<bool>(sub_matches, "new-exported")?; let single_exported_file = get_required_arg::<bool>(sub_matches, "single-exported-file")?; let check_api_level = get_required_arg::<bool>(sub_matches, "check-api-level")?; let generated_files = commands::create_java_lib( cache, *mode, *allow_instrumentation, *new_exported, *single_exported_file, *check_api_level, ) .context("failed to create java lib")?; Loading
tools/aconfig/aconfig/templates/CustomFeatureFlags.java.template +6 −0 Original line number Diff line number Diff line Loading @@ -11,7 +11,13 @@ import java.util.Set; import java.util.function.BiPredicate; import java.util.function.Predicate; {{ -if single_exported_file }} {{ -if library_exported }} @Deprecated {#- PREFER ExportedFlags #} {{ -endif }} {{ -else }} /** @hide */ {{ -endif }} public class CustomFeatureFlags implements FeatureFlags \{ private BiPredicate<String, Predicate<FeatureFlags>> mGetValueImpl; Loading
tools/aconfig/aconfig/templates/ExportedFlags.java.template 0 → 100644 +49 −0 Original line number Diff line number Diff line package {package_name}; {#- CODEGEN FOR EXPORTED MODE FOR NEW STORAGE SINGLE EXPORTED FILE#} import android.os.Build; import android.os.flagging.AconfigPackage; import android.util.Log; public final class ExportedFlags \{ {{ -for item in flag_elements}} public static final String FLAG_{item.flag_name_constant_suffix} = "{item.device_config_flag}"; {{- endfor }} private static final String TAG = "ExportedFlags"; private static volatile boolean isCached = false; {{ for flag in flag_elements }} private static boolean {flag.method_name} = false; {{ -endfor }} {#- end flag_elements #} private ExportedFlags() \{} private void init() \{ try \{ AconfigPackage reader = AconfigPackage.load("{package_name}"); {{ -for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ -if flag.finalized_sdk_present }} {flag.method_name} = Build.VERSION.SDK_INT >= {flag.finalized_sdk_value} ? true : reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ - else }} {#- else finalized_sdk_present #} {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ -endif}} {#- end finalized_sdk_present#} {{ -endfor }} {#- end namespace_with_flags.flags #} {{ -endfor }} {#- end namespace_flags #} } catch (Exception e) \{ // pass Log.e(TAG, e.toString()); } catch (LinkageError e) \{ // for mainline module running on older devices. // This should be replaces to version check, after the version bump. Log.w(TAG, e.toString()); } isCached = true; } {{ -for flag in flag_elements }} public static boolean {flag.method_name}() \{ if (!featureFlags.isCached) \{ featureFlags.init(); } return featureFlags.{flag.method_name}; } {{ -endfor }} private static ExportedFlags featureFlags = new ExportedFlags(); }