컴파일하지 센트리에 대한 Gradle을 작업

토비아스 제국 :

나는 웹 로그 분석 도구를 추가 할 필요가 보초를 우리의 안드로이드 프로젝트에. 이 (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을 작업 정의?

내 프로젝트 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 작업이 코드의 부재 (할 수있는 아무것도)을 기반으로되지 않을 수 있다고.

추천

출처http://10.200.1.11:23101/article/api/json?id=7674&siteId=1