web-dev-qa-db-ja.com

android studio 3.1:build:gradle:3.1.0-出力ファイル名の設定時に絶対パスはサポートされていません

Android Studio .を使用し、次のバージョンのAndroid Gradleプラグインproject/build.gradleで使用する場合:

classpath 'com.Android.tools.build:gradle:3.0.1'

そして、それはうまく機能しています。 Android Studio .1に更新した後、結果としてAndroid Gradle Pluginを更新します。

classpath 'com.Android.tools.build:gradle:3.1.0'

そして今、app/build.gradleでエラーが発生します:

def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
outputFileName = new File(rootProject.projectDir.absolutePath + "/release", releaseFileName.toLowerCase())

エラー:

出力ファイル名を設定する場合、絶対パスはサポートされません

出力apk(app-release.apk)をプロジェクトの特定のパスに配置する必要があります。フォルダーMyProject/release/app-relese.apk。どうすればいいですか?

15
a_subscriber

「./../../../」を使用するのは悪い解決策だと思います...私はいくつかのプロジェクトに共通のgradleスクリプトを使用し、出力ディレクトリの深さから独立したコードにしたいです。

いくつかの調査の後、私はgradleプラグイン3.1.2のこのソリューションを見つけました:

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def relativeRootDir = output.packageApplication.outputDirectory.toPath()
                 .relativize(rootDir.toPath()).toFile()
        output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
    }
}
15
user3155340

これが役立つ場合に備えて、このエラーは、apkのファイル名に関連するものへの絶対パスを持つことが許可されていないことを意味します。私が必要なものを達成するために、プロジェクトの前後にAPKを添付することができます(APKをproject/app/build /フォルダに入れるには:

gradle 3.1.0の前

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        outputFileName = new File(
                output.outputFile.parent,
                output.outputFile.name)
    }
}

INまたはAFTER gradle 3.1.

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        outputFileName = new File(
                "./../../../../../build/",
                output.outputFile.name)
    }
}
23

同じ問題が発生しました。何が起こったのかを正確に把握する努力はしていませんが、簡単な修正があります。

新しいファイルからルートを削除して、フレームワークを信頼するだけです。つまり、コードを

outputFileName = new File("release", releaseFileName.toLowerCase())

それで十分でした。特定のフレーバーのapkの名前のみを考慮して、apkがどこに行くかは気にしません。

9
Andrew Parker

最も単純なsolution for Android Gradle plugin 3.4.0+は次のとおりです。

新しいファイル名をアセンブル/連結します:

def newFileName = "assemble-your-new-file-name"

次に、単純に割り当て直します

outputFileName = newFileName

より具体的には以下の通り

Android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // Redirect your apks to new defined location to outputDirPath
        def outputDirPath = new File("${project.rootDir.absolutePath}/apks/${variant.flavorName}/${variant.buildType.name}")
        variant.packageApplicationProvider.get().outputDirectory = outputDirPath

        def apkFileName = "${rootProject.name}_${Android.defaultConfig.versionName}.apk"
        output.outputFileName = apkFileName // directly assign the new name back to outputFileName
    }
}
3
shizhen

私は解決策を見つけました:

def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
outputFileName = "/../../../../../release/" + releaseFileName.toLowerCase()

出力ファイルapp-release.apkMyProject/release/app-relese.apkで作成された成功

2
a_subscriber

variantOutput.getPackageApplication()is obsolete "」という警告を回避するには、variant.packageApplicationProvider.get().outputDirectoryを使用します

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        variant.packageApplicationProvider.get().outputDirectory = new File(
            project.rootDir.absolutePath + "/release")

        def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
        output.outputFileName = releaseFileName.toLowerCase()
    }
}
0
V-SHY