android 8.0 AOSP TIF: com. android .server.tv.TvInputManagerService Сбой - PullRequest
0 голосов
/ 13 марта 2020

Моя система поддерживает многопользовательскую функцию и поддерживает функцию очистки данных для гостевых пользователей.

Я использовал «wipeguestsession» для очистки данных. https://cs.android.com/android/platform/superproject/+/master: рамки / базы / пакеты / SystemUI / src / com / android / systemui / GuestResumeSessionReceiver.java; l = 95? Q = wipeguest & ss = android% 2Fplatform% 2Fsuperproject

и затем мое устройство получило эту ошибку.

Caused by: java.lang.NullPointerException: Attempt to read from field 'java.util.Map com.android.server.tv.TvInputManagerService$UserState.sessionStateMap' on a null object reference

Этот TvInputManagerService зарегистрировал два действия: Intent.ACTION_USER_SWITCHED и Intent.ACTION_USER_REMOVED. Если этот сервис получает userRemoved и сначала очищает UserState, то получает userSwitched. Если он использует ранее очищенное UserState, возникнет ошибка нулевого указателя.

private void removeUser(int userId) {
        synchronized (mLock) {
            UserState userState = mUserStates.get(userId);
            if (userState == null) {
                return;
            }
            // Release all created sessions.
            for (SessionState state : userState.sessionStateMap.values()) {
                if (state.session != null) {
                    try {
                        state.session.release();
                    } catch (RemoteException e) {
                        Slog.e(TAG, "error in release", e);
                    }
                }
            }
            userState.sessionStateMap.clear();

            // Unregister all callbacks and unbind all services.
            for (ServiceState serviceState : userState.serviceStateMap.values()) {
                if (serviceState.service != null) {
                    if (serviceState.callback != null) {
                        try {
                            serviceState.service.unregisterCallback(serviceState.callback);
                        } catch (RemoteException e) {
                            Slog.e(TAG, "error in unregisterCallback", e);
                        }
                    }
                    mContext.unbindService(serviceState.connection);
                }
            }
            userState.serviceStateMap.clear();

            // Clear everything else.
            userState.inputMap.clear();
            userState.packageSet.clear();
            userState.contentRatingSystemList.clear();
            userState.clientStateMap.clear();
            userState.mCallbacks.kill();
            userState.mainSessionToken = null;

            mUserStates.remove(userId);
        }
    }

private void switchUser(int userId) {
        synchronized (mLock) {
            if (mCurrentUserId == userId) {
                return;
            }
            UserState userState = mUserStates.get(mCurrentUserId);
            List<SessionState> sessionStatesToRelease = new ArrayList<>();
            for (SessionState sessionState : userState.sessionStateMap.values()) {
                if (sessionState.session != null && !sessionState.isRecordingSession) {
                    sessionStatesToRelease.add(sessionState);
                }
            }

https://cs.android.com/android/platform/superproject/+/master: frameworks / base / services / core / java / com / android / server / tv / TvInputManagerService .java; l = 378? q = TvInputManager% 20switchUser & ss = android% 2Fplatform% 2Fsuperproject

Я не уверен, является ли это моей проблемой или Android, поэтому мое текущее решение - проверить это объект. Если это Null, пропустите его.

Кто-нибудь сталкивался с этой проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...