修改Android 12解锁失败等待时间规则详解( 二 )


2、默认锁屏第三次尝试解锁时候,并不是5次 。
3、就算你强制能让第三次尝试的还能输入密码尝试解锁,但是系统下边是锁定的,并不能进行正常的解锁尝试(即输入的正常密码,并不能解锁成功,返回仍然是失败)
因此,根据需求要做成全局的,就找到根源把这个返回时间修改成自己想要的这样,所有实现这个回调的应用都能获取到新制定规则的时间(这里是指(其实每个应用)那边其实也是实现这边的回调接口,然后系统返回这个时间都能接受到最新的时间规则) 。
这样就一直追,追到了这个类.cpp 。(其实做系统开发,修改或者添加功能,就是找到一个突破口,一直追追)其实真正的返回时间的是在这里写好的 。如下:
///.cpp 的函数
原生代码:
/** Calculates the timeout in milliseconds as a function of the failure* counter 'x' as follows:** [0, 4] -> 0* 5 -> 30* [6, 10] -> 0* [11, 29] -> 30* [30, 139] -> 30 * (2^((x - 30)/10))* [140, inf) -> 1 day**/uint32_t GateKeeper::ComputeRetryTimeout(const failure_record_t *record) {static const int failure_timeout_ms = 30000;if (record->failure_counter == 0) return 0;if (record->failure_counter > 0 && record->failure_counter <= 10) {if (record->failure_counter % 5 == 0) {return failure_timeout_ms;}else {return 0;}} else if (record->failure_counter < 30) {return failure_timeout_ms;} else if (record->failure_counter < 140) {return failure_timeout_ms << ((record->failure_counter - 30) / 10);}return DAY_IN_MS;}
根据上边可以看出,30000这个数字很敏感嘛,系统一直返回的就是这个,终于找到了,是一个固定值 。其实细看这个方法可以看出来,它是通过记录失败的次数然后进行了判断,返回时间间隔 。
总结上边代码:
1、当失败0次,返回0ms
2、当失败大于0,失败小于10次,就是当前两次时,每次失败5次后,返回,意思是这总前两次都可以尝试5次机会
3、当失败次数小于30次,就是当总次数是10次到30次时,返回,意思是第二次以后为每次就只有一次尝试机会解锁,就要等待时间 。直到总次数为30次时 。
4、当总次数大于30次到140次,就是需要左移运算出毫秒数 。
这里有两种次数,一种是每次解锁都有5次尝试机会(但是只有前两次),后边每次都要等待时间,这里就是前边我们遇到的问题 。
因此修改这个方法的规则,解决问题
修改后代码:
uint32_t GateKeeper::ComputeRetryTimeout(const failure_record_t *record) {static const int failure_timeout_ms = 60*1000;if (record->failure_counter == 0) return 0;if (record->failure_counter > 0) {if (record->failure_counter % 5 == 0) {if(record->failure_counter/5 == 1){return 2*failure_timeout_ms;}else if(record->failure_counter/5 == 2){return 5*failure_timeout_ms;}else if(record->failure_counter/5 == 3){return 15*failure_timeout_ms;}else if(record->failure_counter/5 == 4){return 30*failure_timeout_ms;}else if(record->failure_counter/5 == 5){return 60*failure_timeout_ms;}else if(record->failure_counter/5 >= 6){return 120*failure_timeout_ms;}}else {return 0;}}return 2*failure_timeout_ms;}
这样,我们就修改了它原生的规则 。实现时间的动态改变,随着尝试次数的增加 。
写到这已经满足了需求上的前两条需求了,现在就要满足实现第三条关机重启仍然能计算时间 。
根据逻辑如下代码:
void onPasswordChecked(int userId, boolean matched, int timeoutMs, boolean isValidPassword) {boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId;if (matched) {getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);if (dismissKeyguard) {mDismissing = true;mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);getKeyguardSecurityCallback().dismiss(true, userId);}} else {if (isValidPassword) {getKeyguardSecurityCallback().reportUnlockAttempt(userId, false, timeoutMs);if (timeoutMs > 0) {long deadline = mLockPatternUtils.setLockoutAttemptDeadline(userId, timeoutMs);handleAttemptLockout(deadline);}}if (timeoutMs == 0) {mMessageAreaController.setMessage(mView.getWrongPasswordStringId());}mView.resetPasswordText(true /* animate */, false /* announce deletion if no match */);}}