Android逆向--Android11 密码锁屏源码分析

1.打开应用的密码锁屏页面
执行
adb shell
dumpsys window | grep mFoc
得到当前的页面对应的java文件是位于AOSP源码下的vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\password\ChooseLockPassword.java文件
两次输入密码后点击(确认/comfirm)按钮时会触发点击事件ChooseLockPassword子类ChooseLockPasswordFragment中的handleNext()方法

public void handleNext() {
   
        if (mSaveAndFinishWorker != null) return;
        // TODO(b/120484642): This is a point of entry for passwords from the UI
        final Editable passwordText = mPasswordEntry.getText();
        if (TextUtils.isEmpty(passwordText)) {
   
            return;
        }
        mChosenPassword = mIsAlphaMode ? LockscreenCredential.createPassword(passwordText)
                : LockscreenCredential.createPin(passwordText);
        if (mUiStage == ChooseLockPassword.ChooseLockPasswordFragment.Stage.Introduction) {
   
            if (validatePassword(mChosenPassword)) {
   
                mFirstPassword = mChosenPassword;
                mPasswordEntry.setText("");
                updateStage(ChooseLockPassword.ChooseLockPasswordFragment.Stage.NeedToConfirm);
            } else {
   
                mChosenPassword.zeroize();
            }
        } else if (mUiStage == ChooseLockPassword.ChooseLockPasswordFragment.Stage.NeedToConfirm) {
   
            //确认两次密码是否一致,开始调用startSaveAndFinish方法
            if (mChosenPassword.equals(mFirstPassword)) {
   
                startSaveAndFinish();
            } else {
   
                CharSequence tmp = mPasswordEntry.getText();
                if (tmp != null) {
   
                    Selection.setSelection((Spannable) tmp, 0, tmp.length());
                }
                updateStage(ChooseLockPassword.ChooseLockPasswordFragment.Stage.ConfirmWrong);
                mChosenPassword.zeroize();
            }
        }
    }

2.startSaveAndFinish()

    private void startSaveAndFinish() {
   
        if (mSaveAndFinishWorker != null) {
   
            Log.w(TAG, "startSaveAndFinish with an existing SaveAndFinishWorker.");
            return;
        }

        mPasswordEntryInputDisabler.setInputEnabled(false);
        setNextEnabled(false);

        mSaveAndFinishWorker = new ChooseLockPassword.SaveAndFinishWorker();
        mSaveAndFinishWorker.setListener(this);

        getFragmentManager().beginTransaction().add(mSaveAndFinishWorker,
                FRAGMENT_TAG_SAVE_AND_FINISH).commit();
        getFragmentManager().executePendingTransactions();

        final Intent intent = getActivity().getIntent();
        final boolean required = intent.getBooleanExtra(
                EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
        if (mUnificationProfileId != UserHandle.USER_NULL) {
   
            try (LockscreenCredential profileCredential = (LockscreenCredential)
                    intent.getParcelableExtra(EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL)) {
   
                mSaveAndFinishWorker.setProfileToUnify(mUnificationProfileId,
                        profileCredential);
            }
        }
        //继续下一步
        mSaveAndFinishWorker.start(mLockPatternUtils, required, mHasChallenge, mChallenge,
                mChosenPassword, mCurrentCredential, mUserId);
    }
  1. 进入SaveAndFinishWorker查看start()方法,这个内部类继承了SaveChosenLockWorkerBase类,代码里的start()是在SaveChosenLockWorkerBase中执行
 public void start(LockPatternUtils utils, boolean required,
                boolean hasChallenge, long challenge,
                LockscreenCredential chosenPassword, LockscreenCredential currentCredential,
                int userId) {
   
            prepare(utils, required, hasChallenge, challenge, userId);

            mChosenPassword = chosenPassword;
            mCurrentCredential = currentCredential != null ? currentCredential
                    : LockscreenCredential.createNone();
            mUserId = userId;
            //继续下一步
            start();
        

你可能感兴趣的:(android)