fix: sdk-log 编译修复 + sdk-core/sdk-webview 类型修正

- sdk-log: AGP 9.x mappingFileProvider 适配、LogQueue optNullableString
- sdk-core: 移除重复 getUserInfo() 函数
- sdk-webview: XuqmSDK.getUserInfo() → .userInfo 属性访问

Co-Authored-By: Claude <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-06-16 13:46:01 +08:00
父节点 b25a27c9f6
当前提交 39f5c4ecf6
共有 6 个文件被更改,包括 21 次插入10 次删除

查看文件

@ -270,8 +270,6 @@ object XuqmSDK {
fun getUserId(): String? = userInfoValue?.userId
fun getUserInfo(): XuqmUserInfo? = userInfoValue
/**
* 设置用户信息 所有子 SDK 的统一认证入口登录后调用一次即可
*

查看文件

@ -49,4 +49,7 @@ dependencies {
implementation(project(":sdk-core"))
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.google.code.gson:gson:2.10.1")
// Gradle Plugin classes need Gradle API + AGP on compile classpath
compileOnly(gradleApi())
compileOnly("com.android.tools.build:gradle:9.1.0")
}

查看文件

@ -13,6 +13,10 @@ import org.json.JSONArray
import org.json.JSONObject
import java.io.File
/** [JSONObject.optString] returns non-null on newer Android; this returns null when the key is absent or the value is null. */
private fun JSONObject.optNullableString(key: String): String? =
if (has(key) && !isNull(key)) optString(key) else null
internal class LogQueue(
private val logApiUrl: String,
private val appKey: String,
@ -75,7 +79,7 @@ internal class LogQueue(
stack = obj.optString("stack", ""),
fingerprint = Fingerprint.compute("native_crash", obj.optString("message", ""), obj.optString("stack", "")),
appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null),
userId = obj.optNullableString("userId"),
platform = "android",
appVersion = runCatching {
appContext.packageManager.getPackageInfo(appContext.packageName, 0).versionName ?: "unknown"
@ -147,7 +151,7 @@ internal class LogQueue(
stack = obj.optString("stack", ""),
fingerprint = obj.optString("fingerprint", ""),
appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null),
userId = obj.optNullableString("userId"),
platform = obj.optString("platform", "android"),
appVersion = obj.optString("appVersion", ""),
metadata = emptyMap(),
@ -165,7 +169,7 @@ internal class LogQueue(
pendingEvents.add(LogEvent(
name = obj.optString("name", ""),
appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null),
userId = obj.optNullableString("userId"),
platform = obj.optString("platform", "android"),
appVersion = obj.optString("appVersion", ""),
environment = obj.optString("environment", "production"),

查看文件

@ -1,5 +1,6 @@
package com.xuqm.sdk.log.gradle
import com.android.build.api.variant.ApplicationVariant
import com.android.build.gradle.AppExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
@ -8,6 +9,7 @@ class XuqmLogPlugin : Plugin<Project> {
override fun apply(target: Project) {
val android = target.extensions.findByType(AppExtension::class.java) ?: return
@Suppress("DEPRECATION")
android.applicationVariants.all { variant ->
if (!variant.buildType.isMinifyEnabled) return@all
@ -26,7 +28,11 @@ class XuqmLogPlugin : Plugin<Project> {
)
task.appVersion.set(variant.versionName)
task.platform.set("android")
task.mappingFile.set(variant.mappingFileProvider)
task.mappingFile.set(
variant.mappingFileProvider.map { files ->
target.layout.projectDirectory.file(files.singleFile.absolutePath)
}
)
}
variant.assembleProvider.configure { it.finalizedBy(uploadTask) }

查看文件

@ -72,12 +72,12 @@ internal object LogUploader {
put("appVersion", issue.appVersion)
put("environment", issue.environment)
put("timestamp", issue.timestamp)
put("metadata", JSONObject(issue.metadata as? Map<String, Any?> ?: emptyMap()))
put("metadata", JSONObject(issue.metadata as? Map<String, Any?> ?: emptyMap<String, Any?>()))
}
private fun eventToJson(event: LogEvent): JSONObject = JSONObject().apply {
put("name", event.name)
put("properties", JSONObject(event.properties as? Map<String, Any?> ?: emptyMap()))
put("properties", JSONObject(event.properties as? Map<String, Any?> ?: emptyMap<String, Any?>()))
put("appKey", event.appKey)
put("userId", event.userId ?: JSONObject.NULL)
put("platform", event.platform)

查看文件

@ -45,11 +45,11 @@ object XWebViewStandardHandlers {
}
private fun handleGetUserInfo(): String {
val userInfo = XuqmSDK.getUserInfo()
val userInfo = XuqmSDK.userInfo
if (userInfo == null) return errorResponse("not logged in")
val data = JSONObject().apply {
put("userId", userInfo.userId ?: "")
put("nickname", userInfo.nickname ?: "")
put("nickname", userInfo.name ?: "")
put("avatar", userInfo.avatar ?: "")
put("phone", userInfo.phone ?: "")
}