Plugin Android Gradle 3.0.0-alpha2, Không thể đặt giá trị của thuộc tính chỉ đọc 'outputFile'


86

tôi đã sử dụng mã này

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


để thay đổi tên của tệp apk khi tôi tạo apk mới, nhưng vì tôi sử dụng Android Studio 3.0 Canary 2 , lỗi này xuất hiện:
Không thể đặt giá trị của thuộc tính chỉ đọc 'outputFile' ....


1
heres the Bad news đã giải thích, developer.android.com/studio/preview/features/… , rõ ràng là một api mới được lên kế hoạch để giải quyết vấn đề này. Cuộn xuống cuối trang liên kết đó.
Hector

Câu trả lời:


207

Như hướng dẫn di chuyển plugin Android 3.0 gợi ý:

  • Sử dụng all()thay vìeach()
  • Sử dụng outputFileNamethay vì output.outputFilenếu bạn chỉ thay đổi tên tệp (đó là trường hợp của bạn)

Ví dụ từ hướng dẫn:

// 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
Tôi cần thay đổi đường dẫn tệp đầu ra, không chỉ tên.
Amrut Bidri

@AmrutBidri, tôi nghĩ tốt nhất là bạn nên hỏi một câu hỏi mới (nếu nó chưa được trả lời ở đâu đó trên SO). Câu hỏi này chỉ dành cho việc thay đổi tên tệp.
Paweł Nadolski

Vâng, nó hoạt động, tệ của tôi, đó là vấn đề với plugin của riêng tôi để kiểm tra phiên bản gradle.
sandrstar

7

Xem bên dưới:

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
tác phẩm này, nhưng bạn không thể thay đổi thư mục đầu ra
just_user

Tôi cần thay đổi đường dẫn tệp đầu ra, không chỉ tên.
Amrut Bidri

nhận được lỗi: đường dẫn tuyệt đối không được hỗ trợ khi thiết lập một tên tập tin đầu ra
ozmank

4

Mã dưới đây đang hoạt động cho tôi trên 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;
    }
}

Điều này thay đổi tên tệp apk


Không thể nhận thuộc tính không xác định 'biến thể' cho đối tượng thuộc loại com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank

2

Đây là ví dụ hoàn chỉnh của câu hỏi này.

Chỉ bạn phải dán gradle 3.0+ của mình sau sản phẩm

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

bạn đã dán nó vào gradle 3.0+ và sau productFlavours chưa ?? bạn có thể đặt lỗi đặc biệt?
Pabel

0

Tôi thành lập gradle 3.0 không còn hoạt động. liên kết nguồn

Tuy nhiên, các tác vụ phức tạp hơn liên quan đến việc truy cập các đối tượng outputFile không còn hoạt động. Đó là bởi vì các tác vụ dành riêng cho biến thể không còn được tạo trong giai đoạn cấu hình. Điều này dẫn đến việc plugin không biết tất cả các kết quả đầu ra của nó, nhưng nó cũng có nghĩa là thời gian cấu hình nhanh hơn.

sau đó tôi đã sử dụng lệnh gradlewđể biên dịch dự án. và cpgói ứng dụng xuất ra đường dẫn được chỉ định của tôi

Trong Execute shell, tôi đã đặt lệnh dưới đây.

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

bạn có thể chia sẻ ví dụ bạn đã làm như thế nào không?
Amrut Bidri

0

Tôi đã từng gặp vấn đề tương tự. Lỗi "Không thể đặt giá trị của thuộc tính chỉ đọc 'outputFile' ...." "

Vì vậy, những gì tôi đã làm là thay đổi phiên bản của Android Plugin Repository thành 2.3.3 trong cửa sổ Project Structure. Nó hoạt động ngay bây giờ và lỗi không còn nữa.

Cấu trúc dự án

Sau đó, hãy làm sạch và xây dựng lại cho dự án và thế là xong

Hy vọng điều này sẽ hữu ích cho bạn.


0

Đã một năm rưỡi kể từ khi câu hỏi được đặt ra nhưng có lẽ điều này sẽ giúp ai đó (như tôi) khám phá ra bài đăng này trước tiên. Tôi tin rằng câu trả lời để thay đổi tên tệp và thư mục đã được trả lời ở đây .

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

Sau khi cập nhật lên Android Studio 3.0.0 và sử dụng gradle mới, bây giờ, đầu ra của apks sẽ được phân phối trong các thư mục theo tên hương vị và loại bản dựng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.