1.前提介绍:该密码保存在/data/misc/keystore/user_0/.masterkey,可在adb shell后,ls –al /data/misc/keystore/user_0/.masterkey查看文件存在与否。
下面讲述的是,从设置点击 安全-屏幕锁定方式,设定pin-设置pin码,通知-完成,到pin如何进行加密和存储的。完成这个button是一个设置中通用的一个按键,不再通知界面的布局中。
2. 这个按键响应ChooseLockPassword.java的onClick方法,执行以下代码:
图3.1执行onclick()
进入handleNext()方法,当确认密码正确时,执行startSaveFinsh操作
图3.2执行startSaveAndFinsh()
看一下startSaveFinsh()函数的具体执行过程,在该过程中会调用SaveAndFinishWorker类的start方法。
图3.3在该过程中会调用ChooseLockPassword.java文件中的SaveAndFinishWorker的start()方法
3. 进入ChooseLockPassword.java文件中的SaveAndFinishWorker类里面执行start()方法,看一下start方法的详细内容。
SaveAndFinishWorker继承于SaveChosenLockWorkerBase类,在SaveAndFinishWorker的satrt方法的最后会执行staart(),这个start是SaveChosenLockWorkerBase类里面的方法。
图3.4 ChooseLockPassword.java文件的SaveAndFinishWorker类里执行start()
- 进入SaveChosenLockWorkerBase类查看具体的start方法。在该start方法中会调用ChooseLockPassword 类的saveAndVerifyInBackground()方法。
图3.5在该start方法中会结束ChooseLockPassword 的saveAndVerifyInBackground()
- ChooseLockPassword 类的saveAndVerifyInBackground(),在这个方法里面会调用LockPatternUtils.java文件的saveLockPassword()方法
图3.6调用LockPatternUtils.java文件的saveLockPassword()方法
- 看具体的LockPatternUtils.java文件的saveLockPassword()方法。进入该方法来保存密码。通过getLockSettings()间接调用LockSettingsService的setLockCredential方法。
saveLockPassword中会做一次密码检查是否有空或者是否是4位,pin只能是4位,再传pin password,类型,userhandle下去。
图3.7通过getLockSettings()间接调用LockSettingsService的setLockCredential方法
a. LockPatternUtils.java文件的getLockSettings()方法。
(在LockSettingsService类的onstart方法中有把mLockSettingService赋值给lock_settings,然后在LockPatternUtils中对其进行调用)。
实际上是:通过AIDL,调用的是 LockSettingsService类的service端的setLockCredential()方法。
图3.8getLockSettings调用的是 LockSettingsService类的lock_settings
b. 通过AIDL,调用的是 LockSettingsService类service端的setLockCredential方法。LockSettingsService类的onstart方法中有把mLockSettingService赋值给lock_settings,然后在第8步被调用了。
图3.9 LockSettingsService类中的start方法
- LockSettingsService.java类。
在第7步中,LockPatternUtils.java文件的setLockCredential()方法中有如下代码:getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD, savedPassword, requestedQuality, userHandle)。
注意:验证都是经过LockSettingsService,然后再到GateKeeper。
所以:通过AIDL,调用的是 LockSettingsService.java service端的setLockCredential方法。
setLockCredential方法会调用setLockCredentialInternal()方法。
- 看一下LockSettingsService的setLockCredential方法:
图3.10调用setLockCredentialInternal()方法
- 看一下LockSettingsService的setLockCredentialInternal()方法,在做writePasswordHash之前,有执行enrollCredential。
图3.11把pin存储起来