首页 > 解决方案 > 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 任务是在哪里定义的呢?

我的项目 gradle 任务列表

-------- 编辑 2 --------

好吧,我注意到这里有些奇怪。一些变体没有任务。DEBUG 任务没有 R8 任务是有道理的,但我在这里找到了这个:

变体:PlayStoreStagingRelease DexTask 为空

变体:PlayStorePreviewRelease DexTask 为空

变体:HockeyAppRelease DexTask 为空

变体:LocalServerRelease DexTask 为空

变体:PlayStoreProductionRelease DexTask 为空

那么这怎么可能呢?

标签: androidgradleproguardsentryandroid-r8

解决方案


我建议使用此处描述的 Sentry Gradle 集成(Gradle 插件)https://docs.sentry.io/platforms/android/#gradle-integration

官方的 Android Gradle 插件在版本上更改了任务名称,Gradle 版本也会影响这些代码片段。

谷歌还用 R8 替换了 Proguard,它也影响了这些代码片段。

有没有理由不使用 Sentry Gradle 集成?如果是这样,我们将考虑更新它们。

谢谢。


推荐阅读