Android Gradle 3.0.0-alpha2 plugin, Tidak dapat menyetel nilai properti hanya-baca 'outputFile'

86

saya menggunakan kode ini

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


untuk mengubah nama file apk ketika saya membangun apk baru, tetapi karena saya menggunakan Android Studio 3.0 Canary 2 kesalahan ini muncul:
Tidak dapat mengatur nilai properti read-only 'outputFile' ....

Mohamd Ali
sumber
1
inilah Kabar buruknya menjelaskan, developer.android.com/studio/preview/features/… , ternyata api baru direncanakan untuk mengatasi ini. Gulir ke bawah halaman tautan itu.
Hector

Jawaban:

207

Seperti yang disarankan oleh panduan migrasi plugin Android 3.0 :

  • Gunakan all()sebagai gantieach()
  • Gunakan outputFileNamealih-alih output.outputFilejika Anda hanya mengubah nama file (itu kasus Anda)

Contoh dari panduan:

// 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
sumber
1
Saya perlu mengubah jalur file keluaran, bukan hanya nama.
Amrut Bidri
@ AmrutBidri, saya pikir akan lebih baik untuk mengajukan pertanyaan baru (jika belum terjawab di suatu tempat di SO). Pertanyaan ini hanya untuk mengganti nama file.
Paweł Nadolski
Ya berfungsi, saya buruk, itu masalah dengan plugin saya sendiri yang memeriksa versi gradle.
sandrstar
7

Lihat di bawah:

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
sumber
1
ini berfungsi, tetapi Anda tidak dapat mengubah direktori keluaran
just_user
Saya perlu mengubah jalur file keluaran, bukan hanya nama.
Amrut Bidri
mendapatkan kesalahan: Path absolut tidak didukung saat mengatur nama file keluaran
ozmank
4

Kode di bawah ini berfungsi untuk saya di 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;
    }
}

Ini mengubah nama file apk

Manmeet Singh Batra
sumber
Tidak bisa mendapatkan 'varian' properti yang tidak diketahui untuk objek berjenis com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank
2

Ini adalah contoh lengkap dari pertanyaan ini.

Hanya Anda yang perlu menempelkan gradle 3.0+ setelah 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
sumber
sudahkah Anda menempelkannya di gradle 3.0+ dan setelah productFlavours ?? Anda dapat menempatkan kesalahan khusus?
Pabel
0

Saya mendirikan gradle 3.0 tidak lagi berfungsi. tautan sumber

Namun, tugas yang lebih rumit yang melibatkan pengaksesan objek outputFile tidak lagi berfungsi. Itu karena tugas khusus varian tidak lagi dibuat selama tahap konfigurasi. Hal ini menyebabkan plugin tidak mengetahui semua outputnya di awal, tetapi juga berarti waktu konfigurasi lebih cepat.

kemudian saya menggunakan perintah gradlewuntuk mengkompilasi project.andcp dan apk keluaran ke jalur yang saya tentukan

Di Execute shell, saya meletakkan perintah di bawah ini.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Lebih baik
sumber
dapatkah kamu membagikan contoh bagaimana kamu melakukannya?
Amrut Bidri
0

Saya memiliki masalah yang sama. Kesalahan "Tidak dapat menyetel nilai properti hanya-baca 'outputFile' ...." "

Jadi yang saya lakukan adalah mengubah versi Android Plugin Repository menjadi 2.3.3 di jendela Project Structure. Ini berfungsi sekarang dan kesalahannya hilang.

Struktur Proyek

Nanti, lakukan Bersihkan dan Bangun Ulang untuk proyek dan hanya itu

Semoga ini bisa membantu Anda.

pengguna3287093
sumber
0

Ini adalah satu setengah tahun sejak pertanyaan diajukan, tetapi mungkin ini akan membantu seseorang (seperti saya) yang menemukan posting ini lebih dulu. Saya yakin jawaban untuk mengubah nama file dan direktori telah terjawab di sini .

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
sumber
-1

Setelah mengupdate ke Android Studio 3.0.0 dan menggunakan gradle baru, sekarang, keluaran apks akan didistribusikan dalam direktori menurut nama ragam dan jenis build.

Mohamd Ali
sumber