6.5 KiB
Architecture
Analysis Date: 2026-03-30
Pattern Overview
Overall: Flutter Plugin Architecture with Platform Interface Pattern
Key Characteristics:
- Flutter plugin wrapping ArcSoft Face Recognition SDK (Android only)
- Platform interface abstraction for cross-platform extensibility
- Method channel communication between Dart and native Android
- Singleton pattern for native FaceEngine management
- Comprehensive error code enumeration for SDK error handling
Layers
Dart Public API Layer:
- Purpose: Provides user-facing API for face recognition operations
- Location:
lib/arc.dart - Contains: Public methods with detailed documentation
- Depends on:
ArcPlatforminterface - Used by: Flutter applications consuming this plugin
Platform Interface Layer:
- Purpose: Abstract interface for platform-specific implementations
- Location:
lib/arc_platform_interface.dart - Contains: Abstract method definitions, platform instance management
- Depends on:
plugin_platform_interfacepackage - Used by:
Arcclass, mock implementations for testing
Method Channel Layer:
- Purpose: Implements platform interface using Flutter method channels
- Location:
lib/arc_method_channel.dart - Contains: Method channel invocation logic, parameter marshalling
- Depends on: Flutter
MethodChannel,ArcPlatforminterface - Used by: Default platform instance registration
Android Native Plugin Layer:
- Purpose: Handles method channel calls, dispatches to engine manager
- Location:
android/src/main/java/com/xiarui/arc/ArcPlugin.java - Contains: Method call handler, parameter validation, result marshalling
- Depends on:
FaceEngineManager, Flutter plugin APIs - Used by: Flutter engine via plugin registration
Android Engine Manager Layer:
- Purpose: Manages ArcSoft FaceEngine singleton, executes SDK operations
- Location:
android/src/main/java/com/xiarui/arc/FaceEngineManager.java - Contains: SDK activation, engine lifecycle, face detection/extraction/comparison logic
- Depends on: ArcSoft SDK (
arcsoft_face.jar) - Used by:
ArcPluginhandler methods
Data Model Layer:
- Purpose: Encapsulates face information and error codes
- Location:
android/src/main/java/com/xiarui/arc/FaceInfo.java,FaceErrorCode.java - Contains: Data structures for face results, comprehensive error code enumeration
- Depends on: Android SDK (
Rectclass) - Used by: All native layers for data transfer
Data Flow
SDK Activation Flow:
- Flutter app calls
Arc.activeOnline(appId, sdkKey, activeKey) Arcdelegates toArcPlatform.instance.activeOnline()MethodChannelArcinvokes method channel with'activeOnline'ArcPlugin.handleActiveOnline()validates parametersFaceEngineManager.getInstance().activeOnline()calls ArcSoft SDK- Error code mapped to
FaceErrorCodeenum - Result Map returned through method channel to Flutter
Face Detection Flow:
- Flutter app calls
Arc.detectFaces(data, width, height, format) - Method channel invokes
'detectFaces'with byte array payload ArcPlugin.handleDetectFaces()validates image parametersFaceEngineManager.detectFaces()executes SDK face detection- RGB liveness detection processed via
faceEngine.process()andgetLiveness() FaceInfolist converted to Map structure viaconvertFaceInfoToList()- Result includes faceList, rgbLiveness, isRgbAlive
Face Feature Extraction Flow:
- Flutter app calls
Arc.extractFaceFeature()with face rect from detection - Native layer creates
FaceInfoobject from rect coordinates FaceEngineManager.extractFaceFeature()calls SDK extract method- Feature data (byte array) returned in result Map
Feature Comparison Flow:
- Flutter app calls
Arc.compareFaceFeature(featureData1, featureData2, compareModel) - Native layer creates
FaceFeatureobjects from byte arrays FaceEngineManager.compareFaceFeature()executes SDK comparison- Similarity score (0.0-1.0) returned in result Map
State Management:
- Singleton
FaceEngineManagerholdsFaceEngineinstance - Engine initialization state tracked via
isInitializedflag - Last RGB liveness result cached in
lastRgbLivenessfield
Key Abstractions
ArcPlatform Interface:
- Purpose: Platform-agnostic interface for face recognition operations
- Examples:
lib/arc_platform_interface.dart - Pattern: Platform Interface pattern with token verification
FaceEngineManager Singleton:
- Purpose: Centralized management of ArcSoft FaceEngine lifecycle
- Examples:
android/src/main/java/com/xiarui/arc/FaceEngineManager.java - Pattern: Singleton with synchronized getInstance()
FaceErrorCode Enumeration:
- Purpose: Maps SDK numeric error codes to human-readable messages
- Examples:
android/src/main/java/com/xiarui/arc/FaceErrorCode.java - Pattern: Enum with code lookup via
fromCode()
FaceInfo Data Model:
- Purpose: Represents single face detection result
- Examples:
android/src/main/java/com/xiarui/arc/FaceInfo.java - Pattern: JavaBean with
toMap()for Flutter serialization
Entry Points
Flutter Plugin Entry:
- Location:
lib/arc.dart - Triggers: Flutter app imports and instantiates
Arcclass - Responsibilities: Public API facade, delegates to platform interface
Android Plugin Registration:
- Location:
android/src/main/java/com/xiarui/arc/ArcPlugin.java - Triggers: Flutter engine attaches plugin via
onAttachedToEngine() - Responsibilities: Method channel setup, call dispatching
Example App Entry:
- Location:
example/lib/main.dart - Triggers: App launch via
void main() - Responsibilities: Demonstrates SDK activation, engine init, camera-based face detection
Error Handling
Strategy: Consistent Map return structure with success/error fields
Patterns:
- All public methods return
Map<String, dynamic>?with keys:success,errorCode,message - Native layer uses
FaceErrorCode.fromCode()for error mapping - Custom error codes for internal failures (e.g.,
ENGINE_NOT_INITIALIZED = -1) - Flutter layer receives structured error info, no exception throwing for SDK errors
- Platform exceptions caught in example app with
PlatformExceptionhandler
Cross-Cutting Concerns
Logging: Android native uses android.util.Log with tag "FaceEngineManager"
Validation: Native methods validate engine initialization, image dimensions (width %4, height %2 for NV21)
Authentication: SDK requires online activation with appId/sdkKey/activeKey from ArcSoft console
Image Format: NV21 (format code 2050) is primary supported format for camera streams
Architecture analysis: 2026-03-30