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

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

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’의 값을 설정할 수 없습니다 ….



답변

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"
    }
}


답변

아래를 참조하십시오.

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);
    }
}


답변

아래 코드는 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 파일 이름을 변경합니다.


답변

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

제품 후 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이 더 이상 작동하지 않는다는 것을 발견했습니다. 소스 링크

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

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

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

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


답변

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

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

프로젝트 구조

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

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


답변

질문을받은 지 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)
        }
    }