Gradleビルドタイプごとにアプリ名を変更する方法


135

Gradleのビルドタイプごとにアプリケーションのアプリ名を変更できる方法を見つけようとしています。

たとえば、デバッグバージョン<APP_NAME>-debugとqaバージョンが必要<APP-NAME>-QAです。

私は知っています:

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}

しかし、ランチャーでアプリの変更を適用するためのgradleコマンドが見つからないようです。

回答:


167

「アプリ名」で、あなたが意味する場合android:label<application>、最も簡単な解決策は、文字列リソースでそのポイントを持つことである(例えば、android:label="@string/app_name")、その後にその文字列リソースの異なるバージョンを持っているsrc/debug/のsourceSet。

このサンプルプロジェクトでは、ビルドに適用されるapp_namein src/debug/res/values/strings.xmlに代わるものがあることがわかりdebugます。releaseビルドはのバージョンを使用app_namesrc/main/ます。


このソリューションは、翻訳ごとに余分なstrings.xmlを追加する必要があることを意味しませんか?それは維持するのに苦痛になる可能性があります...
スフェラ2014

7
@sfera:まず、必要に応じて、この文字列を独自のリソースファイルで分離できます。第二に、これは1つの文字列に対してのみです。第三に、これはその文字列を置き換えたいビルドタイプのみです。第4に、共通言語のない開発チームがない限り、非release文字列を翻訳する必要はありません。
CommonsWare 2014

文字列を分離するのは良い考えのように思えます。それをありがとう!非release部分については、「リリース」ビルドと「テスト」ビルドを同じデバイス上で共存させながら、ローカリゼーションの問題をテストしたい場合とは少し異なります。そのような場合、両方のビルドが同じランチャーラベルで終了し、おそらく混乱を引き起こす可能性があります。それは私が避けようとしていたことです。
スフェラ2014

1
@sfera:「それが私が避けようとしていたことです」-したがって、この1つの文字列を翻訳しないでください。その文字列のテストはとにかく無効になります。定義上、これはreleaseモードで使用する文字列ではありません。この文字列リソースはにのみ使用app_nameし、他の役割には使用しないでください。
CommonsWare 2014

3
@sfera:「AppNom-DEBUG」が付いたアプリを出荷することはありません。「AppNom」でアプリを出荷する場合があります。したがって、「AppNom-DEBUG」のテストは不要です。デバッグバージョンはapp_name必要ありませんが(たとえば、英語を話せないため、翻訳が必要なフランス語またはドイツ語の開発者がいる場合)、デバッグバージョンを翻訳することは間違いありません。変更されていないreleaseバージョンがapp_name機能するかどうかをテストし、その翻訳をrelease使用して、near-releaseビルドをテストするか、アプリIDサフィックスを追加して文字列のみを残すビルドタイプを作成します。
CommonsWare 2014

159

あなたはこのようなものを使うことができます

 buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        resValue "string", "app_name", "AppName debug"
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        zipAlignEnabled true
        resValue "string", "app_name", "AppName"
    }
}

AndroidManifest.xmlファイルで@ string / app_nameを使用できます。

values /フォルダからapp_nameを削除してください(この名前のエントリはありません)。


アプリ名を外部ファイルから読み取る必要がある場合
Joe Maher

この方法でビルドするとエラーが発生しました。タスク ':app:mergeDebugResources'の実行に失敗しました。重複リソース:res / values / strings.xml:string / app_name
user2010496

5
取得した場合:この方法でビルドするとエラーが発生します。タスク ':app:mergeDebugResources'の実行に失敗しました。リソースが重複しています:res / values / strings.xml:string / app_name、次のように実行する必要があります: "値/フォルダからapp_nameを削除してください(この名前のエントリはありません) )」
ivan.panasiuk

文字列フォルダソリューション(上記の受け入れ済みソリューション)は、アプリ名が特定のソースセット/製品フレーバーに対して定義されている場合にのみ機能するため、これが好きです。私の場合、Jenkins Pipelineジョブを設定して、アプリのさまざまなバージョンをさまざまな名前で自動的にビルドしますが、それらのすべての名前にproductFlavorsが定義されているわけではありません。だから、ジェンキンスは、単に環境を経由してアプリ名を供給し、Gradleのは、それを読み取りますresValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
エイフェックス・

文字列フォルダからapp_nameを削除すると、コンパイルエラーが発生し、エラーが発生する-タスク:: app:processDevDebugManifestのエラー:実行に失敗しました。>マニフェストのマージが複数のエラーで失敗しました。ログを参照してください
aj0822ArpitJoshi

55

あなたはgradleでこれを行うことができます:

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}

次にあなたのAndroidManifest.xml立場で:

<application
    android:label="${appName}"/>
    <activity
        android:label="${appName}">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

注:でも動作しproductFlavorsます。


