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>
这个提交包含在:
父节点
b25a27c9f6
当前提交
39f5c4ecf6
@ -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 ?: "")
|
||||
}
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户