나는 웹 로그 분석 도구를 추가 할 필요가 보초를 우리의 안드로이드 프로젝트에. 이 (Proguard와 / R8)에서 모호한 코드에 대한 맵핑을 작성하고 센트리에 나중에 업로드 한 요구를 작동하게하기 위해.
웹 사이트에 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와는 자산이 속성의 파일을 복사하는 대신 완료 할 때까지 기다릴 것이다. 내 안드로이드 Gradle을 스크립트에이를 추가 할 때 그러나, 나는 오류가 발생합니다 :
작업을 만들 수 없습니다 ': 응용 프로그램 : processSentryProguardForPlayStoreStagingDebug를'.
방법의 어떠한 서명 : java.util.ArrayList.multiply ()는 인수 유형에 적용되지 않습니다 : (ArrayList에) 값 : [[보초-CLI, 업로드 - 난독 화, --write - 속성, {응용 프로그램 경로} / 응용 프로그램 / 빌드 /intermediates/assets/playStoreStaging/debug/sentry-debug-meta.properties, ...]] 가능한 해결책 : 다중 (상위를을), 곱셈 (상위를)
나는 명령 줄 배열하기 전에 곱셈 기호 *에 뭔가 잘못이있는 가정합니다. 그러나 나는 그것을 제거 할 때 나는 오류
작업을 만들 수 없습니다 ': 응용 프로그램 : processSentryProguardForPlayStoreStagingDebug를'.
클래스 '내부'에 클래스의 java.lang.String의 '와 객체 보초-CLI를'캐스팅 할 수 없습니다
난 단지 그 라인이 테스트를하려고 그래서
commandLine "sentry-cli", ...
어느 날 다른 오류를 준
무엇이 잘못되었는지 : 수없는 방법의 DependsOn ()를 호출 널 객체에
따라서 나는 dependend 작업을 찾을 수 없음을 보이기 때문에 뭔가가 Gradle을 스크립트 정말 잘못된 가정합니다. 누구든지이 문제를 해결 (또는 선택적 방법 Proguard와 / R8이 완료되면, 다른 방법으로 내 자산이 sentry-debug-meta.properties 파일을 복사하는 다른 생각을 가지고)하는 방법을 어떤 생각을 가지고 있습니까?
감사!
-------- 편집하다 --------
나는 중요한 무언가를 발견했습니다. Gradle을 작업은 설명서에 정의 된 것보다 다른 이름에 정의되어 있습니다. 내 작업을 보면 나는 그들이라는 이름의이
transformClassesAndResourcesWithR8For...
과
transformClassesWithDexBuilderFor...
그러나, 나는 검사에 다음 variantName를 인쇄하지만 내 작업이 불완전 보인다.
내 작업 목록에서 존재
transformClassesAndResourcesWithR8ForPlayStoreStagingDebug
하지만
transformClassesAndResourcesWithR8ForPlayStoreStagingRelease
따라서 작업을 찾을 수 없습니다. 나는 여기에 진짜 문제라고 생각합니다. 어디 그래서이 Gradle을 작업 정의?
------- 수정 2 --------
좋아, 내가 여기에 뭔가 이상한 나타났습니다. 일부 변종은 작업을하지 않아도됩니다. 그것은 DEBUG 작업이 R8 작업을하지 않아도하지만 난 여기를 발견 의미가 있습니다 :
변형 : PlayStoreStagingRelease DexTask가 null
변형 : PlayStorePreviewRelease DexTask가 null
변형 : HockeyAppRelease DexTask가 null
변형 : LocalServerRelease DexTask가 null
변형 : PlayStoreProductionRelease DexTask가 null
그래서 방법이 될 수 있는가?
java.util.ArrayList.multiply()
그 힌트 *
의 앞에 [ ]
나에게 이상한 보이는 목록. 을 제거하려고 *[ ]
만 유지하지, List<String>
(더 거기 ArrayList
로 시작하는 예상) :
commandLine "sentry-cli", "upload-proguard", "--write-properties", "${project.rootDir.toPath()}/app/build/intermediates/assets/${variant.dirName}/sentry-debug-meta.properties", variant.getMappingFile(), "--no-upload"
당신은 당신의 작업이 실제로 호출되는 방법을 찾아 볼 거라고하지만, 모두 뭔가를해야한다 :
def r8Task = project.tasks.findByName("transformClassesAndResourcesWithR8For${variantName}")
def d8Task = project.tasks.findByName("transformClassesWithDexBuilderFor${variantName}")
A를 null
확인하지 모든 변종 수도 있기 때문에 minifyEnabled true
설정 :
if(r8Task != null) {
d8Task.dependsOn task
task.dependsOn r8Task
}
어쩌면 이전 null
때문에 검사가 필요하다 variant.getMappingFile()
R8이 필요합니다.
그리고 어떤 맛이 더 D8 작업이 코드의 부재 (할 수있는 아무것도)을 기반으로되지 않을 수 있다고.