feat: sentry integration

This commit is contained in:
Canny 2022-11-10 23:23:21 +03:00
parent e4fe4a6a40
commit 3f027c0701
No known key found for this signature in database
GPG Key ID: 395CCB0AA979F27B
10 changed files with 33 additions and 10 deletions

View File

@ -24,6 +24,7 @@ jobs:
- name: Build with Gradle - name: Build with Gradle
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
run: ./gradlew assembleRelease run: ./gradlew assembleRelease
- name: Sign APK - name: Sign APK
id: sign_apk id: sign_apk

View File

@ -36,7 +36,7 @@ android {
buildConfigField("String", "REVANCED_API_URL", "\"https://releases.revanced.app\"") buildConfigField("String", "REVANCED_API_URL", "\"https://releases.revanced.app\"")
buildConfigField("String", "GITHUB_API_URL", "\"https://api.github.com\"") buildConfigField("String", "GITHUB_API_URL", "\"https://api.github.com\"")
buildConfigField("String", "SENTRY_DSN", System.getenv("SENTRY_DSN") ?: "\"\"")
} }
buildTypes { buildTypes {
@ -129,4 +129,7 @@ dependencies {
implementation("io.ktor:ktor-client-okhttp:$ktorVersion") implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
// Sentry
implementation("io.sentry:sentry-android:6.7.0")
} }

View File

@ -48,6 +48,10 @@
tools:node="remove" /> tools:node="remove" />
</provider> </provider>
<meta-data
android:name="io.sentry.dsn"
android:value="" />
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"

View File

@ -18,10 +18,10 @@ import app.revanced.manager.ui.screen.MainDashboardScreen
import app.revanced.manager.ui.screen.subscreens.* import app.revanced.manager.ui.screen.subscreens.*
import app.revanced.manager.ui.theme.ReVancedManagerTheme import app.revanced.manager.ui.theme.ReVancedManagerTheme
import app.revanced.manager.ui.theme.Theme import app.revanced.manager.ui.theme.Theme
import app.revanced.manager.util.requestAllFilesAccess
import app.revanced.manager.util.requestIgnoreBatteryOptimizations
import com.xinto.taxi.Taxi import com.xinto.taxi.Taxi
import com.xinto.taxi.rememberBackstackNavigator import com.xinto.taxi.rememberBackstackNavigator
import io.sentry.SentryOptions
import io.sentry.android.core.SentryAndroid
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@ -30,6 +30,17 @@ class MainActivity : ComponentActivity() {
@OptIn(ExperimentalAnimationApi::class) @OptIn(ExperimentalAnimationApi::class)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen() installSplashScreen()
SentryAndroid.init(this) {
it.dsn = if (prefs.sentry) BuildConfig.SENTRY_DSN else ""
it.environment = BuildConfig.BUILD_TYPE
it.release = BuildConfig.VERSION_NAME
it.beforeSend = SentryOptions.BeforeSendCallback { event, _ ->
if (prefs.sentry) {
event
} else null
}
}
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
ReVancedManagerTheme( ReVancedManagerTheme(

View File

@ -16,4 +16,5 @@ class PreferencesManager(
var theme by enumPreference("theme", Theme.SYSTEM) var theme by enumPreference("theme", Theme.SYSTEM)
var srcPatches by stringPreference("src_patches", ghPatches) var srcPatches by stringPreference("src_patches", ghPatches)
var srcIntegrations by stringPreference("src_integrations", ghIntegrations) var srcIntegrations by stringPreference("src_integrations", ghIntegrations)
var sentry by booleanPreference("sentry", true)
} }

View File

@ -15,6 +15,7 @@ import io.ktor.client.request.*
import io.ktor.client.statement.* import io.ktor.client.statement.*
import io.ktor.util.cio.* import io.ktor.util.cio.*
import io.ktor.utils.io.* import io.ktor.utils.io.*
import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File
@ -52,6 +53,7 @@ class ManagerAPI(
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e(tag, "An error occurred while downloading patches", e) Log.e(tag, "An error occurred while downloading patches", e)
Sentry.captureException(e)
} }
} }
@ -65,7 +67,6 @@ class ManagerAPI(
file file
} }
} }
} }

View File

