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 getUserId(): String? = userInfoValue?.userId
fun getUserInfo(): XuqmUserInfo? = userInfoValue
/** /**
* 设置用户信息 所有子 SDK 的统一认证入口登录后调用一次即可 * 设置用户信息 所有子 SDK 的统一认证入口登录后调用一次即可
* *

查看文件

@ -49,4 +49,7 @@ dependencies {
implementation(project(":sdk-core")) implementation(project(":sdk-core"))
implementation("com.squareup.okhttp3:okhttp:4.12.0") implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.google.code.gson:gson:2.10.1") 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 org.json.JSONObject
import java.io.File 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( internal class LogQueue(
private val logApiUrl: String, private val logApiUrl: String,
private val appKey: String, private val appKey: String,
@ -75,7 +79,7 @@ internal class LogQueue(
stack = obj.optString("stack", ""), stack = obj.optString("stack", ""),
fingerprint = Fingerprint.compute("native_crash", obj.optString("message", ""), obj.optString("stack", "")), fingerprint = Fingerprint.compute("native_crash", obj.optString("message", ""), obj.optString("stack", "")),
appKey = obj.optString("appKey", appKey), appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null), userId = obj.optNullableString("userId"),
platform = "android", platform = "android",
appVersion = runCatching { appVersion = runCatching {
appContext.packageManager.getPackageInfo(appContext.packageName, 0).versionName ?: "unknown" appContext.packageManager.getPackageInfo(appContext.packageName, 0).versionName ?: "unknown"
@ -147,7 +151,7 @@ internal class LogQueue(
stack = obj.optString("stack", ""), stack = obj.optString("stack", ""),
fingerprint = obj.optString("fingerprint", ""), fingerprint = obj.optString("fingerprint", ""),
appKey = obj.optString("appKey", appKey), appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null), userId = obj.optNullableString("userId"),
platform = obj.optString("platform", "android"), platform = obj.optString("platform", "android"),
appVersion = obj.optString("appVersion", ""), appVersion = obj.optString("appVersion", ""),
metadata = emptyMap(), metadata = emptyMap(),
@ -165,7 +169,7 @@ internal class LogQueue(
pendingEvents.add(LogEvent( pendingEvents.add(LogEvent(
name = obj.optString("name", ""), name = obj.optString("name", ""),
appKey = obj.optString("appKey", appKey), appKey = obj.optString("appKey", appKey),
userId = obj.optString("userId", null), userId = obj.optNullableString("userId"),
platform = obj.optString("platform", "android"), platform = obj.optString("platform", "android"),
appVersion = obj.optString("appVersion", ""), appVersion = obj.optString("appVersion", ""),
environment = obj.optString("environment", "production"), environment = obj.optString("environment", "production"),

查看文件

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

查看文件

@ -72,12 +72,12 @@ internal object LogUploader {
put("appVersion", issue.appVersion) put("appVersion", issue.appVersion)
put("environment", issue.environment) put("environment", issue.environment)
put("timestamp", issue.timestamp) 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 { private fun eventToJson(event: LogEvent): JSONObject = JSONObject().apply {
put("name", event.name) 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("appKey", event.appKey)
put("userId", event.userId ?: JSONObject.NULL) put("userId", event.userId ?: JSONObject.NULL)
put("platform", event.platform) put("platform", event.platform)

查看文件

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