Android 7.0项目上的指纹老化测试App开发

开发来源:Android7.0项目上,公司测试提出一个老化fingerprint测试的case,运用机械臂去大量测试手机指纹记录其成功失败次数,提出开发app的需求。

具体需求如下:

  1. 异常-开机初始化:
    使用测试APK自动执行手机重启-指纹解锁(使用指纹胶套)-软件判断解锁是否成功以及解锁时间-成功后则自动PASS+1,失败则FAIL+1-手机重启-10000次循环
  2. 中断老化测试:
    打开指纹中长期稳定性APK,手机灭屏,正面握持,手指长按指纹触摸面,手机亮屏解锁APK记录的测试次数加1,2s后自动灭屏,1s后自动解锁亮屏,软件APK记录识别次数,识别成功次数,失败次数,直到次数达到80000次

** 关于framework层的fingerprint相关代码另开贴梳理,该篇主要记录该apk开发过程的问题记录。(该apk在源码环境编译)**

1. 关于manifest中的权限配置
 接受开机广播的权限
 关机权限
  电源管理权限
 无锁屏权限
 锁屏权限
 指纹功能权限
 重启权限 



2.打包成系统apk

manifest中配置shareUserId,代表apk进程是系统进程;
android.mk文件中配置a打包apk签名为platform;

 manifest:  android:sharedUserId="android.uid.system"
 android.mk:  LOCAL_CERTIFICATE := platform 
3.如何开启指纹测试
判断手机是否具有指纹硬件
mFingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
mFingerprintManager.isHardwareDetected()
启动指纹测试
mFingerprintManager.authenticate(null, CancellationSignal, 0, AuthCallback, null);

CancellationSignal,该参数用于cancel服务
AuthCallback,是回调参数,用于传入回调方法

回调方法
private FingerprintManager.AuthenticationCallback mAuthCallback = new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {}
        @Override
        public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {}        
        @Override
        public void onAuthenticationFailed() { }        
        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {} 

指纹识别开始时,都会先会进入onAuthenticationHelp,之后进行指纹判断,fail的话进入onAuthenticationFailed,成功的话进入onAuthenticationSucceeded,如果多次测试失败或者测试被cancel会进入onAuthenticationError,具体的errorCode,errString可以打印出来,分析原因。

需要注意的是:

  • 测试成功进入onAuthenticationSucceeded后,该次测试过程会结束。
  • 测试进入onAuthenticationFailed,测试过程并不会停止,会继续捕捉指纹进行识别,直到识别5次失败后,进入onAuthenticationError,测试过程才会结束。
  • 当然如果有需要的话,我们可以在fail后通过调用mCancellationSignal.cancel()方法结束测试。
4. 系统默认指纹测试必须当apk前台时进行
  private boolean canUseFingerprint(String opPackageName, boolean requireForeground, int uid,
        int pid) {
    ...  if (requireForeground && !(isForegroundActivity(uid, pid) || currentClient(opPackageName))){
        Slog.w(TAG, "Rejecting " + opPackageName + " ; not in foreground");
        return false;
    }  }

FingerprintService.java中有代码如上,当opPackageName该apk试图进行指纹识别,但该apk并不在前台,则会报错reject。解决办法如下,直接对某些需要使用指纹识别测试的apk赋予非前台运行的逻辑:

 if (isKeyguard(opPackageName) || "com.huaqin.hqlock".equals(opPackageName)) {
        return true; // Keyguard is always allowed
    }

以上4点是开发apk中遇到的绊子

你可能感兴趣的:(Android 7.0项目上的指纹老化测试App开发)