@ -7,7 +7,6 @@ import app.revanced.manager.network.dto.GithubContributor
import app.revanced.manager.network.dto.GithubReleases import app.revanced.manager.network.dto.GithubReleases
import app.revanced.manager.network.utils.APIResponse import app.revanced.manager.network.utils.APIResponse
import app.revanced.manager.network.utils.getOrNull import app.revanced.manager.network.utils.getOrNull
import app.revanced.manager.network.utils.getOrThrow
import io.ktor.client.request.* import io.ktor.client.request.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -42,7 +41,6 @@ class GithubServiceImpl(
override suspend fun findAsset(repo: String, file: String): PatchesAsset { override suspend fun findAsset(repo: String, file: String): PatchesAsset {
val releases = getReleases(repo).getOrNull() ?: throw Exception("Cannot retrieve assets") val releases = getReleases(repo).getOrNull() ?: throw Exception("Cannot retrieve assets")
val asset = releases.assets.find { asset -> val asset = releases.assets.find { asset ->
(asset.name.contains(file) && !asset.name.contains("-sources") && !asset.name.contains("-javadoc")) (asset.name.contains(file) && !asset.name.contains("-sources") && !asset.name.contains("-javadoc"))
} ?: throw MissingAssetException() } ?: throw MissingAssetException()

View File

@ -14,6 +14,7 @@ import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.Patch
import app.revanced.patcher.util.patch.PatchBundle import app.revanced.patcher.util.patch.PatchBundle
import dalvik.system.DexClassLoader import dalvik.system.DexClassLoader
import io.sentry.Sentry
import java.util.* import java.util.*
class PatcherUtils(val app: Application) { class PatcherUtils(val app: Application) {
@ -40,6 +41,7 @@ class PatcherUtils(val app: Application) {
} else throw IllegalStateException("No patch bundle(s) selected.") } else throw IllegalStateException("No patch bundle(s) selected.")
} catch (e: Exception) { } catch (e: Exception) {
Log.e(tag, "Failed to load patch bundle.", e) Log.e(tag, "Failed to load patch bundle.", e)
Sentry.captureException(e)
} }
} }

View File

@ -22,13 +22,11 @@ import app.revanced.manager.patcher.aligning.ZipAligner
import app.revanced.manager.patcher.aligning.zip.ZipFile import app.revanced.manager.patcher.aligning.zip.ZipFile
import app.revanced.manager.patcher.aligning.zip.structures.ZipEntry import app.revanced.manager.patcher.aligning.zip.structures.ZipEntry
import app.revanced.manager.patcher.signing.Signer import app.revanced.manager.patcher.signing.Signer
import app.revanced.manager.ui.Resource
import app.revanced.manager.ui.viewmodel.Logging import app.revanced.manager.ui.viewmodel.Logging
import app.revanced.patcher.Patcher import app.revanced.patcher.Patcher
import app.revanced.patcher.PatcherOptions import app.revanced.patcher.PatcherOptions
import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.logging.Logger import app.revanced.patcher.logging.Logger
import app.revanced.patcher.patch.Patch import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
@ -79,6 +77,7 @@ class PatcherWorker(
setForeground(ForegroundInfo(1, createNotification())) setForeground(ForegroundInfo(1, createNotification()))
} catch (e: Exception) { } catch (e: Exception) {
Log.d(tag, "Failed to set foreground info:", e) Log.d(tag, "Failed to set foreground info:", e)
Sentry.captureException(e)
} }
return try { return try {
@ -86,6 +85,7 @@ class PatcherWorker(
Result.success() Result.success()
} catch (e: Exception) { } catch (e: Exception) {
Log.e(tag, "Error while patching: ${e.message ?: e::class.simpleName}") Log.e(tag, "Error while patching: ${e.message ?: e::class.simpleName}")
Sentry.captureException(e)
Result.failure() Result.failure()
} }
} }
@ -176,7 +176,6 @@ class PatcherWorker(
Logging.log += "Failed to apply $patch" + result.exceptionOrNull()!!.cause + "\n" Logging.log += "Failed to apply $patch" + result.exceptionOrNull()!!.cause + "\n"
return@forEach return@forEach
} }
} }
Logging.log += "Saving file\n" Logging.log += "Saving file\n"

View File

@ -12,6 +12,7 @@ import app.revanced.manager.patcher.PatcherUtils
import app.revanced.manager.ui.Resource import app.revanced.manager.ui.Resource
import app.revanced.manager.util.tag import app.revanced.manager.util.tag
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -50,6 +51,7 @@ class AppSelectorViewModel(
Log.d(tag, "Filtered apps.") Log.d(tag, "Filtered apps.")
} catch (e: Exception) { } catch (e: Exception) {
Log.e(tag, "An error occurred while filtering", e) Log.e(tag, "An error occurred while filtering", e)
Sentry.captureException(e)
} }
} }
@ -82,6 +84,7 @@ class AppSelectorViewModel(
) )
} catch (e: Exception) { } catch (e: Exception) {
Log.e(tag, "Failed to load apk", e) Log.e(tag, "Failed to load apk", e)
Sentry.captureException(e)
} }
} }
} }