XuqmGroup
|
06f7b9d44d
|
feat(bugcollect): 为每次打包生成独立 buildId,支持相同版本多包溯源
- Gradle 插件在配置阶段生成 yyyyMMddHHmmss 格式的 buildId,通过
BuildConfig.XUQM_BUILD_ID 注入 APK,并作为 buildId 字段上传 sourcemap
- SDK 通过反射读取 BuildConfig.XUQM_BUILD_ID,在所有事件
(captureError/captureCrash/warn) 的 IssueEvent 中携带 buildId
- LogUploader 序列化时将 buildId 写入上报 JSON
- IssueEvent 新增 buildId 可选字段
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-22 16:46:41 +08:00 |
|
XuqmGroup
|
ffafd94a1e
|
chore(bugcollect): 清理调试日志,准备发布正式版本
|
2026-06-18 21:15:55 +08:00 |
|
XuqmGroup
|
84c9eb5e7a
|
fix(bugcollect): 修复上传流程 - pendingErrors 队列、动态 URL、相对路径补全
|
2026-06-18 20:12:00 +08:00 |
|
XuqmGroup
|
8d0dd0a41d
|
debug: uploadIssues 日志改为 Log.w
|
2026-06-18 19:45:14 +08:00 |
|
XuqmGroup
|
35bf96f89f
|
debug(bugcollect): 添加 uploadIssues 日志
|
2026-06-18 19:40:29 +08:00 |
|
XuqmGroup
|
d742317c4d
|
fix(bugcollect): LogUploader 自动将相对路径补全为绝对 URL
- bugCollectApiUrl 为相对路径时,基于 XuqmSDK.platformUrl 拼接完整地址
- 修复 'Expected URL scheme http or https' 异常
|
2026-06-18 19:06:03 +08:00 |
|
XuqmGroup
|
e180003386
|
fix(sdk-bugcollect): BugCollectInitProvider 添加 CrashCapture import
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-18 16:25:35 +08:00 |
|
XuqmGroup
|
b7c7a2c385
|
perf(sdk-core): 合并 ContentProvider + PBKDF2 缓存,冷启动从 ~350ms 降到 ~7ms
优化内容:
- 新增 XuqmMergedProvider:合并 3 个 Provider 为 1 个,主线程只读文件字节
- 新增 ConfigCache:EncryptedSharedPreferences 持久化缓存解密结果
- ConfigFileReader 新增 readRawBytes() / readWithCache(),单例内存缓存
- XuqmSDK 新增 autoInitializeFromBytes():IO 线程完成解密+初始化
- BugCollectInitProvider 改为兼容 fallback,检查 isInitialized() 跳过
- XuqmInitializerProvider 标记 @Deprecated
性能对比:
优化前:主线程 ~350ms(PBKDF2 + 文件扫描 + 3 个 Provider 实例化)
优化后:主线程 ~7ms(文件发现 + 读字节),后续启动 ~3ms(读缓存)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-18 15:58:53 +08:00 |
|
XuqmGroup
|
ba6de0a5fd
|
perf(sdk): ContentProvider 异步初始化,减少冷启动阻塞时间
- XuqmInitializerProvider 改用 autoInitializeAsync(),TokenStore/DeviceId/ApiClient 移到 IO 线程
- XuqmSDK 新增 readAppKey() 公开方法,仅读取 config 不做初始化
- BugCollectInitProvider 适配异步初始化,直接读取 appKey 注册崩溃拦截器
- 同步阶段只做 config 文件读取(~5ms),主线程不再阻塞
|
2026-06-18 14:53:34 +08:00 |
|
XuqmGroup
|
aca0d009a8
|
feat(bugcollect): 使用 deviceId 作为 userId 兜底,保障影响设备数统计
- XuqmSDK 新增 deviceId 属性:首次生成 UUID 存入 SharedPreferences,后续不变
- BugCollect 上报事件时 userId 改为 getUserId() ?: deviceId,未登录也能统计影响设备数
- BugCollectInitProvider 崩溃拦截同步使用 deviceId 兜底
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-18 10:47:38 +08:00 |
|
XuqmGroup
|
77fef3a38b
|
refactor(bugcollect): 注册与 URL 完全解耦
注册 UncaughtExceptionHandler 不需要 URL:
- CrashCapture.start 移除 logApiUrl 参数,只需 appContext + appKey
- LogStorage.saveCrash 移除 logApiUrl,崩溃文件不再存储 URL
- LogQueue.uploadPendingCrashes 上传时直接取 XuqmSDK.bugCollectApiUrl,
URL 为 null 则跳过(下次启动重试),不依赖崩溃文件里的历史 URL
- BugCollect.startCrashCapture 移除 URL 构造逻辑
- BugCollectInitProvider Phase 1 纯粹只注册,彻底消除对 platformUrl 的依赖,
版本兼容问题从根本上消失
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-18 10:18:08 +08:00 |
|
XuqmGroup
|
be8eeba9e1
|
fix(bugcollect): BugCollectInitProvider 对旧版 sdk-core 防御降级
platformUrl 是新增属性,旧版 sdk-core 没有对应的 getPlatformUrl()。
改用 runCatching 包住调用,NoSuchMethodError 时记录警告、跳过崩溃拦截,
不再因版本不一致导致 app 启动崩溃。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-18 10:16:05 +08:00 |
|
XuqmGroup
|
54b3163f53
|
refactor(bugcollect): 崩溃收集与上传分离,sdk-core 保持独立
设计问题:
- 之前用反射在 XuqmInitializerProvider 里调用 BugCollect,sdk-core 隐式依赖 sdk-bugcollect
- startCrashCapture 同时负责注册拦截器和触发上传,两者生命周期不同
新架构:
- sdk-core 完全干净,XuqmInitializerProvider 还原为只调用 autoInitialize
- sdk-bugcollect 自注册 BugCollectInitProvider(initOrder=89)
- Phase 1(同步):core init 完成后立即注册 UncaughtExceptionHandler,用
platformUrl 派生兜底 URL,落盘不依赖远端配置
- Phase 2(异步):awaitInitialization() 后用最新 bugCollectApiUrl 上传积压崩溃
- BugCollect.uploadPendingCrashes() 公开,供 Phase 2 调用
- startCrashCapture() 保持幂等,app 侧可选择性调用,不影响自动流程
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-18 10:11:08 +08:00 |
|
XuqmGroup
|
e300cbdb83
|
fix(bugcollect): 修复崩溃文件未写入导致 fatal crash 不上报的 bug
根本原因:CrashCapture 调用无 Context 的 LogStorage.saveCrash 重载,
该重载通过反射获取 packageName 失败时返回空字符串,
导致崩溃文件路径变为 /data/data//files/xuqm_crashes(无效),
mkdirs() 静默失败,崩溃文件未写入,下次启动无数据可上报。
修复:
- CrashCapture.start() 新增 appContext: Context 参数
- 改为调用带 Context 的 saveCrash 重载,依赖 context.filesDir 获取可靠路径
- BugCollect.startCrashCapture() 传入 XuqmSDK.appContext
- LogStorage 删除不可靠的无 Context 重载及 getPackageName() 反射代码
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-18 09:43:47 +08:00 |
|
XuqmGroup
|
4896f24af8
|
feat(bugcollect): SDK v1.1.0 — 修复 packageName 缺失导致 captureError 静默失败
Root cause: SdkPlatformConfigApi.fetchConfig 未传 packageName → 服务端返回400
→ bugCollectEnabled=false → captureError 是空操作
修复内容:
- SdkPlatformConfigApi: 增加 packageName 查询参数
- SdkPlatformConfig: 修正字段名 bugCollectApiUrl/features.bugCollect
- XuqmSDK: 传入 appContext.packageName,读取 features?.bugCollect
- Fingerprint: 使用 exceptionType(类名)替代 level 字符串,避免同一崩溃按级别分桶
- IssueEvent: 增加 eventId、breadcrumbs、DeviceInfo 扩展字段
- BugCollect: 增加 addBreadcrumb(),captureError/captureCrash 附加面包屑和设备信息
- LogUploader: 序列化 eventId/breadcrumbs/expanded device
- LogQueue: 崩溃恢复使用 exceptionType 重建 fingerprint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-17 15:30:40 +08:00 |
|
XuqmGroup
|
c8a482a5c0
|
refactor: sdk-log → sdk-bugcollect
- 目录/包名/类名/Gradle plugin 全部重命名
- XLog → BugCollect
- logApiUrl/logEnabled → bugCollectApiUrl/bugCollectEnabled
- assembleDebug 通过
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-16 17:39:23 +08:00 |
|