登录

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

2017-05-15  本文已影响110人  飞飞飞_Android

开发来源: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中的权限配置
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 接受开机广播的权限
<uses-permission android:name="android.permission.SHUTDOWN"/> 关机权限
<uses-permission android:name="android.permission.DEVICE_POWER" />  电源管理权限
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 无锁屏权限
<uses-permission android:name="android.permission.WAKE_LOCK" /> 锁屏权限
<uses-permission android:name="android.permission.USE_FINGERPRINT"/> 指纹功能权限
<uses-permission android:name="android.permission.REBOOT" /> 重启权限 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
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可以打印出来,分析原因。

需要注意的是:

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中遇到的绊子

上一篇下一篇

猜你喜欢

热点阅读