Wtyczka Android Gradle 3.0.0-alpha2, nie można ustawić wartości właściwości tylko do odczytu „outputFile”

86

używałem tego kodu

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


aby zmienić nazwę pliku apk podczas tworzenia nowego apk, ale ponieważ używam Android Studio 3.0 Canary 2 pojawia się ten błąd:
Nie można ustawić wartości właściwości tylko do odczytu „outputFile” ....

Mohamd Ali
źródło
1
Oto wyjaśnienie Złych wiadomości, developer.android.com/studio/preview/features/… , najwyraźniej planowany jest nowy interfejs API, aby rozwiązać ten problem. Przewiń do dołu tej strony z linkami.
Hector

Odpowiedzi:

207

Jak sugeruje przewodnik migracji wtyczki Android 3.0 :

  • Użyj all()zamiasteach()
  • Użyj outputFileNamezamiast, output.outputFilejeśli zmieniasz tylko nazwę pliku (tak jest w twoim przypadku)

Przykład z przewodnika:

// 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"
    }
}
Paweł Nadolski
źródło
1
Muszę zmienić ścieżkę pliku wyjściowego, a nie tylko nazwę.
Amrut Bidri
@AmrutBidri, myślę, że najlepiej byłoby zadać nowe pytanie (jeśli nie ma już gdzieś odpowiedzi na SO). To pytanie dotyczyło tylko zmiany nazwy pliku.
Paweł Nadolski
Tak, to działa, mój błąd, był to problem z moją własną wtyczką, która sprawdza wersję gradle.
sandrstar
7

Zobacz poniżej:

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);
    }
}
Golan Shay
źródło
1
to działa, ale nie możesz zmienić katalogu wyjściowego
just_user
Muszę zmienić ścieżkę pliku wyjściowego, a nie tylko nazwę.
Amrut Bidri
uzyskiwanie błędu: Ścieżka bezwzględna nie jest obsługiwana podczas ustawiania nazwy pliku wyjściowego
ozmank
4

Poniższy kod działa u mnie na 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;
    }
}

To zmienia nazwę pliku apk

Manmeet Singh Batra
źródło
Nie można pobrać nieznanej właściwości „wariant” dla obiektu typu com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank
2

To jest kompletny przykład tego pytania.

Tylko ty musisz wkleić w swoim gradle 3.0+ po productFlavours

    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"
    }
    }
Pabel
źródło
czy wkleiłeś go w swoim gradle 3.0+ i po productFlavours ?? możesz umieścić specyficzny błąd?
Pabel
0

Założyłem Gradle 3.0 to już nie działa. łącze źródłowe

Jednak bardziej skomplikowane zadania, które wymagają dostępu do obiektów outputFile, nie działają. Dzieje się tak, ponieważ zadania specyficzne dla wariantów nie są już tworzone na etapie konfiguracji. Powoduje to, że wtyczka nie zna wszystkich swoich wyjść z góry, ale oznacza to również szybsze czasy konfiguracji.

następnie użyłem polecenia gradlewdo skompilowania projektu cpi pliku wyjściowego apk do mojej określonej ścieżki

W powłoce Execute umieściłem poniższe polecenie.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Lepszy
źródło
czy możesz podzielić się przykładem, jak to zrobiłeś?
Amrut Bidri
0

Miałem ten sam problem. Błąd „Nie można ustawić wartości właściwości tylko do odczytu„ outputFile ”....” „

Więc zmieniłem wersję repozytorium wtyczek Androida na 2.3.3 w oknie Struktura projektu. Teraz działa i błąd zniknął.

Struktura projektu

Później wyczyść i odbuduj dla projektu i to wszystko

Mam nadzieję, że to byłoby pomocne dla Ciebie.

user3287093
źródło
0

Minęło półtora roku od zadania pytania, ale może to pomoże komuś (takiemu jak ja), kto pierwszy odkryje ten post. Myślę, że odpowiedź na zmianę nazwy pliku i katalogu została udzielona tutaj .

applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def relativeRootDir = output.packageApplication.outputDirectory.toPath()
                     .relativize(rootDir.toPath()).toFile()
            output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
        }
    }
PurpleBugDroid
źródło
-1

Po aktualizacji do Android Studio 3.0.0 i korzystaniu z nowego gradle, wyjście apków będzie teraz dystrybuowane w katalogach według nazw smaków i typów kompilacji.

Mohamd Ali
źródło