android - Sentry 的 Gradle 任务未编译
问题描述
我必须将分析工具Sentry添加到我们的 Android 项目中。为了使其工作,需要为混淆代码(来自 Proguard/R8)创建映射,然后将其上传到 Sentry。
在网站https://docs.sentry.io/platforms/android/上甚至描述了如何做到这一点。那里写道,需要创建一个如下所示的 gradle 任务:
gradle.projectsEvaluated {
android.applicationVariants.each { variant ->
def variantName = variant.name.capitalize();
def proguardTask = project.tasks.findByName(
"transformClassesAndResourcesWithProguardFor${variantName}")
def dexTask = project.tasks.findByName(
"transformClassesWithDexFor${variantName}")
def task = project.tasks.create(
name: "processSentryProguardFor${variantName}",
type: Exec) {
workingDir project.rootDir
commandLine *[
"sentry-cli",
"upload-proguard",
"--write-properties",
"${project.rootDir.toPath()}/app/build/intermediates/assets" +
"/${variant.dirName}/sentry-debug-meta.properties",
variant.getMappingFile(),
"--no-upload"
]
}
dexTask.dependsOn task
task.dependsOn proguardTask
}
}
这将等到 Proguard 完成,然后将此属性文件复制到资产。但是,当我将此添加到我的 Android gradle 脚本时,我收到错误:
无法创建任务 ':app:processSentryProguardForPlayStoreStagingDebug'。
方法没有签名:java.util.ArrayList.multiply() 适用于参数类型:(ArrayList) 值:[[sentry-cli, upload-proguard, --write-properties, {Application-Path}/app/build /intermediates/assets/playStoreStaging/debug/sentry-debug-meta.properties, ...]] 可能的解决方案:multiply(java.lang.Number), multiply(java.lang.Number)
我认为 commandLine 数组之前的乘法符号 * 有问题。但是当我删除它时,我得到了错误
无法创建任务 ':app:processSentryProguardForPlayStoreStagingDebug'。
无法将具有类“java.lang.String”的对象“sentry-cli”转换为类“int”
所以我试着只用那一行来测试这个
commandLine "sentry-cli", ...
这给了我另一个错误
出了什么问题:无法在空对象上调用方法 dependsOn()
因此,我认为该 gradle 脚本确实出了问题,因为似乎无法找到依赖任务。有谁知道如何解决这个问题(或者有任何其他想法如何在 Proguard/R8 完成后以另一种方式将该 sentry-debug-meta.properties 文件复制到我的资产中)?
谢谢!
- - - - 编辑 - - - -
我注意到了一些重要的事情。gradle 任务的定义名称与手册中定义的名称不同。查看我的任务,我将它们命名为
transformClassesAndResourcesWithR8For...
和
transformClassesWithDexBuilderFor...
但是,我打印了 variantName 然后进行检查,但似乎我的任务不完整。
在我的任务列表中存在
transformClassesAndResourcesWithR8ForPlayStoreStagingDebug
但不是
transformClassesAndResourcesWithR8ForPlayStoreStagingRelease
因此找不到任务。我认为这是真正的问题。那么这些 gradle 任务是在哪里定义的呢?
-------- 编辑 2 --------
好吧,我注意到这里有些奇怪。一些变体没有任务。DEBUG 任务没有 R8 任务是有道理的,但我在这里找到了这个:
变体:PlayStoreStagingRelease DexTask 为空
变体:PlayStorePreviewRelease DexTask 为空
变体:HockeyAppRelease DexTask 为空
变体:LocalServerRelease DexTask 为空
变体:PlayStoreProductionRelease DexTask 为空
那么这怎么可能呢?
解决方案
我建议使用此处描述的 Sentry Gradle 集成(Gradle 插件)https://docs.sentry.io/platforms/android/#gradle-integration
官方的 Android Gradle 插件在版本上更改了任务名称,Gradle 版本也会影响这些代码片段。
谷歌还用 R8 替换了 Proguard,它也影响了这些代码片段。
有没有理由不使用 Sentry Gradle 集成?如果是这样,我们将考虑更新它们。
谢谢。
推荐阅读
- visual-studio-code - 发布 VSCode 扩展后缺少 SVG 图标
- twilio - 即使升级后也无法从 twilio 向未经验证的用户发送 otp 短信
- amazon-web-services - 允许从特定账户的所有 EC2 实例访问 S3 存储桶
- ldap - 身份验证/授权提供商:为 1 天的项目选择哪一个?
- php - 如何使用php对数据库中的列求和
- r - 如何将字符串向量映射为函数的参数?
- mysql - MySQL 选择 id from to 并排除开始和结束 id
- rstudio - 包被存储在临时文件中
- java - 从函数返回,一旦函数中的值为空
- sql - 如何简单地转动桌子(枢轴?)我似乎无法理解这个简单的概念