Gradle自動生成APKファイル名に特定のバージョン番号を設定しようとしています。
Gradleはmyapp-release.apk
を生成しますが、myapp-release-1.0.apk
のように見せたいです。
面倒そうなオプションの名前を変更しようとしました。これを行う簡単な方法はありますか?
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
私は運のない上記のコードを試しました。助言がありますか? (gradle 1.6を使用)
これは私の問題を解決しました:applicationVariants.all
の代わりにapplicationVariants.each
を使用します
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
したがって、これはAndroid studio gradleプラグインの0.14+バージョンでは機能しないようです。
これはトリックを行います(これからの参照 question ):
Android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
}
}
}
バージョン名を1か所で変更するだけです。コードも簡単です。
以下の例では、MyCompany-MyAppName-1.4.8-debug.apkまたはMyCompany-MyAppName-1.4.8-releaseという名前のapkファイルを作成します。選択したビルドバリアントに応じてapk。
このソリューションはAPKと App Bundles(.aabファイル)の両方で機能することに注意してください。
関連項目: Androidプロジェクトのgradleでプロガードマッピングファイル名を変更する方法
Android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14 // increment with every release
versionName '1.4.8' // change with every release
setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName")
}
}
上記のソリューションは、次のAndroid Gradleプラグインバージョンでテストされています。
新しいバージョンがリリースされたら、この投稿を更新します。
次のソリューションは、次のAndroid Gradleプラグインバージョンでテストされています。
アプリgradleファイル:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.company.app"
minSdkVersion 13
targetSdkVersion 21
versionCode 14 // increment with every release
versionName '1.4.8' // change with every release
archivesBaseName = "MyCompany-MyAppName-$versionName"
}
}
(Android Studio 3.0およびGradle 4で動作するように編集)
私はより複雑なapkファイル名の名前変更オプションを探していましたが、他の人に役立つことを期待してこのオプションを書きました。 apkの名前を次のデータに変更します。
Gradleクラスの研究と、他の回答からのコピー/貼り付けが少し必要でした。 gradle 3.1.を使用しています。
Build.gradleで:
Android {
...
buildTypes {
release {
minifyEnabled true
...
}
debug {
minifyEnabled false
}
}
productFlavors {
prod {
applicationId "com.feraguiba.myproject"
versionCode 3
versionName "1.2.0"
}
dev {
applicationId "com.feraguiba.myproject.dev"
versionCode 15
versionName "1.3.6"
}
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def project = "myProject"
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 + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"
outputFileName = new File(newApkName)
}
}
}
今日(2016年10月13日)10:47にコンパイルすると、選択したフレーバーとビルドタイプに応じて、次のファイル名が取得されます。
注:位置合わせされていないバージョンのapk名はデフォルトのままです。
要約すると、build.gradle
(私のような)でパッケージをインポートする方法がわからない場合は、次のbuildTypes
を使用します。
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.all { variant ->
def file = variant.outputFile
def manifestParser = new com.Android.builder.core.DefaultManifestParser()
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(Android.sourceSets.main.manifest.srcFile) + ".apk"))
}
}
}
=====編集=====
versionCode
とversionName
をbuild.gradle
ファイルで次のように設定した場合:
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0.0"
}
次のように設定する必要があります。
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
====== Android Studio 1.0で編集======
Android Studio 1.0を使用している場合、次のようなエラーが表示されます。
Error:(78, 0) Could not find property 'outputFile' on com.Android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.
build.Types
部分を次のように変更する必要があります。
buildTypes {
release {
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
}
}
}
}
DefaultConfigブロックでversionNameを指定しない場合、defaultConfig.versionName
はnull
になります
マニフェストからversionNameを取得するには、build.gradleに次のコードを記述できます。
import com.Android.builder.DefaultManifestParser
def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(Android.sourceSets.main.manifest.srcFile)
私の場合、apk
およびrelease
バリアントの異なるdebug
名の生成を自動化する方法を見つけたかっただけです。このスニペットをAndroid
の子として配置することで、簡単にこれを行うことができました。
applicationVariants.all { variant ->
variant.outputs.each { output ->
def appName = "My_Nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
output.outputFile = new File(output.outputFile.parent, newName)
}
}
新しいAndroid gradleプラグイン3.0.0では、次のようなことができます。
applicationVariants.all { variant ->
variant.outputs.all {
def appName = "My_Nice_name_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def newName
if (buildType == 'debug'){
newName = "${appName}${defaultConfig.versionName}_dbg.apk"
} else {
newName = "${appName}${defaultConfig.versionName}_prd.apk"
}
outputFileName = newName
}
}
これは次のようなものを生成します:My_Nice_name_3.2.31_dbg.apk
Gradle 4(Android Studio 3+)で構文が少し変更されました(output.outputFile
からoutputFileName
へ、アイデアは this answer から:
Android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName = outputFileName
newName.replace(".apk", "-${variant.versionName}.apk")
outputFileName = new File(newName)
}
}
}
別の代替方法は、次を使用することです。
String APK_NAME = "appname"
int VERSION_CODE = 1
String VERSION_NAME = "1.0.0"
project.archivesBaseName = APK_NAME + "-" + VERSION_NAME;
Android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 15
targetSdkVersion 21
versionCode VERSION_CODE
versionName VERSION_NAME
}
.... // Rest of your config
}
これにより、すべてのapk出力に「appname-1.0.0」が設定されます。
@ Jon answer に従ってapkの名前を変更する正しい方法
defaultConfig {
applicationId "com.irisvision.patientapp"
minSdkVersion 24
targetSdkVersion 22
versionCode 2 // increment with every release
versionName "0.2" // change with every release
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
//add this line
archivesBaseName = "AppName-${versionName}-${new Date().format('yyMMdd')}"
}
または別の方法で同じ結果を達成することができます
Android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def formattedDate = new Date().format('yyMMdd')
outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk"
}
}
}
完全に、またはいくつかの修正後に正しい多くの答えがあります。ただし、preBuild
タスクにフックしてVersionNameとVersionCodeを動的に生成するスクリプトを使用していたため、それらすべてに問題があったので、とにかく追加します。
同様のアプローチを使用している場合、これが機能するコードです。
project.Android.applicationVariants.all { variant ->
variant.preBuild.doLast {
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk"))
}
}
}
説明するには:preBuild
の最初のアクションでバージョンコードと名前をオーバーライドしているため、このタスクの最後にファイル名を変更する必要があります。この場合、gradleが行うことは次のとおりです。
バージョンコード/名前を挿入-> preBuildアクションを実行-> apkの名前を置換
applicationVariants.all { variant ->
variant.outputs.all { output ->
output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
}
}
私の場合、この方法でこのエラーを解決します
デバッグバージョンにSUFFIXを追加します。この場合、「-DEBUG」テキストをデバッグデプロイに追加します。
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
debug {
defaultConfig {
debuggable true
versionNameSuffix "-DEBUG"
}
}
}
Android Studio 1.1.0の時点で、この組み合わせがbuild.gradle
ファイルのAndroid本文で機能していることがわかりました。これは、マニフェストxmlファイルデータをインポートする方法がわからない場合です。 Android Studioでさらにサポートされていればよいのですが、目的のapk名の出力が得られるまで値をいじってみてください。
defaultConfig {
applicationId "com.package.name"
minSdkVersion 14
targetSdkVersion 21
versionCode 6
versionName "2"
}
signingConfigs {
release {
keyAlias = "your key name"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "appName_" + versionName + ".apk"))
}
}
}
}
最新のgradleバージョンでは、次のスニペットを使用できます。
最初にアプリケーションマニフェストの場所を設定します
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
{
}
そして後でbuild.gradleで
import com.Android.builder.core.DefaultManifestParser
def getVersionName(manifestFile) {
def manifestParser = new DefaultManifestParser();
return manifestParser.getVersionName(manifestFile);
}
def manifestFile = file(Android.sourceSets.main.manifest.srcFile);
def version = getVersionName(manifestFile)
buildTypes {
release {
signingConfig signingConfigs.release
applicationVariants.each { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + versionName + ".apk"))
}
}
ビルドタイプごとに異なるマニフェストがある場合は調整します。しかし、私は単一のものを持っているので-私にとって完璧に動作します。