0. 先看结果:这套方案解决了什么
如果你也在做 RN + Android 的本地人脸识别,通常会踩这几个坑:
- 密钥硬编码,安全和运维都很被动。
- 激活偶发卡住,前端一直 loading。
- 识别链路断点多,定位问题全靠猜。
- 页面代码和原生代码耦合严重,后续改动风险大。
这篇文章给出的方案,核心是三件事:
- 配置收敛:激活参数改成'配置文件优先,接口兜底'。
- 职责拆分:RN 负责流程与状态,Kotlin 负责引擎与特征处理。
- 排障前置:超时、错误码、脱敏日志、缓存兜底都做在链路里。
1. 一张图看完整链路
业务页面:RobotMatchUserTrtcScreen
useArcsoftSdkarcsoftSdkService- 配置来源:本地配置文件 / 后端接口 types=6 / AsyncStorage 缓存
ArcFace.initArcFaceArcFaceModule.ktArcFaceConfig.updateensureActivatedactiveOffline / activeOnlineArcFaceCameraViewArcFaceCameraControllerfeatureBase64ArcFace.validFaceLocalFaceFeatureStoreFaceImageFeatureExtractorcompareFaceFeature- 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 =/>


