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

Commit 508bc9e5 authored by Diya Bera's avatar Diya Bera
Browse files

Reduce boot time

Invoke registerAuthenticators on separate threads.

Flags: Flags.DE_HIDL
Bug: 324112788
Test: atest FingerprintSensorConfigurationsTest FaceSensorConfigurationsTest AuthServiceTest

Change-Id: I84d9662559cff8432bc2f23bf29c6a27f066a793
parent 8e259dd8
Loading
Loading
Loading
Loading
+31 −14
Original line number Original line Diff line number Diff line
@@ -216,6 +216,13 @@ public class AuthService extends SystemService {
        public String[] getFaceAidlInstances() {
        public String[] getFaceAidlInstances() {
            return ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
            return ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
        }
        }

        /**
         * Allows to test with handlers.
         */
        public BiometricHandlerProvider getBiometricHandlerProvider() {
            return BiometricHandlerProvider.getInstance();
        }
    }
    }


    private final class AuthServiceImpl extends IAuthService.Stub {
    private final class AuthServiceImpl extends IAuthService.Stub {
@@ -772,7 +779,6 @@ public class AuthService extends SystemService {
        }
        }


        if (com.android.server.biometrics.Flags.deHidl()) {
        if (com.android.server.biometrics.Flags.deHidl()) {
            Slog.d(TAG, "deHidl flag is on.");
            registerAuthenticators();
            registerAuthenticators();
        } else {
        } else {
            // Registers HIDL and AIDL authenticators, but only HIDL configs need to be provided.
            // Registers HIDL and AIDL authenticators, but only HIDL configs need to be provided.
@@ -783,10 +789,16 @@ public class AuthService extends SystemService {
    }
    }


    private void registerAuthenticators() {
    private void registerAuthenticators() {
        BiometricHandlerProvider handlerProvider = mInjector.getBiometricHandlerProvider();

        handlerProvider.getFingerprintHandler().post(() ->
                registerFingerprintSensors(mInjector.getFingerprintAidlInstances(),
                registerFingerprintSensors(mInjector.getFingerprintAidlInstances(),
                mInjector.getFingerprintConfiguration(getContext()));
                        mInjector.getFingerprintConfiguration(getContext()), getContext(),
                        mInjector.getFingerprintService()));
        handlerProvider.getFaceHandler().post(() ->
                registerFaceSensors(mInjector.getFaceAidlInstances(),
                registerFaceSensors(mInjector.getFaceAidlInstances(),
                mInjector.getFaceConfiguration(getContext()));
                        mInjector.getFaceConfiguration(getContext()), getContext(),
                        mInjector.getFaceService()));
        registerIrisSensors(mInjector.getIrisConfiguration(getContext()));
        registerIrisSensors(mInjector.getIrisConfiguration(getContext()));
    }
    }


@@ -837,15 +849,18 @@ public class AuthService extends SystemService {
        }
        }
    }
    }


    private void registerFaceSensors(final String[] faceAidlInstances,
    /**
            final String[] hidlConfigStrings) {
     * This method is invoked on {@link BiometricHandlerProvider.mFaceHandler}.
     */
    private static void registerFaceSensors(final String[] faceAidlInstances,
            final String[] hidlConfigStrings, final Context context,
            final IFaceService faceService) {
        final FaceSensorConfigurations mFaceSensorConfigurations =
        final FaceSensorConfigurations mFaceSensorConfigurations =
                new FaceSensorConfigurations(hidlConfigStrings != null
                new FaceSensorConfigurations(hidlConfigStrings != null
                        && hidlConfigStrings.length > 0);
                        && hidlConfigStrings.length > 0);


        if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
        if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
            mFaceSensorConfigurations.addHidlConfigs(
            mFaceSensorConfigurations.addHidlConfigs(hidlConfigStrings, context);
                    hidlConfigStrings, getContext());
        }
        }


        if (faceAidlInstances != null && faceAidlInstances.length > 0) {
        if (faceAidlInstances != null && faceAidlInstances.length > 0) {
@@ -854,7 +869,6 @@ public class AuthService extends SystemService {
                            ServiceManager.waitForDeclaredService(name))));
                            ServiceManager.waitForDeclaredService(name))));
        }
        }


        final IFaceService faceService = mInjector.getFaceService();
        if (faceService != null) {
        if (faceService != null) {
            try {
            try {
                faceService.registerAuthenticatorsLegacy(mFaceSensorConfigurations);
                faceService.registerAuthenticatorsLegacy(mFaceSensorConfigurations);
@@ -866,14 +880,18 @@ public class AuthService extends SystemService {
        }
        }
    }
    }


    private void registerFingerprintSensors(final String[] fingerprintAidlInstances,
    /**
            final String[] hidlConfigStrings) {
     * This method is invoked on {@link BiometricHandlerProvider.mFingerprintHandler}.
     */
    private static void registerFingerprintSensors(final String[] fingerprintAidlInstances,
            final String[] hidlConfigStrings, final Context context,
            final IFingerprintService fingerprintService) {
        final FingerprintSensorConfigurations mFingerprintSensorConfigurations =
        final FingerprintSensorConfigurations mFingerprintSensorConfigurations =
                new FingerprintSensorConfigurations(!(hidlConfigStrings != null
                new FingerprintSensorConfigurations(!(hidlConfigStrings != null
                        && hidlConfigStrings.length > 0));
                        && hidlConfigStrings.length > 0));


        if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
        if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
            mFingerprintSensorConfigurations.addHidlSensors(hidlConfigStrings, getContext());
            mFingerprintSensorConfigurations.addHidlSensors(hidlConfigStrings, context);
        }
        }


        if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
        if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
@@ -882,7 +900,6 @@ public class AuthService extends SystemService {
                            ServiceManager.waitForDeclaredService(name))));
                            ServiceManager.waitForDeclaredService(name))));
        }
        }


        final IFingerprintService fingerprintService = mInjector.getFingerprintService();
        if (fingerprintService != null) {
        if (fingerprintService != null) {
            try {
            try {
                fingerprintService.registerAuthenticatorsLegacy(mFingerprintSensorConfigurations);
                fingerprintService.registerAuthenticatorsLegacy(mFingerprintSensorConfigurations);
+15 −0
Original line number Original line Diff line number Diff line
@@ -60,8 +60,10 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.iris.IIrisService;
import android.hardware.iris.IIrisService;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.test.TestLooper;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
@@ -127,6 +129,8 @@ public class AuthServiceTest {
    AppOpsManager mAppOpsManager;
    AppOpsManager mAppOpsManager;
    @Mock
    @Mock
    private VirtualDeviceManagerInternal mVdmInternal;
    private VirtualDeviceManagerInternal mVdmInternal;
    @Mock
    private BiometricHandlerProvider mBiometricHandlerProvider;
    @Captor
    @Captor
    private ArgumentCaptor<List<FingerprintSensorPropertiesInternal>> mFingerprintPropsCaptor;
    private ArgumentCaptor<List<FingerprintSensorPropertiesInternal>> mFingerprintPropsCaptor;
    @Captor
    @Captor
@@ -136,6 +140,9 @@ public class AuthServiceTest {
    @Captor
    @Captor
    private ArgumentCaptor<List<FaceSensorPropertiesInternal>> mFacePropsCaptor;
    private ArgumentCaptor<List<FaceSensorPropertiesInternal>> mFacePropsCaptor;


    private final TestLooper mFingerprintLooper = new TestLooper();
    private final TestLooper mFaceLooper = new TestLooper();

    @Before
    @Before
    public void setUp() {
    public void setUp() {
        // Placeholder test config
        // Placeholder test config
@@ -167,6 +174,11 @@ public class AuthServiceTest {
        when(mInjector.getIrisService()).thenReturn(mIrisService);
        when(mInjector.getIrisService()).thenReturn(mIrisService);
        when(mInjector.getAppOps(any())).thenReturn(mAppOpsManager);
        when(mInjector.getAppOps(any())).thenReturn(mAppOpsManager);
        when(mInjector.isHidlDisabled(any())).thenReturn(false);
        when(mInjector.isHidlDisabled(any())).thenReturn(false);
        when(mInjector.getBiometricHandlerProvider()).thenReturn(mBiometricHandlerProvider);
        when(mBiometricHandlerProvider.getFingerprintHandler()).thenReturn(
                new Handler(mFingerprintLooper.getLooper()));
        when(mBiometricHandlerProvider.getFaceHandler()).thenReturn(
                new Handler(mFaceLooper.getLooper()));


        setInternalAndTestBiometricPermissions(mContext, false /* hasPermission */);
        setInternalAndTestBiometricPermissions(mContext, false /* hasPermission */);
    }
    }
@@ -250,6 +262,9 @@ public class AuthServiceTest {
        mAuthService = new AuthService(mContext, mInjector);
        mAuthService = new AuthService(mContext, mInjector);
        mAuthService.onStart();
        mAuthService.onStart();


        mFingerprintLooper.dispatchAll();
        mFaceLooper.dispatchAll();

        verify(mFingerprintService).registerAuthenticatorsLegacy(
        verify(mFingerprintService).registerAuthenticatorsLegacy(
                mFingerprintSensorConfigurationsCaptor.capture());
                mFingerprintSensorConfigurationsCaptor.capture());