2014-09-23 19 views
32

Tôi đang sử dụng cấu hình đơn giản sau trong một dự án ứng dụng Android.Cảnh báo Gradle: variant.getOutputFile() và variant.setOutputFile() không được chấp nhận

android { 
    compileSdkVersion 20 
    buildToolsVersion "20.0.0" 

    defaultConfig { 
     minSdkVersion 8 
     targetSdkVersion 20 
     versionCode 1 
     versionName "1.0.0" 

     applicationVariants.all { variant -> 
      def file = variant.outputFile 
      def fileName = file.name.replace(".apk", "-" + versionName + ".apk") 
      variant.outputFile = new File(file.parent, fileName) 
     } 
    }  
} 

Bây giờ tôi đã cập nhật trình cắm Gradle thành v.0.13.0 và Gradle thành v.2.1. các cảnh báo sau đây xuất hiện:

WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 

Tôi có thể viết lại kịch bản Groovy để loại bỏ cảnh báo không dùng nữa?

Trả lời

59

xây dựng trên câu trả lời từ Larry Schiefer bạn có thể thay đổi kịch bản để một cái gì đó như thế này:

android { 
    applicationVariants.all { variant -> 
     variant.outputs.each { output -> 
      def outputFile = output.outputFile 
      if (outputFile != null && outputFile.name.endsWith('.apk')) { 
       def fileName = outputFile.name.replace('.apk', "-${versionName}.apk") 
       output.outputFile = new File(outputFile.parent, fileName) 
      } 
     } 
    } 
} 
+0

Bạn đã thực sự cố gắng chạy mã này chưa? Tôi nhận được 'Không thể tìm thấy tập tin thuộc tính 'trên com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated @ 4b50996.' Plugin android gradle này là tàn bạo. – Merk

+0

@Merk Trên thực tế, có, tôi đến đây tìm kiếm một câu trả lời cho cùng một câu hỏi, và cuối cùng quản lý để làm cho nó làm việc với đoạn mã trên (mặc dù tôi đã có một số mã hơi khác nhau bên trong nếu). Có vẻ như bạn đã viết sai điều gì đó nếu bạn không thể tìm thấy 'tệp' thuộc tính, vì không có thuộc tính nào được sử dụng trong đoạn mã của tôi :) – Thorbear

+0

Khó hiểu vì đây là dòng vi phạm: 'output.outputFile = new File (file.parent , "AppName_playstorebuild.apk") '. BTW Tôi đang sử dụng 'classpath' com.android.tools.build: gradle: 0.13.0'' – Merk

8

API đầu ra của biến thể xây dựng đã thay đổi trong plugin Android Gradle mới nhất. Nó bây giờ cho phép nhiều tập tin đầu ra (hoặc thư mục), đó là lý do tại sao phương pháp này đã được đánh dấu là không được chấp nhận. Nếu bạn sử dụng variant.outputs thay vào đó, nó sẽ cung cấp cho bạn Collection sau đó bạn có thể lặp lại và nhận từng tệp đầu ra. Bạn sẽ phải xác minh đối tượng tệp là không rỗng và nó khớp với tiêu chí của bạn (ví dụ: có phần mở rộng '.apk'). Sau đó, bạn có thể tạo đối tượng File mới và thêm đối tượng đó vào đầu ra trong bộ sưu tập.

+0

Cả 'variant.outputs.outputFile.name = "NewBuildName.apk" 'cũng không' variant.outputs.add (File mới ("NewBuildName.apk")) 'có bất kỳ hiệu ứng nào, vì vậy tôi không chắc bạn đang đề xuất hành động nào. – Merk

+6

Tài liệu ở đâu để xem thuộc tính nào nằm trong đối tượng "đầu ra"? – whizzle

+4

Thật không may, tại thời điểm này trong thời gian này phần lớn là không có giấy tờ. Bạn phải dựa vào trợ giúp trực tuyến trong Android Studio (không phải rất hữu ích) hoặc tìm hiểu thông qua mã Groovy/Java trong chính plugin đó để tìm chi tiết. Vì 'đầu ra' là một' Bộ sưu tập', bạn sẽ có thể tìm thấy các tài liệu trên đối tượng Groovy/Java 'Collection'. –

16

Đoạn mã hoàn chỉnh trông giống như một rằng:

// Customize generated apk's name with version number 
applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     def outputFile = output.outputFile 
     if (outputFile != null && outputFile.name.endsWith('.apk')) { 
      def manifestParser = new com.android.builder.core.DefaultManifestParser() 
      def fileName = outputFile.name.replace(".apk", "-DEBUG-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk") 
      output.outputFile = new File(outputFile.parent, fileName) 
     } 
    } 
} 
Các vấn đề liên quan