Loading core/build_id.mk +1 −1 Original line number Diff line number Diff line Loading @@ -18,4 +18,4 @@ # (like "CRB01"). It must be a single word, and is # capitalized by convention. BUILD_ID=BP2A.250131.002 BUILD_ID=BP2A.250201.001 core/robolectric_test_config_template.xml +0 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ <option name="test-suite-tag" value="robolectric" /> <option name="test-suite-tag" value="robolectric-tests" /> <option name="java-folder" value="prebuilts/jdk/jdk21/linux-x86/" /> <option name="exclude-paths" value="java" /> <option name="use-robolectric-resources" value="true" /> Loading tools/aconfig/aconfig/src/codegen/java.rs +58 −4 Original line number Diff line number Diff line Loading @@ -74,10 +74,7 @@ where }; let mut template = TinyTemplate::new(); template.add_template("Flags.java", include_str!("../../templates/Flags.java.template"))?; template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; add_feature_flags_impl_template(&context, &mut template)?; template.add_template( "FeatureFlags.java", include_str!("../../templates/FeatureFlags.java.template"), Loading Loading @@ -233,6 +230,63 @@ fn format_property_name(property_name: &str) -> String { format!("mProperties{}{}", &name[0..1].to_ascii_uppercase(), &name[1..]) } fn add_feature_flags_impl_template( context: &Context, template: &mut TinyTemplate, ) -> Result<(), tinytemplate::error::Error> { if context.is_test_mode { // Test mode has its own template, so use regardless of any other settings. template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.test_mode.java.template"), )?; return Ok(()); } println!("lib exported: {}", context.library_exported); println!("new_exp: {}", context.new_exported); println!("allow in: {}", context.allow_instrumentation); match (context.library_exported, context.new_exported, context.allow_instrumentation) { // Exported library with new_exported enabled, use new storage exported template. (true, true, _) => { println!("new exported template"); template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.exported.java.template"), )?; } // Exported library with new_exported NOT enabled, use legacy (device // config) template, because regardless of allow_instrumentation, we use // device config for exported libs if new_exported isn't enabled. // Remove once new_exported is fully rolled out. (true, false, _) => { println!("old exported, old template"); template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; } // New storage internal mode. (false, _, true) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.new_storage.java.template"), )?; } // Device config internal mode. Use legacy (device config) template. (false, _, false) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; } }; Ok(()) } #[cfg(test)] mod tests { use super::*; Loading tools/aconfig/aconfig/templates/FeatureFlagsImpl.exported.java.template 0 → 100644 +44 −0 Original line number Diff line number Diff line package {package_name}; {#- CODEGEN FOR EXPORTED MODE FOR NEW STORAGE #} import android.os.Build; import android.os.flagging.AconfigPackage; import android.util.Log; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ private static final String TAG = "FeatureFlagsImplExport"; private static volatile boolean isCached = false; {{ for flag in flag_elements }} private static boolean {flag.method_name} = false; {{ -endfor }} {#- end flag_elements #} 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.e(TAG, e.toString()); } isCached = true; } {{ -for flag in flag_elements }} @Override public boolean {flag.method_name}() \{ if (!isCached) \{ init(); } return {flag.method_name}; } {{ endfor }} {#- end flag_elements #} } tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template +20 −20 Original line number Diff line number Diff line Loading @@ -8,11 +8,11 @@ import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; {{ if is_platform_container }} import android.os.flagging.PlatformAconfigPackageInternal; {{ -else }} {{ -else }} {#- else is_platform_container #} import android.os.flagging.AconfigPackageInternal; {{ -endif }} {{ -endif }} {#- end of is_platform_container#} import android.util.Log; {{ -endif }} {{ -endif }} {#- end of runtime_lookup_required#} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} Loading @@ -21,21 +21,21 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} private void init() \{ try \{ {{ if is_platform_container }} PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{package_name}", {package_fingerprint}); {{ -else }} {{ -else }} {#- else is_platform_container #} AconfigPackageInternal reader = AconfigPackageInternal.load("{package_name}", {package_fingerprint}); {{ -endif }} {{ -endif }} {#- end of is_platform_container#} {{ -for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ -if flag.is_read_write }} {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset}); {{ -endif }} {{ -endif }} {#- is_read_write#} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ Loading @@ -58,9 +58,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ init(); } return {flag.method_name}; {{ -else }} {{ -else }}{#- else is_read_write #} return {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} } {{ endfor }} } Loading @@ -83,9 +83,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -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 }} {#- else finalized_sdk_present #} {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ -endif}} {{ -endif}} {#- end of finalized_sdk_present#} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ Loading Loading @@ -120,7 +120,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ Loading @@ -131,7 +131,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if flag.is_read_write }} {flag.method_name} = properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value}); {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} } catch (NullPointerException e) \{ throw new RuntimeException( Loading Loading @@ -166,13 +166,13 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ if not library_exported- }} // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; {{ -endif }} {{ -endif }} {#- end of not library_exported#} {{ -if runtime_lookup_required }} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; {{ -endif }} {{ -endif }} {#- end of runtime_lookup_required#} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} Loading @@ -183,7 +183,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{- if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ Loading @@ -194,7 +194,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if flag.is_read_write }} {flag.method_name} = properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value}); {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} } catch (NullPointerException e) \{ throw new RuntimeException( Loading @@ -217,16 +217,16 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if not library_exported }} @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage {{ -endif }} {{ -endif }}{#- end of not library_exported #} public boolean {flag.method_name}() \{ {{ -if flag.is_read_write }} if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } return {flag.method_name}; {{ -else }} {{ -else }} {#- else is_read_write #} return {flag.default_value}; {{ -endif }} {{ -endif }}{#- end of is_read_write #} } {{ endfor }} } Loading Loading
core/build_id.mk +1 −1 Original line number Diff line number Diff line Loading @@ -18,4 +18,4 @@ # (like "CRB01"). It must be a single word, and is # capitalized by convention. BUILD_ID=BP2A.250131.002 BUILD_ID=BP2A.250201.001
core/robolectric_test_config_template.xml +0 −1 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ <option name="test-suite-tag" value="robolectric" /> <option name="test-suite-tag" value="robolectric-tests" /> <option name="java-folder" value="prebuilts/jdk/jdk21/linux-x86/" /> <option name="exclude-paths" value="java" /> <option name="use-robolectric-resources" value="true" /> Loading
tools/aconfig/aconfig/src/codegen/java.rs +58 −4 Original line number Diff line number Diff line Loading @@ -74,10 +74,7 @@ where }; let mut template = TinyTemplate::new(); template.add_template("Flags.java", include_str!("../../templates/Flags.java.template"))?; template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; add_feature_flags_impl_template(&context, &mut template)?; template.add_template( "FeatureFlags.java", include_str!("../../templates/FeatureFlags.java.template"), Loading Loading @@ -233,6 +230,63 @@ fn format_property_name(property_name: &str) -> String { format!("mProperties{}{}", &name[0..1].to_ascii_uppercase(), &name[1..]) } fn add_feature_flags_impl_template( context: &Context, template: &mut TinyTemplate, ) -> Result<(), tinytemplate::error::Error> { if context.is_test_mode { // Test mode has its own template, so use regardless of any other settings. template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.test_mode.java.template"), )?; return Ok(()); } println!("lib exported: {}", context.library_exported); println!("new_exp: {}", context.new_exported); println!("allow in: {}", context.allow_instrumentation); match (context.library_exported, context.new_exported, context.allow_instrumentation) { // Exported library with new_exported enabled, use new storage exported template. (true, true, _) => { println!("new exported template"); template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.exported.java.template"), )?; } // Exported library with new_exported NOT enabled, use legacy (device // config) template, because regardless of allow_instrumentation, we use // device config for exported libs if new_exported isn't enabled. // Remove once new_exported is fully rolled out. (true, false, _) => { println!("old exported, old template"); template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; } // New storage internal mode. (false, _, true) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.new_storage.java.template"), )?; } // Device config internal mode. Use legacy (device config) template. (false, _, false) => { template.add_template( "FeatureFlagsImpl.java", include_str!("../../templates/FeatureFlagsImpl.java.template"), )?; } }; Ok(()) } #[cfg(test)] mod tests { use super::*; Loading
tools/aconfig/aconfig/templates/FeatureFlagsImpl.exported.java.template 0 → 100644 +44 −0 Original line number Diff line number Diff line package {package_name}; {#- CODEGEN FOR EXPORTED MODE FOR NEW STORAGE #} import android.os.Build; import android.os.flagging.AconfigPackage; import android.util.Log; /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ private static final String TAG = "FeatureFlagsImplExport"; private static volatile boolean isCached = false; {{ for flag in flag_elements }} private static boolean {flag.method_name} = false; {{ -endfor }} {#- end flag_elements #} 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.e(TAG, e.toString()); } isCached = true; } {{ -for flag in flag_elements }} @Override public boolean {flag.method_name}() \{ if (!isCached) \{ init(); } return {flag.method_name}; } {{ endfor }} {#- end flag_elements #} }
tools/aconfig/aconfig/templates/FeatureFlagsImpl.java.template +20 −20 Original line number Diff line number Diff line Loading @@ -8,11 +8,11 @@ import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; {{ if is_platform_container }} import android.os.flagging.PlatformAconfigPackageInternal; {{ -else }} {{ -else }} {#- else is_platform_container #} import android.os.flagging.AconfigPackageInternal; {{ -endif }} {{ -endif }} {#- end of is_platform_container#} import android.util.Log; {{ -endif }} {{ -endif }} {#- end of runtime_lookup_required#} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} Loading @@ -21,21 +21,21 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} private void init() \{ try \{ {{ if is_platform_container }} PlatformAconfigPackageInternal reader = PlatformAconfigPackageInternal.load("{package_name}", {package_fingerprint}); {{ -else }} {{ -else }} {#- else is_platform_container #} AconfigPackageInternal reader = AconfigPackageInternal.load("{package_name}", {package_fingerprint}); {{ -endif }} {{ -endif }} {#- end of is_platform_container#} {{ -for namespace_with_flags in namespace_flags }} {{ -for flag in namespace_with_flags.flags }} {{ -if flag.is_read_write }} {flag.method_name} = reader.getBooleanFlagValue({flag.flag_offset}); {{ -endif }} {{ -endif }} {#- is_read_write#} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ Loading @@ -58,9 +58,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ init(); } return {flag.method_name}; {{ -else }} {{ -else }}{#- else is_read_write #} return {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} } {{ endfor }} } Loading @@ -83,9 +83,9 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -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 }} {#- else finalized_sdk_present #} {flag.method_name} = reader.getBooleanFlagValue("{flag.flag_name}", {flag.default_value}); {{ -endif}} {{ -endif}} {#- end of finalized_sdk_present#} {{ -endfor }} {{ -endfor }} } catch (Exception e) \{ Loading Loading @@ -120,7 +120,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{ -if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ Loading @@ -131,7 +131,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if flag.is_read_write }} {flag.method_name} = properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value}); {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} } catch (NullPointerException e) \{ throw new RuntimeException( Loading Loading @@ -166,13 +166,13 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ if not library_exported- }} // TODO(b/303773055): Remove the annotation after access issue is resolved. import android.compat.annotation.UnsupportedAppUsage; {{ -endif }} {{ -endif }} {#- end of not library_exported#} {{ -if runtime_lookup_required }} import android.os.Binder; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; {{ -endif }} {{ -endif }} {#- end of runtime_lookup_required#} /** @hide */ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if runtime_lookup_required }} Loading @@ -183,7 +183,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ for flag in flag_elements }} {{- if flag.is_read_write }} private static boolean {flag.method_name} = {flag.default_value}; {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} {{ for namespace_with_flags in namespace_flags }} private void load_overrides_{namespace_with_flags.namespace}() \{ Loading @@ -194,7 +194,7 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if flag.is_read_write }} {flag.method_name} = properties.getBoolean(Flags.FLAG_{flag.flag_name_constant_suffix}, {flag.default_value}); {{ -endif }} {{ -endif }} {#- end of is_read_write#} {{ -endfor }} } catch (NullPointerException e) \{ throw new RuntimeException( Loading @@ -217,16 +217,16 @@ public final class FeatureFlagsImpl implements FeatureFlags \{ {{ -if not library_exported }} @com.android.aconfig.annotations.AconfigFlagAccessor @UnsupportedAppUsage {{ -endif }} {{ -endif }}{#- end of not library_exported #} public boolean {flag.method_name}() \{ {{ -if flag.is_read_write }} if (!{flag.device_config_namespace}_is_cached) \{ load_overrides_{flag.device_config_namespace}(); } return {flag.method_name}; {{ -else }} {{ -else }} {#- else is_read_write #} return {flag.default_value}; {{ -endif }} {{ -endif }}{#- end of is_read_write #} } {{ endfor }} } Loading