Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa9d92f7 authored by Jared Duke's avatar Jared Duke
Browse files

Add SystemFeaturesMetadata to framework

Use the SDK_FEATURE_COUNT metadata field to give a tighter bound
for the system feature IPC cache. We have to first re-declare
this in PackageManager such that it's visible to other (internal)
classes where it will be used, in this case, ApplicationPackageManager.

Bug: 375000483
Test: atest PackageManagerTest
Flag: EXEMPT refactor
Change-Id: Idfd4944381f0d0e8e4f3e8ba30b37c578545fe60
parent e78f8b92
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -370,6 +370,7 @@ java_defaults {
        "view-inspector-annotation-processor",
        "staledataclass-annotation-processor",
        "error_prone_android_framework",
        "systemfeatures-metadata-processor",
    ],
    // Exports needed for staledataclass-annotation-processor, see b/139342589.
    javacflags: [
+10 −0
Original line number Diff line number Diff line
@@ -3111,6 +3111,16 @@ public abstract class PackageManager {
     */
    public static final long MAXIMUM_VERIFICATION_TIMEOUT = 60*60*1000;

    /**
     * As the generated feature count is useful for classes that may not be compiled in the same
     * annotation processing unit as PackageManager, we redeclare it here for visibility.
     *
     * @hide
     */
    @VisibleForTesting
    public static final int SDK_FEATURE_COUNT =
            com.android.internal.pm.SystemFeaturesMetadata.SDK_FEATURE_COUNT;

    /**
     * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device's
     * audio pipeline is low-latency, more suitable for audio applications sensitive to delays or
+24 −0
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@ import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.lang.reflect.Modifier;
import java.util.Arrays;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class PackageManagerTest {
@@ -46,4 +49,25 @@ public class PackageManagerTest {
    public void testResolveInfoFlags() throws Exception {
        assertThat(PackageManager.ResolveInfoFlags.of(42L).getValue()).isEqualTo(42L);
    }

    @Test
    public void testSdkFeatureCount() throws Exception {
        // Check to make sure the system feature `SdkConst` annotation processor yields sensible
        // results. We don't care about the exactness, just that it's not pathologically wrong.
        assertThat(PackageManager.SDK_FEATURE_COUNT).isGreaterThan(150);
        assertThat(PackageManager.SDK_FEATURE_COUNT).isLessThan(500);
        assertThat(PackageManager.SDK_FEATURE_COUNT)
                .isWithin(50)
                .of(getApproximateFeatureCountUsingReflection());
    }

    /* Return a ballpark estimate of the feature count using FEATURE_ field names. */
    private static int getApproximateFeatureCountUsingReflection() {
        return (int)
                Arrays.stream(PackageManager.class.getFields())
                        .filter(field -> Modifier.isStatic(field.getModifiers()))
                        .filter(field -> Modifier.isFinal(field.getModifiers()))
                        .filter(field -> field.getName().startsWith("FEATURE_"))
                        .count();
    }
}