android - Sentry 的 Gradle 任务未编译

标签 android gradle proguard sentry android-r8

我必须将分析工具 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 完成,然后将此属性文件复制到 Assets 中。但是,当我将其添加到我的 Android gradle 脚本中时,我收到错误:

Could not create task ':app:processSentryProguardForPlayStoreStagingDebug'.

No signature of method: java.util.ArrayList.multiply() is applicable for argument types: (ArrayList) values: [[sentry-cli, upload-proguard, --write-properties, {Application-Path}/app/build/intermediates/assets/playStoreStaging/debug/sentry-debug-meta.properties, ...]] Possible solutions: multiply(java.lang.Number), multiply(java.lang.Number)

我认为命令行数组之前的乘号 * 有问题。但是当我删除它时,我收到错误

Could not create task ':app:processSentryProguardForPlayStoreStagingDebug'.

Cannot cast object 'sentry-cli' with class 'java.lang.String' to class 'int'

所以我尝试只用那一行来测试它

commandLine "sentry-cli", ...

这给了我另一个错误

What went wrong: Cannot invoke method dependsOn() on null object

因此,我认为该 gradle 脚本确实出了问题,因为似乎无法找到依赖任务。有谁知道如何解决这个问题(或者有任何其他想法如何在 Proguard/R8 完成后以另一种方式将sentry-debug-meta.properties 文件复制到我的 Assets 中)?

谢谢!

--------编辑--------

我注意到一些重要的事情。 gradle 任务的定义名称与手册中定义的名称不同。查看我的任务,我将它们命名为

transformClassesAndResourcesWithR8For...

transformClassesWithDexBuilderFor...

但是,我打印了variantName然后进行检查,但似乎我的任务尚未完成。

在我的任务列表中存在

transformClassesAndResourcesWithR8ForPlayStoreStagingDebug

但不是

transformClassesAndResourcesWithR8ForPlayStoreStagingRelease

因此无法找到该任务。我认为这才是真正的问题。那么这些 gradle 任务是在哪里定义的呢?

List of my project gradle tasks

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

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

Variant: PlayStoreStagingRelease DexTask is null

Variant: PlayStorePreviewRelease DexTask is null

Variant: HockeyAppRelease DexTask is null

Variant: LocalServerRelease DexTask is null

Variant: PlayStoreProductionRelease DexTask is null

那怎么会这样呢?

最佳答案

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

官方 Android Gradle 插件随着版本的不同更改了其任务名称,Gradle 版本也会影响这些代码 fragment 。

Google 还用 R8 替换了 Proguard,它也影响了这些代码 fragment 。

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

谢谢。

关于android - Sentry 的 Gradle 任务未编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282834/

相关文章:

android - 使用 Android Proguard 编译错误 : can't find references?

android - 使用多个客户端将文件同步到 Google Drive AppFolder

android - 为什么 appcompat-v7 不能在库模块中使用 compileOnly

java - Spring Boot 默认测试抛出 IllegalStateException

android - 启用 Proguard 时出错

java - 如何使用 Proguard 或其他工具删除未使用的重写 toString() 方法?

android - Loader<Cursor> 只加载选定的行+下一行

java - 安卓长触事件

java - 尝试在表中插入值时获取 sqLiteCantOpenDatabaseException?

docker - 在 docker 文件中执行 gradle 命令时出错