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 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 ?: "")
|
||||||
}
|
}
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户