feat(sample): 集成 Sentry 异常监控功能
- 添加 Sentry Android SDK 依赖 (版本 8.39.1) - 在 sample-app 中集成 Sentry 监控插件 - 添加 Sentry 初始化配置到应用 Application 类 - 在 MainActivity 中添加异常上报测试按钮 - 添加闪退测试功能用于验证 Sentry 监控 - 更新 AndroidManifest.xml 配置应用入口点 - 添加新的 gradle wrapper 文件支持项目构建 - 创建 sdk-core、sdk-im、sdk-push、sdk-update 模块基础结构 - 配置各 SDK 模块的 build.gradle.kts 文件 - 更新 libs.versions.toml 添加 Sentry 版本定义
这个提交包含在:
父节点
598776eafa
当前提交
3e66380802
12147
.gitignore
vendored
12147
.gitignore
vendored
文件差异内容过多而无法显示
加载差异
@ -17,6 +17,7 @@ gson = "2.13.2"
|
|||||||
jserialization = "1.9.0"
|
jserialization = "1.9.0"
|
||||||
webkit = "1.14.0"
|
webkit = "1.14.0"
|
||||||
coil = "2.7.0"
|
coil = "2.7.0"
|
||||||
|
sentryAndroid = "8.39.1"
|
||||||
junit4 = "4.13.2"
|
junit4 = "4.13.2"
|
||||||
androidxJunit = "1.3.0"
|
androidxJunit = "1.3.0"
|
||||||
espresso = "3.7.0"
|
espresso = "3.7.0"
|
||||||
@ -40,6 +41,7 @@ androidx-datastore-preferences = { group = "androidx.datastore", name = "datasto
|
|||||||
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "jserialization" }
|
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "jserialization" }
|
||||||
androidx-webkit = { group = "androidx.webkit", name = "webkit", version.ref = "webkit" }
|
androidx-webkit = { group = "androidx.webkit", name = "webkit", version.ref = "webkit" }
|
||||||
coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
|
coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
|
||||||
|
sentry-android = { group = "io.sentry", name = "sentry-android", version.ref = "sentryAndroid" }
|
||||||
retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
||||||
retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" }
|
retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" }
|
||||||
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
|
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
|
||||||
|
|||||||
二进制
gradle/wrapper/gradle-wrapper.jar
vendored
可执行文件
二进制
gradle/wrapper/gradle-wrapper.jar
vendored
可执行文件
二进制文件未显示。
7
gradle/wrapper/gradle-wrapper.properties
vendored
普通文件
7
gradle/wrapper/gradle-wrapper.properties
vendored
普通文件
@ -0,0 +1,7 @@
|
|||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
|
||||||
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
22
gradlew
vendored
可执行文件
22
gradlew
vendored
可执行文件
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
DIRNAME=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
|
JAVA_CMD=${JAVA_HOME:-}/bin/java
|
||||||
|
|
||||||
|
if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_CMD" ]; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
JAVA_CMD=java
|
||||||
|
fi
|
||||||
|
|
||||||
|
CLASSPATH=$DIRNAME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
exec "$JAVA_CMD" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
||||||
6
gradlew.bat
vendored
普通文件
6
gradlew.bat
vendored
普通文件
@ -0,0 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
set CLASSPATH=%DIRNAME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
java -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
8
local.properties
普通文件
8
local.properties
普通文件
@ -0,0 +1,8 @@
|
|||||||
|
## This file must *NOT* be checked into Version Control Systems,
|
||||||
|
# as it contains information specific to your local configuration.
|
||||||
|
#
|
||||||
|
# Location of the SDK. This is only used by Gradle.
|
||||||
|
# For customization when using a Version Control System, please read the
|
||||||
|
# header note.
|
||||||
|
#Wed Apr 22 12:00:36 CST 2026
|
||||||
|
sdk.dir=/Users/xuqinmin/Library/Android/sdk
|
||||||
@ -1,7 +1,8 @@
|
|||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.android.application)
|
alias(libs.plugins.android.application)
|
||||||
alias(libs.plugins.kotlin.compose)
|
alias(libs.plugins.kotlin.compose)
|
||||||
id("org.jetbrains.kotlin.android") version "2.3.10"
|
|
||||||
|
id("io.sentry.android.gradle") version "6.4.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@ -27,7 +28,6 @@ android {
|
|||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions { jvmTarget = "11" }
|
|
||||||
buildFeatures { compose = true }
|
buildFeatures { compose = true }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,6 +36,7 @@ dependencies {
|
|||||||
implementation(project(":sdk-im"))
|
implementation(project(":sdk-im"))
|
||||||
implementation(project(":sdk-push"))
|
implementation(project(":sdk-push"))
|
||||||
implementation(project(":sdk-update"))
|
implementation(project(":sdk-update"))
|
||||||
|
implementation(libs.sentry.android)
|
||||||
implementation(platform(libs.androidx.compose.bom))
|
implementation(platform(libs.androidx.compose.bom))
|
||||||
implementation(libs.bundles.compose)
|
implementation(libs.bundles.compose)
|
||||||
implementation(libs.androidx.activity.compose)
|
implementation(libs.androidx.activity.compose)
|
||||||
|
|||||||
@ -7,7 +7,8 @@
|
|||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:label="XuqmSDK Demo"
|
android:label="XuqmSDK Demo"
|
||||||
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
|
android:name=".XuqmSampleApp"
|
||||||
|
android:theme="@android:style/Theme.Material.Light.NoActionBar">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
@ -25,5 +26,6 @@
|
|||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
android:resource="@xml/file_paths" />
|
android:resource="@xml/file_paths" />
|
||||||
</provider>
|
</provider>
|
||||||
</application>
|
|
||||||
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@ -20,6 +20,8 @@ import com.xuqm.sdk.im.model.ImMessage
|
|||||||
import com.xuqm.sdk.im.model.MsgType
|
import com.xuqm.sdk.im.model.MsgType
|
||||||
import com.xuqm.sdk.update.UpdateSDK
|
import com.xuqm.sdk.update.UpdateSDK
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -112,6 +114,35 @@ fun SdkDemoScreen() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Card {
|
||||||
|
Column(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
|
Text("Sentry 测试", style = MaterialTheme.typography.titleMedium)
|
||||||
|
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
|
Button(onClick = {
|
||||||
|
scope.launch {
|
||||||
|
val result = withContext(Dispatchers.IO) {
|
||||||
|
val eventId = Sentry.captureException(
|
||||||
|
IllegalStateException("This app uses Sentry! :)")
|
||||||
|
) { eventScope ->
|
||||||
|
eventScope.setTag("source", "main_activity_button")
|
||||||
|
eventScope.setLevel(SentryLevel.ERROR)
|
||||||
|
}
|
||||||
|
val flushed = Sentry.flush(5_000)
|
||||||
|
eventId to flushed
|
||||||
|
}
|
||||||
|
messages.add("[Sentry] 已发送: ${result.first}, flush=${result.second}")
|
||||||
|
}
|
||||||
|
}) { Text("上报异常") }
|
||||||
|
|
||||||
|
Button(onClick = {
|
||||||
|
throw RuntimeException("Uncaught crash test for Sentry")
|
||||||
|
}, colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error)) {
|
||||||
|
Text("闪退测试")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Card {
|
Card {
|
||||||
Column(Modifier.padding(12.dp)) {
|
Column(Modifier.padding(12.dp)) {
|
||||||
Text("消息日志", style = MaterialTheme.typography.titleMedium)
|
Text("消息日志", style = MaterialTheme.typography.titleMedium)
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
package com.xuqm.sdk.sample
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
|
||||||
|
class XuqmSampleApp : Application() {
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,6 @@
|
|||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.android.library)
|
alias(libs.plugins.android.library)
|
||||||
alias(libs.plugins.kotlin.serialization)
|
alias(libs.plugins.kotlin.serialization)
|
||||||
id("org.jetbrains.kotlin.android") version "2.3.10"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@ -17,7 +16,6 @@ android {
|
|||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions { jvmTarget = "11" }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.android.library)
|
alias(libs.plugins.android.library)
|
||||||
id("org.jetbrains.kotlin.android") version "2.3.10"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@ -16,7 +15,6 @@ android {
|
|||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions { jvmTarget = "11" }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.android.library)
|
alias(libs.plugins.android.library)
|
||||||
id("org.jetbrains.kotlin.android") version "2.3.10"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@ -16,7 +15,6 @@ android {
|
|||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions { jvmTarget = "11" }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.android.library)
|
alias(libs.plugins.android.library)
|
||||||
id("org.jetbrains.kotlin.android") version "2.3.10"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
@ -16,7 +15,6 @@ android {
|
|||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
kotlinOptions { jvmTarget = "11" }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户