Android Gradle 3.0.0-alpha2 플러그인, 읽기 전용 속성 'outputFile'의 값을 설정할 수 없습니다.


86

나는이 코드를 사용하고 있었다

applicationVariants.all { variant -> 
    variant.outputs.each { output ->
        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = 
        variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def date = new Date()
        def formattedDate = date.format('ddMMyy_HHmm')
        def newApkName = PROJECT_NAME + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"
        def file = new File(newApkName)
        output.outputFile = file
    }
}


새 apk를 빌드 할 때 apk 파일의 이름을 변경하려면 Android Studio 3.0 Canary 2를 사용하기 때문에이 오류가 나타납니다.
읽기 전용 속성 'outputFile'의 값을 설정할 수 없습니다 ....


1
여기에 나쁜 소식이 설명되어 있습니다. developer.android.com/studio/preview/features/… , 분명히이 문제를 해결할 새로운 API가 계획되어 있습니다. 해당 링크 페이지의 맨 아래로 스크롤하십시오.
헥터

답변:


207

3.0 마이그레이션 가이드 플러그인 안드로이드 제안한다 :

  • all()대신 사용each()
  • 파일 이름 만 변경 outputFileName하는 output.outputFile경우 대신 사용 (즉, 귀하의 경우)

가이드의 예 :

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

1
이름뿐만 아니라 출력 파일 경로를 변경해야합니다.
Amrut Bidri

@AmrutBidri, 나는 새로운 질문을하는 것이 가장 좋을 것이라고 생각합니다 (아직 어딘가에서 대답하지 않은 경우). 이 질문은 파일 이름 변경에만 해당됩니다.
Paweł Nadolski

예, 작동합니다. 내 문제는 gradle 버전을 확인하는 내 자체 플러그인 문제였습니다.
sandrstar

7

아래를 참조하십시오.

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def newApkName = applicationId + "-" + variant.versionName + "(" + variant.versionCode + ")" + ".apk";
        outputFileName = new File("${project.projectDir}/../outputs/apks/" + variant.name, newApkName);
    }
}

1
이 작품은,하지만 당신은 출력 디렉토리를 변경할 수 없습니다
just_user

이름뿐만 아니라 출력 파일 경로를 변경해야합니다.
Amrut Bidri

오류가 : 출력 파일 이름을 설정할 때 절대 경로가 지원되지 않습니다
ozmank

4

아래 코드는 android studio canary 3.0.0-alpha3에서 나를 위해 일하고 있습니다.

android.applicationVariants.all {
    variant.outputs.all {
        def newApkName
        newApkName = "APPLICATION_NAME-" + defaultConfig.versionName + "-" + defaultConfig.versionCode".apk"
        outputFileName = newApkName;
    }
}

이것은 apk 파일 이름을 변경합니다.


com.android.build.gradle.internal.api.ApplicationVariantImpl 유형의 개체에 대해 알 수없는 속성 'variant'를 가져올 수 없습니다.
ozmank

2

이것이이 질문 의 완전한 예 입니다.

제품 후 gradle 3.0+ 에 붙여 넣기 만하면됩니다.

    android.applicationVariants.all { variant ->
    variant.outputs.all {

        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def versionCode = variant.versionCode
        def date = new Date();
        def formattedDate = date.format('ddMMyy_HHmm')

        outputFileName = "${flavor}${SEP}${buildType}${SEP}${version}${SEP}${versionCode}${SEP}${formattedDate}.apk"
    }
    }

gradle 3.0+ 및 productFlavours 이후에 붙여 넣었습니까 ?? 특정 오류를 넣을 수 있습니까?
Pabel

0

나는 gradle 3.0이 더 이상 작동하지 않는다는 것을 발견했습니다. 소스 링크

그러나 outputFile 개체에 액세스하는 것과 관련된 더 복잡한 작업은 더 이상 작동하지 않습니다. 이는 구성 단계에서 더 이상 변형 별 작업이 생성되지 않기 때문입니다. 이로 인해 플러그인이 모든 출력을 미리 알지 못하지만 구성 시간이 빨라집니다.

그런 다음 명령 gradlew을 사용 하여 프로젝트를 컴파일 cp하고 출력 apk를 지정된 경로로

쉘 실행에서 아래 명령을 입력했습니다.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk

어떻게 한 예를 공유 할 수 있습니까?
Amrut Bidri

0

나는 같은 문제가 있었다. "읽기 전용 속성 'outputFile'....의 값을 설정할 수 없습니다."오류

그래서 제가 한 일은 Project Structure 창에서 Android Plugin Repository의 버전을 2.3.3으로 변경하는 것입니다. 이제 작동하고 오류가 사라졌습니다.

프로젝트 구조

나중에 프로젝트를 위해 정리하고 다시 빌드하십시오.

이것이 당신에게 도움이되기를 바랍니다.


0

질문을받은 지 1 년 반이 지났지 만이 게시물을 먼저 발견 한 사람 (나와 같은)에게 도움이 될 것입니다. 파일 이름과 디렉토리 변경에 대한 답변이 여기에 있다고 생각합니다 .

applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def relativeRootDir = output.packageApplication.outputDirectory.toPath()
                     .relativize(rootDir.toPath()).toFile()
            output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
        }
    }

-1

Android Studio 3.0.0으로 업데이트하고 새 gradle을 사용하면 이제 apk의 출력이 버전 이름 및 빌드 유형별로 디렉터리에 배포됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.