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 2017

@AmrutBidri、新しい質問をするのが最善だと思います(SOのどこかでまだ回答されていない場合)。この質問は、ファイル名を変更するためだけのものでした。
パヴェルNadolski

はい、動作します。悪いです。gradleのバージョンをチェックする独自のプラグインに問題がありました。
sandrstar 2018年

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 2017

名前だけでなく、出力ファイルのパスを変更する必要があります。
Amrut Bidri 2017

エラーを取得:出力ファイル名を設定するときに絶対パスがサポートされていません
ozmank

4

以下のコードは、Android Studio Canary3.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のオブジェクトの不明なプロパティ「variant」を取得できませんでした。
ozmank

2

これは、この質問の完全な例です。

productFlavoursの後に3.0以降のgradleを貼り付ける必要があるのはあなただけです

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

あなたはそれをあなたのgradle3.0 +とproductFlavoursの後に貼り付けましたか?あなたは特定のエラーを置くことができますか?
パベル2018年

0

私はgradle3.0が機能しなくなったことを発見しました。ソースリンク

ただし、outputFileオブジェクトへのアクセスを伴うより複雑なタスクは機能しなくなりました。これは、構成段階でバリアント固有のタスクが作成されなくなったためです。これにより、プラグインはすべての出力を事前に認識できなくなりますが、構成時間が短縮されることも意味します。

次に、コマンドを使用してgradlewproject.andcpの出力apkを指定したパスにコンパイルしました

実行シェルで、以下のコマンドを入力しました。

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

あなたがそれをどのようにしたかという例を共有できますか?
Amrut Bidri 2017

0

私も同じ問題を抱えていました。エラー「読み取り専用プロパティ「outputFile」の値を設定できません...」

だから私がしたことは、プロジェクト構造ウィンドウでAndroidプラグインリポジトリのバージョンを2.3.3に変更することです。これで動作し、エラーは消えました。

プロジェクト構造

後で、プロジェクトのクリーンアップと再構築を実行します。これで完了です。

これがお役に立てば幸いです。


0

質問が出されてから1年半ですが、この投稿を最初に見つけた人(私のような人)に役立つかもしれません。ファイル名とディレクトリを変更する答えはここで答えられと思います

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を使用すると、apkの出力がフレーバー名とビルドタイプごとにディレクトリに配信されるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.