Android 지원 Smart Lock 얼굴 잠 금 해제

42056 단어 android
플랫폼
RK3288 + Android 7.1

수요
      

방안 설명
  Smart Lock    "    "         

실현 절차
  • 내 장 된 GMS(PUSH 가 들 어가 면 리 셋)GMS 가방 의 내용 은 다음 과 같 습 니 다
  • drwxrwxrwx 2 root root 4096 2013-01-21 17:32 FaceLock
    drwxrwxrwx 2 root root 4096 2013-01-21 17:32 GoogleBackupTransport
    drwxrwxrwx 2 root root 4096 2013-01-21 17:32 GoogleContactsSyncAdapter
    drwxrwxrwx 3 root root 4096 2013-01-21 17:32 GoogleGmsCore
    drwxrwxrwx 2 root root 4096 2013-01-21 17:32 GoogleLoginService
    drwxrwxrwx 2 root root 4096 2013-01-21 17:33 GooglePartnerSetup
    drwxrwxrwx 3 root root 4096 2013-01-21 17:32 GooglePlay
    drwxrwxrwx 2 root root 4096 2013-01-21 17:33 GoogleServicesFramework
    
    
  • FaceLock 이 설치 되 어 있 는 지 확인 합 니 다
  • rk3288:/system/priv-app # dumpsys package com.android.facelock                                                                 
    Permissions:
      Permission [com.google.android.gms.auth.permission.FACE_UNLOCK] (e0424d2):
        sourcePackage=com.android.facelock
        uid=10024 gids=null type=0 prot=signature
        perm=Permission{767d9a3 com.google.android.gms.auth.permission.FACE_UNLOCK}
        packageSetting=PackageSetting{29984a0 com.android.facelock/10024}
    
    Key Set Manager:
      [com.android.facelock]
          Signing KeySets: 6
    
    Packages:
      Package [com.android.facelock] (29984a0):
        userId=10024
        pkg=Package{5866859 com.android.facelock}
        codePath=/system/priv-app/FaceLock
        resourcePath=/system/priv-app/FaceLock
        legacyNativeLibraryDir=/system/priv-app/FaceLock/lib
        primaryCpuAbi=null
        secondaryCpuAbi=null
        versionCode=25 minSdk=15 targetSdk=25
        versionName=7.1.2
        splits=[base]
        apkSigningVersion=2
        applicationInfo=ApplicationInfo{bdbbc1e com.android.facelock}
        flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
        privateFlags=[ PRIVILEGED RESIZEABLE_ACTIVITIES ]
        dataDir=/data/user/0/com.android.facelock
        supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
        timeStamp=2019-10-15 10:09:32
        firstInstallTime=2019-10-15 10:09:32
        lastUpdateTime=2019-10-15 10:09:32
        signatures=PackageSignatures{d146cff [e3ca78d8]}
        installPermissionsFixed=false installStatus=1
        pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
        declared permissions:
          com.google.android.gms.auth.permission.FACE_UNLOCK: prot=signature, INSTALLED
        requested permissions:
          android.permission.CAMERA
          com.google.android.gms.auth.permission.FACE_UNLOCK
        install permissions:
          com.google.android.gms.auth.permission.FACE_UNLOCK: granted=true
        User 0: ceDataInode=513 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0
          runtime permissions:
    
    
    Dexopt state:
      [com.android.facelock]
        Instruction Set: arm
          path: /system/priv-app/FaceLock/FaceLock.apk
          status: /data/dalvik-cache/arm/system@priv-app@[email protected]@classes.dex [compilation_filter=interpret-onl
          y, status=kOatUpToDate]
    
    
    Compiler stats:
      [com.android.facelock]
         FaceLock.apk - 252
    
    
  • VPN 에 내 장 된 GMS 패 키 지 를 연결 하 는 버 전이 오래 되 었 으 므 로 GOOGLE 업데이트 와 지원 라 이브 러 리 등 을 연결 해 야 합 니 다
  • 잠 금 화면 설정>안전>화면 잠 금 은 smart lock 을 사용 하려 면 화면 잠 금 방식 을 도안/PIN 코드/비밀번호 로 설정 해 야 합 니 다
  • 신뢰 할 수 있 는 얼굴 설정>안전>스마트 잠 금>신뢰 할 수 있 는 얼굴 을 열 고 조작 을 누 르 면 됩 니 다
  • 잡다 한 항목
    몇몇 문제
  • GMS 업데이트 과정 에서 Smart Lock 의 옵션 이 나타 날 수 있 는 개 수 는 0-3 사이,불안정
  • 4.567917.Smart Lock 의 얼굴 잠 금 해 제 는 잠 금 화면 을 직접 건 너 뛰 지 않 습 니 다.실제 사용 하 는 과정 에서 사용 자 는 전원 깨 우기 장 치 를 사용 하고 장 치 는 사람의 얼굴 을 식별 하기 시 작 했 습 니 다.식별 에 성공 하면 화면 아래 에 잠 금 해제 애니메이션 이 있 습 니 다.잠 금 해 제 는 성 공 했 지만 시스템 에 직접 들 어가 지 않 습 니 다.사용자 가 스 케 이 트 애니메이션 을 실행 하여 잠 금 해제 동작 을 완성 해 야 합 니 다
  • 안 드 로 이 드 Q(10)부터 GOOGLE 는 안전 상의 이유 로 신뢰 할 수 있 는 얼굴 을 삭제 했다
  • 잠 금 화면 관련 코드
                
    |--frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
    
    	//      
        private static final String ACTION_FACE_UNLOCK_STARTED
                = "com.android.facelock.FACE_UNLOCK_STARTED";
        private static final String ACTION_FACE_UNLOCK_STOPPED
                = "com.android.facelock.FACE_UNLOCK_STOPPED";
        private final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(action)) {
                    mHandler.sendEmptyMessage(MSG_TIME_UPDATE);
                } else if (Intent.ACTION_USER_INFO_CHANGED.equals(action)) {
                    mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_INFO_CHANGED,
                            intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()), 0));
                } else if (ACTION_FACE_UNLOCK_STARTED.equals(action)) {
                    Trace.beginSection("KeyguardUpdateMonitor.mBroadcastAllReceiver#onReceive ACTION_FACE_UNLOCK_STARTED");
                    mHandler.sendMessage(mHandler.obtainMessage(MSG_FACE_UNLOCK_STATE_CHANGED, 1,
                            getSendingUserId()));
                    Trace.endSection();
                } else if (ACTION_FACE_UNLOCK_STOPPED.equals(action)) {
                    mHandler.sendMessage(mHandler.obtainMessage(MSG_FACE_UNLOCK_STATE_CHANGED, 0,
                            getSendingUserId()));
                } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
                        .equals(action)) {
                    mHandler.sendEmptyMessage(MSG_DPM_STATE_CHANGED);
                } else if (ACTION_USER_UNLOCKED.equals(action)) {
                    mHandler.sendEmptyMessage(MSG_USER_UNLOCKED);
                }
            }
        };
    
    //mHandler     
    	                case MSG_FACE_UNLOCK_STATE_CHANGED:
                        Trace.beginSection("KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
                        handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2);
                        Trace.endSection();
                        break;
    
        private void handleFaceUnlockStateChanged(boolean running, int userId) {
            mUserFaceUnlockRunning.put(userId, running);
            for (int i = 0; i < mCallbacks.size(); i++) {
                KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
                if (cb != null) {
                    cb.onFaceUnlockStateChanged(running, userId);
                }
            }
        }
    
    |--frameworks/base/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
    //   
        /**
         * Called when the state of face unlock changed.
         */
        public void onFaceUnlockStateChanged(boolean running, int userId) { }
    
    |--frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
        private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
    		//...
    
            @Override
            public void onFaceUnlockStateChanged(boolean running, int userId) {
                update(false /* updateAlways */);
            }
    	}
        private void update(boolean updateAlways) {
            Trace.beginSection("UnlockMethodCache#update");
            int user = KeyguardUpdateMonitor.getCurrentUser();
            boolean secure = mLockPatternUtils.isSecure(user);
            boolean canSkipBouncer = !secure ||  mKeyguardUpdateMonitor.getUserCanSkipBouncer(user);
            boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user);
            boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user);
            boolean faceUnlockRunning = mKeyguardUpdateMonitor.isFaceUnlockRunning(user)
                    && trustManaged;
            boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer ||
                    trustManaged != mTrustManaged  || faceUnlockRunning != mFaceUnlockRunning;
            if (changed || updateAlways) {
                mSecure = secure;
                mCanSkipBouncer = canSkipBouncer;
                mTrusted = trusted;
                mTrustManaged = trustManaged;
                mFaceUnlockRunning = faceUnlockRunning;
                notifyListeners();
            }
            Trace.endSection();
        }
    
    	private void notifyListeners() {
            for (OnUnlockMethodChangedListener listener : mListeners) {
                listener.onUnlockMethodStateChanged();
            }
        }
    
    
    |--frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
        @Override  // UnlockMethodCache.OnUnlockMethodChangedListener
        public void onUnlockMethodStateChanged() {
            logStateToEventlog();
        }
        private void logStateToEventlog() {
            boolean isShowing = mStatusBarKeyguardViewManager.isShowing();
            boolean isOccluded = mStatusBarKeyguardViewManager.isOccluded();
            boolean isBouncerShowing = mStatusBarKeyguardViewManager.isBouncerShowing();
            boolean isSecure = mUnlockMethodCache.isMethodSecure();
            boolean canSkipBouncer = mUnlockMethodCache.canSkipBouncer();
            int stateFingerprint = getLoggingFingerprint(mState,
                    isShowing,
                    isOccluded,
                    isBouncerShowing,
                    isSecure,
                    canSkipBouncer);
            if (stateFingerprint != mLastLoggedStateFingerprint) {
                EventLogTags.writeSysuiStatusBarState(mState,
                        isShowing ? 1 : 0,
                        isOccluded ? 1 : 0,
                        isBouncerShowing ? 1 : 0,
                        isSecure ? 1 : 0,
                        canSkipBouncer ? 1 : 0);
                mLastLoggedStateFingerprint = stateFingerprint;
            }
        }
    |--frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
    public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickListener,
            UnlockMethodCache.OnUnlockMethodChangedListener,
            AccessibilityController.AccessibilityStateChangedCallback, View.OnLongClickListener {
    
        @Override
        public void onUnlockMethodStateChanged() {
            mLockIcon.update();
            updateCameraVisibility();
        }
    }
    
    
    |--frameworks/base/services/core/java/com/android/server/trust/TrustManagerService.java
         public void updateTrust(int userId, int flags) {
            boolean managed = aggregateIsTrustManaged(userId);
            dispatchOnTrustManagedChanged(managed, userId);
            if (mStrongAuthTracker.isTrustAllowedForUser(userId)
                    && isTrustUsuallyManagedInternal(userId) != managed) {
                updateTrustUsuallyManaged(userId, managed);
            }
            boolean trusted = aggregateIsTrusted(userId);
            boolean changed;
            synchronized (mUserIsTrusted) {
                changed = mUserIsTrusted.get(userId) != trusted;
                mUserIsTrusted.put(userId, trusted);
            }
            dispatchOnTrustChanged(trusted, userId, flags);
            if (changed) {
                refreshDeviceLockedForUser(userId);
            }
        }
    	private void dispatchOnTrustChanged(boolean enabled, int userId, int flags) {
            if (DEBUG) {
                Log.i(TAG, "onTrustChanged(" + enabled + ", " + userId + ", 0x"
                        + Integer.toHexString(flags) + ")");
            }
            if (!enabled) flags = 0;
            for (int i = 0; i < mTrustListeners.size(); i++) {
                try {
                    mTrustListeners.get(i).onTrustChanged(enabled, userId, flags);
                } catch (DeadObjectException e) {
                    Slog.d(TAG, "Removing dead TrustListener.");
                    mTrustListeners.remove(i);
                    i--;
                } catch (RemoteException e) {
                    Slog.e(TAG, "Exception while notifying TrustListener.", e);
                }
            }
        }
    
    

    좋은 웹페이지 즐겨찾기