0. 先看结果:这套方案解决了什么
如果你也在做 RN + Android 的本地人脸识别,通常会踩这几个坑:
- 密钥硬编码,安全和运维都很被动。
- 激活偶发卡住,前端一直 loading。
- 识别链路断点多,定位问题全靠猜。
- 页面代码和原生代码耦合严重,后续改动风险大。
这篇文章给出的方案,核心是三件事:
- 配置收敛:激活参数改成'配置文件优先,接口兜底'。
- 职责拆分:RN 负责流程与状态,Kotlin 负责引擎与特征处理。
- 排障前置:超时、错误码、脱敏日志、缓存兜底都做在链路里。
1. 一张图看完整链路
业务页面 → RobotMatchUserTrtcScreen → useArcsoftSdk → arcsoftSdkService → 配置来源(本地配置文件 / 后端接口 types=6 / AsyncStorage 缓存)→ ArcFace.initArcFace → ArcFaceModule.kt → ArcFaceConfig.update → ensureActivated → activeOffline / activeOnline → ArcFaceCameraView → ArcFaceCameraController → featureBase64 → ArcFace.validFaceLocal → FaceFeatureStore → FaceImageFeatureExtractor → compareFaceFeature → score 与 threshold 比较
2. 先把地基打牢:Android 工程集成
2.1 SDK 包与 ABI
文件:android/app/build.gradle
dependencies {
implementation files('libs/arcsoft_face.jar')
implementation files('libs/arcsoft_image_util.jar')
}
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
packagingOptions {
pickFirst '**/*.so'
}
}
实战建议:
abiFilters必须和你实际放入libs的 so 架构一致。- 新机器型上线前,先用 release 包做一次 so 完整性检查。
- 如果后续接入更多原生 SDK,优先排查
pickFirst是否掩盖冲突。
2.2 权限与 Manifest
文件:android/app/src/main/AndroidManifest.xml
最小相关权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
说明:
- 用于预览帧提取特征。


