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 Diff line number Diff line
@@ -216,6 +216,13 @@ public class AuthService extends SystemService {
        public String[] getFaceAidlInstances() {
            return ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
        }

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

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

        if (com.android.server.biometrics.Flags.deHidl()) {
            Slog.d(TAG, "deHidl flag is on.");
            registerAuthenticators();
        } else {
            // 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() {
        BiometricHandlerProvider handlerProvider = mInjector.getBiometricHandlerProvider();

        handlerProvider.getFingerprintHandler().post(() ->
                registerFingerprintSensors(mInjector.getFingerprintAidlInstances(),
                mInjector.getFingerprintConfiguration(getContext()));
                        mInjector.getFingerprintConfiguration(getContext()), getContext(),
                        mInjector.getFingerprintService()));
        handlerProvider.getFaceHandler().post(() ->
                registerFaceSensors(mInjector.getFaceAidlInstances(),
                mInjector.getFaceConfiguration(getContext()));
                        mInjector.getFaceConfiguration(getContext()), getContext(),
                        mInjector.getFaceService()));
        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 =
                new FaceSensorConfigurations(hidlConfigStrings != null
                        && hidlConfigStrings.length > 0);

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

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

        final IFaceService faceService = mInjector.getFaceService();
        if (faceService != null) {
            try {
                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 =
                new FingerprintSensorConfigurations(!(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) {
@@ -882,7 +900,6 @@ public class AuthService extends SystemService {
                            ServiceManager.waitForDeclaredService(name))));
        }

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

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

    @Before
    public void setUp() {
        // Placeholder test config
@@ -167,6 +174,11 @@ public class AuthServiceTest {
        when(mInjector.getIrisService()).thenReturn(mIrisService);
        when(mInjector.getAppOps(any())).thenReturn(mAppOpsManager);
        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 */);
    }
@@ -250,6 +262,9 @@ public class AuthServiceTest {
        mAuthService = new AuthService(mContext, mInjector);
        mAuthService.onStart();

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

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