Initial commit: 91dj android client dev_1.0.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
谢宇宁
2026-10-08 11:37:25 +07:00
co-authored by Claude Opus 5.5
commit 97dd6a739a
1262 changed files with 119813 additions and 0 deletions
@@ -0,0 +1,52 @@
import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:path_provider/path_provider.dart';
import 'package:analytics_sdk/utils/uuid_util.dart';
const _kFingerprintFileName = 'analytics_fingerprint.txt';
/// 原生平台设备指纹生成
///
/// **生成规则**
/// 1. 将非空因子用 `|` 拼接后做 SHA-256,取 64 位十六进制作为指纹。
/// 因子:deviceId、device、deviceBrand、deviceModel、systemName、systemVersion。
/// 2. 若所有因子均为空(降级场景),则生成 UUID v4 并持久化至
/// `applicationDocumentsDirectory/analytics_fingerprint.txt`,
/// 后续从文件读取保证稳定。
///
/// 任何异常均返回空字符串,不影响正常上报。
Future<String> generateOrLoadFingerprint({
String deviceId = '',
String device = '',
String deviceBrand = '',
String deviceModel = '',
String systemName = '',
String systemVersion = '',
String userAgent = '', // 原生端不使用,仅保持接口与 Web 端一致
}) async {
try {
final factors = [deviceId, device, deviceBrand, deviceModel, systemName, systemVersion]
.where((f) => f.isNotEmpty)
.toList();
if (factors.isNotEmpty) {
final digest = sha256.convert(utf8.encode(factors.join('|')));
return digest.toString();
}
// 所有因子为空时降级为持久化 UUID v4
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$_kFingerprintFileName');
if (await file.exists()) {
final existing = (await file.readAsString()).trim();
if (existing.isNotEmpty) return existing;
}
final fp = generateUuidV4();
await file.writeAsString(fp);
return fp;
} catch (_) {
return '';
}
}