エラー-Error:Executionがタスク ':app:processDevDebugManifest'で失敗しました。>マニフェストのマージが複数のエラーで失敗しました。ログを参照してください
aj0822ArpitJoshi

NOT WORKING --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile( 'proguard-android.txt')、 'proguard-rules.pro'} debug {manifestPlaceholders = [appName: "GridL Debug"] applicationIdSuffix ".dev1"}}
JSONParser 2018年

44

翻訳をサポートするには、次のようにします。

1.文字列「app_name」を削除します

2. Gradleに追加

 buildTypes {
    admin {
       resValue "string", "app_name", "@string/app_name_admin"
    }
    release {
        resValue "string", "app_name", "@string/app_name_release"
    }
    debug {
        resValue "string", "app_name", "@string/app_name_debug"
    }
}

3.マニフェストでアプリ名を「@ string / app_name」に設定します

4. strings.xml値に追加します

<string name="app_name_admin">App Admin</string>
<string name="app_name_release">App  release</string>
<string name="app_name_debug">App debug</string>

ビルドタイプにはどのような種類がありますか?管理者、リリース、デバッグ以外は?
Dinesh 2017

@DineshVG自分で違いを設定できます。たとえば、別のapplicationId
NickUnuchek '28

さまざまなプロガードルールを使用したデバッグ以外の別のビルド構成でUIAutomatorテストを使用したい。それは可能ですか?
Dinesh 2017

これは私のために素晴らしい仕事を受け入れ答え、あるべき
オレグデート

私は本当にこのアプローチのように、それはあなたもカスタムを追加することができますので、app_nameproductFlavorsののセクションbuild.gradleファイル。必要なときに非常に便利で柔軟なアプローチ。
エゲル

15

アプリ名はユーザーに表示されるため、strings.xmlファイルに保存することをお勧めします。buildTypeに固有の文字列を含む個別の文字列リソースファイルを定義できます。カスタムqabuildType があるようです。そうでない場合は、以下のqaの部分を無視してください。

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml

1
これはあなたのために働いたことがありますか?私は私の例を文書化し、それが仕事...ないstackoverflow.com/questions/26032950/...
volkersfreunde

これらはビルドタイプではなくフレーバーです
ジョージア州ベネタトス2016年

13

ローカリゼーション(多言語用)でアプリ名をサポートするソリューションが必要です。@Nick Unuchekソリューションでテストしましたが、ビルドに失敗しました(@ string /が見つかりません)。このバグを修正するための少しの変更:build.gradleファイル:

android {
    ext{
        APP_NAME = "@string/app_name_default"
        APP_NAME_DEV = "@string/app_name_dev"
    }

    productFlavors{

        prod{
            manifestPlaceholders = [ applicationLabel: APP_NAME]
        }

        dev{
            manifestPlaceholders = [ applicationLabel: APP_NAME_DEV ]
        }

    }

values \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod</string>
    <string name="app_name_dev">AAA dev</string>

</resources>

values-en \ strings.xml:

<resources>
    <string name="app_name_default">AAA prod en</string>
    <string name="app_name_dev">AAA dev en</string>

</resources>

Manifest.xml:

<application
    android:label="${applicationLabel}" >
</application>

たとえば、「Need for Speed」のようなゲームは、ドイツでは「Bedürfnisnach Geschwindigkeit」と呼ばれることはありません。怪しい開発者から
信じられないほどのJan

それは働いています。どうもありがとうございます。しかし、私の場合、私はより多くの1を追加する必要がtools:replace="android:label"applicationAndroidManifest
ファンティエットヴァンたLiNH


2

strings.xmlさまざまなフォルダーで使用できます。リリースおよびデバッグビルド用のAndroidの個別の文字列値をご覧ください。

したがって、このファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Your app name</string>
</resources>

次にapp\src\debug\res\values\app\src\release\res\values\フォルダーに貼り付けます。デバッグファイルとリリースファイルの「アプリ名」を置き換えます。フォルダapp_nameからアイテムを削除strings.xmlapp\src\main\res\values\ます。

ではAndroidManifest、あなたは同じになります

<application
    android:label="@string/app_name"
    ...

まったく変更はありません。あなたはそれのでライブラリを追加した場合でもAndroidManifest、ファイルとstrings.xml


1

著者がGradleでこれを行うように依頼した場合、設定ファイルではなくスクリプトで実行したいと想定できます。Android StudioGradleの両方が昨年(〜2018)に大幅に更新および変更されているため、上記の他のすべての回答は過度に歪んでいるようです。簡単な方法は、以下をに追加することapp/build.gradleです:

android {
    ...
    buildTypes {
        ...
        // Rename/Set default APK name prefix (app*.apk --> AwesomeApp*.apk)
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def appName = "AwesomeApp"
                outputFileName = appName+"-${output.baseName}-${variant.versionName}.apk"
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.