ปลั๊กอิน 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

ตามที่คู่มือการย้ายข้อมูลปลั๊กอิน Android 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 ฉันคิดว่ามันจะเป็นการดีที่สุดที่จะถามคำถามใหม่ (ถ้ายังไม่ได้รับคำตอบใน SO) คำถามนี้ใช้สำหรับการเปลี่ยนชื่อไฟล์เท่านั้น
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
ozmank

2

นี่คือตัวอย่างที่สมบูรณ์ของคำถามนี้

คุณต้องวางในgradle 3.0+หลัง 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"
    }
    }

คุณวางไว้ใน gradle 3.0+ ของคุณหรือไม่และหลังจาก productFlavours ?? คุณสามารถใส่ข้อผิดพลาดเฉพาะ?
Pabel

0

ฉันก่อตั้ง gradle 3.0 ไม่ทำงานอีกต่อไป ลิงค์แหล่งที่มา

อย่างไรก็ตามงานที่ซับซ้อนมากขึ้นซึ่งเกี่ยวข้องกับการเข้าถึงอ็อบเจ็กต์ outputFile ไม่ทำงานอีกต่อไป นั่นเป็นเพราะไม่มีการสร้างงานเฉพาะตัวแปรในระหว่างขั้นตอนการกำหนดค่าอีกต่อไป สิ่งนี้ส่งผลให้ปลั๊กอินไม่ทราบว่าเอาต์พุตทั้งหมดอยู่ข้างหน้า แต่ก็หมายถึงเวลาในการกำหนดค่าที่เร็วขึ้นด้วย

จากนั้นฉันใช้คำสั่งgradlewเพื่อรวบรวม project.andcpและ apk เอาต์พุตไปยังเส้นทางที่ระบุของฉัน

ใน Execute shell ฉันใส่คำสั่งด้านล่าง

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

คุณสามารถแบ่งปันตัวอย่างว่าคุณทำได้อย่างไร
อมฤตประมูล

0

ผมมีปัญหาเดียวกัน. ข้อผิดพลาด "ไม่สามารถตั้งค่าของคุณสมบัติอ่านอย่างเดียว 'outputFile' .... " "

สิ่งที่ฉันทำคือเปลี่ยนเวอร์ชันของ Android Plugin Repository เป็น 2.3.3 ในหน้าต่างโครงสร้างโครงการ ใช้งานได้แล้วและไม่มีข้อผิดพลาดปรากฏขึ้น

โครงสร้างโครงการ

ต่อมาทำความสะอาดและสร้างใหม่สำหรับโครงการเท่านี้ก็เสร็จเรียบร้อย

หวังว่านี่จะเป็นประโยชน์สำหรับคุณ


0

นี่เป็นเวลาหนึ่งปีครึ่งแล้วที่คำถามถูกถาม แต่อาจจะช่วยคน (เช่นฉัน) ที่ค้นพบโพสต์นี้ก่อน ผมเชื่อว่าคำตอบที่จะเปลี่ยนชื่อไฟล์และไดเรกทอรีก็ได้รับคำตอบที่นี่

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 ใหม่ตอนนี้ผลลัพธ์ของ apks จะถูกแจกจ่ายในไดเรกทอรีตามชื่อรสชาติและประเภทการสร้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.