开发来源:Android7.0项目上,公司测试提出一个老化fingerprint测试的case,运用机械臂去大量测试手机指纹记录其成功失败次数,提出开发app的需求。
具体需求如下:
- 异常-开机初始化:
使用测试APK自动执行手机重启-指纹解锁(使用指纹胶套)-软件判断解锁是否成功以及解锁时间-成功后则自动PASS+1,失败则FAIL+1-手机重启-10000次循环 - 中断老化测试:
打开指纹中长期稳定性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可以打印出来,分析原因。
需要注意的是:
- 测试成功进入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中遇到的绊子
网友评论