Android 哨兵的Gradle任务未编译
我必须将分析工具Sentry添加到我们的Android项目中。为了使其工作,需要为模糊代码(来自Proguard/R8)创建映射,并稍后将其上载到Sentry 网站上甚至描述了如何做到这一点。 有人写道,需要创建一个gradle任务,如下所示:Android 哨兵的Gradle任务未编译,android,gradle,proguard,sentry,android-r8,Android,Gradle,Proguard,Sentry,Android R8,我必须将分析工具Sentry添加到我们的Android项目中。为了使其工作,需要为模糊代码(来自Proguard/R8)创建映射,并稍后将其上载到Sentry 网站上甚至描述了如何做到这一点。 有人写道,需要创建一个gradle任务,如下所示: gradle.projectsEvaluated { android.applicationVariants.each { variant -> def variantName = variant.name.capitali
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,
--写入属性,{Application Path}/app/build/intermediates/assets/playStoreStaging/debug/sentry-debug-meta.properties,
…]]可能的解决方案:乘法(java.lang.Number),
乘法(java.lang.Number)
我假设命令行数组之前的乘法符号*有问题。但是当我删除它时,我得到了错误
无法创建任务
“:app:processSentryProguardForPlayStoreStagingDebug”
无法将类为“java.lang.String”的对象“sentry cli”强制转换为类“int”
所以我试着用那条线来测试这个
commandLine "sentry-cli", ...
这又给了我一个错误
错误:无法对null对象调用方法dependsOn()
因此,我假设gradle脚本确实出了问题,因为似乎找不到依赖的任务。有没有人知道如何解决这个问题(或者有没有人知道如何在Proguard/R8完成后以另一种方式将sentry-debug-meta.properties文件复制到我的资产中)
谢谢
------编辑-----
我注意到一些重要的事情。
gradle任务的定义名称与手册中定义的名称不同。看看我的任务,我把它们命名了
transformClassesAndResourcesWithR8For...
及
但是,我打印了variantName以供检查,但我的任务似乎不完整
在我的任务列表中,存在
transformClassesAndResourcesWithR8ForPlayStoreStagingDebug
但不是
transformClassesAndResourcesWithR8ForPlayStoreStagingRelease
因此无法找到任务。我认为这才是真正的问题所在。那么这些gradle任务是在哪里定义的呢
-------编辑2--------
好吧,我注意到这里有点奇怪。有些变体没有任务。调试任务没有R8任务是有道理的,但我在这里发现:
变量:PlayStoreStagingRelease任务为空
变量:PlayStorePreviewRelease任务为空
变量:hockeyapplease任务为空
变量:LocalServerRelease任务为空
变量:PlayStoreProductionRelease任务为空
这怎么可能呢?
java.util.ArrayList.multiply()
在[]
列表前面提示*
,我觉得很奇怪。尝试删除*[]
,只保留列表
(首先,不需要数组列表
):
您必须查看您的任务实际上是如何被调用的,但它应该是类似的:
def r8Task = project.tasks.findByName("transformClassesAndResourcesWithR8For${variantName}")
def d8Task = project.tasks.findByName("transformClassesWithDexBuilderFor${variantName}")
使用null
检查,因为并非每个变量都设置了minifyEnabled true
if(r8Task != null) {
d8Task.dependsOn task
task.dependsOn r8Task
}
甚至可能需要以前的null
检查,因为variant.getMappingFile()
需要R8
有些口味没有D8任务可能是因为没有代码(没什么可做的)。我建议使用这里描述的Sentry-Gradle集成(Gradle插件) 官方的Android Gradle插件更改了其任务名称而不是版本,Gradle版本也会影响这些代码片段 谷歌还用R8取代了Proguard,它也影响了这些代码片段 有没有理由不使用Sentry-Gradle集成?如果是这样,我们将研究更新它们
谢谢。以下是我将Sentry与Android应用程序集成的步骤摘要。这些步骤是为了确保sentry gradle插件按预期工作,并自动上载proguard映射文件,而无需担心使用cli上载。我假设您已经按照如下所述设置了Sentry SDK:
Sentry现在应该能够为任何发布版本上载proguard文件(或者如果您为任何构建类型设置minifyEnabled=true)。如我的问题中所述,在执行此操作时,我收到错误“无法在null对象上调用方法dependsOn()”,因此我猜gradle任务本身不知何故被破坏,
def r8Task = project.tasks.findByName("transformClassesAndResourcesWithR8For${variantName}")
def d8Task = project.tasks.findByName("transformClassesWithDexBuilderFor${variantName}")
if(r8Task != null) {
d8Task.dependsOn task
task.dependsOn r8Task
}
defaults.project=your_sentry_project_name
defaults.org=your_sentry_org_name
auth.token=sentry_project_auth_token
task copySentryPropertiesTask {
if (getBuildFlavor() != null && !getBuildFlavor().isEmpty()) {
println("Copying Sentry properties file: ${getBuildFlavor()}")
copy {
from "src/${getBuildFlavor()}/"
include "sentry.properties"
into "../"
}
}
}
def getBuildFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find())
return matcher.group(1)
else {
println "NO MATCH FOUND"
return ""
}
}