173

注意:ザビエルの回答後に編集された回答

Android Studio で同じアプリケーション プロジェクトに異なるビルド フレーバーを使用しようとしています。ただし、適切に機能するように構成するのに苦労しているようです。

手順:

  1. 「Test」という名前の新しい Android Studio プロジェクトを作成します。
  2. build.gradle* を開き、次の行を追加します。

    productFlavors {
    flavor1 {
        packageName 'com.android.studio.test.flavor1'
        }
    flavor2 {
        packageName 'com.android.studio.test.flavor2'
        }
    }
    
  3. Android Studio を再起動すると、Build Variants セクションに4 つのビルド バリアントが表示されます。これまでのところ、製品のフレーバーの設定に成功したことを意味します。**
  4. フレーバー1 の新しいソース フォルダーを作成しました。ただし、正しい方法で行っているかどうかはわかりません。これが私がそれをした方法です:

    • このプロジェクトのパッケージ名は次のとおりです。com.foo.test
    • フォルダーを右クリックして、srcflavor1 の場合、構造がsrc/flavor1/java/com/foo/test/MainActivity.java.
    • 「java」フォルダは青で示されているため、上記はうまく機能しました。これは、IDE がアクティブなソース ディレクトリであることを認識していることを意味します。また、パッケージは自動的に作成されました。それにもかかわらず、重複したクラスが見つかったという警告が表示されます。こちらのスクリーンショットをご覧ください。
    • フレーバー 2 については、パッケージを手動で作成しようとしましたが、フレーバー 2 の 'src' フォルダーが青色ではないため、右クリック時のオプションが異なり、'新しいパッケージ' が使用できません。こちらの画像をご覧ください。
    • フレーバー 1 については、'res' ディレクトリも作成しましたが、これは青色に変わりますが、それにもかかわらず、Android リソース ファイルまたは Andorid リソース ディレクトリのいずれかを作成する機能は提供されません。さまざまなフレーバーのリソース。

私は何か間違ったことをしていますか?または、何か不足していますか?さらに情報が必要な場合はお知らせください。

*私のプロジェクトには2 つのbuild.gradle ファイルがあるようです。1 つはプロジェクト フォルダー (\GradleTest) のルートにあり、これは空です。\GradleTest のサブフォルダーのルートにある 2 つ目は、'GradleTest' (GradleTest-GradleTest) というラベルが付けられています。これは、開いたときに既にコードが含まれていたものです。したがって、それは私が編集したものです。

** gradle の設定を確認したところ、自動インポートの使用既に有効になっているようです。それにもかかわらず、build.gradle ファイルに変更を加えても、ビルド バリアントは自動的に更新されません。注: Build - Rebuild Project や Build - Make Project も使用してみましたが、ダメでした。プロジェクトを閉じて、変更を有効にするために再度開く必要があります。

4

7 に答える 7

19

Android の「プロダクト フレーバー」

同じアプリの異なるバージョンに応じて、異なるホスト、アイコン、さらにはパッケージ名を操作する方法について時々尋ねられました。

これを行う理由はたくさんありますが、1 つの簡単な方法は、製品のフレーバーです。

build.gradle スクリプトで、前に説明したようなことを定義できます。

製品のフレーバー この記事の一部は、製品のフレーバーについて考えて書かれています。Androidのドキュメントに関して:

製品フレーバーは、プロジェクトによってビルドされたアプリケーションのカスタマイズされたバージョンを定義します。1 つのプロジェクトは、生成されたアプリケーションを変更するさまざまなフレーバーを持つことができます。

それらをどのように定義できますか?定義するフレーバーを build.gradle に記述する必要があります。

productFlavors {  
        ...
        devel {
            ...
        }

        prod {
            ...
        }
    }

これで、アプリの 2 つの異なるフレーバーが作成されます。[Build Variants] タブ内の Android Studio でも確認できます。

ビルド バリアント

複数のパッケージ名

開発状態のアプリと本番状態のアプリを携帯電話にインストールしたい場合はどうなりますか。ご存知かもしれませんが、同じパッケージ名のアプリは 1 つしかインストールできません (携帯電話にインストールされているものと同じ新しい APK をインストールしようとすると、更新が試みられます)。

あなたがしなければならない唯一のことは、あなたの製品フレーバーのそれぞれでそれを定義することです:

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
        }
        prod {
            applicationId "zuul.com.android"
        }
    }
}

フレーバーに応じて複数のホストにリクエストを送信する 以前と同様に、製品のフレーバー構成フィールドにいくつかのパラメーターを含める必要があります。

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
            buildConfigField 'String', 'HOST', '"http://192.168.1.34:3000"'

        }

        prod {
            applicationId "zuul.com.android"
               buildConfigField 'String', 'HOST', '"http://api.zuul.com"'

        }
    }
}

例として、これを Retrofit と統合して、指定しているサーバーを処理せずにフレーバーに基づいて適切なサーバーにリクエストを送信する方法を示します。この場合、これは Zuul Android アプリの抜粋です。

public class RetrofitModule {

    public ZuulService getRestAdapter() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(BuildConfig.HOST)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        return restAdapter.create(ZuulService.class);
    }

}

ご覧のとおり、BuildConfigclass を使用して、定義したばかりの変数にアクセスするだけです。

コードで使用できる任意の変数 HOST 変数は、コードで公開できる唯一の変数ではありません。あなたはあなたが望むものでそれを行うことができます:

prod {  
    applicationId "zuul.com.android"
    buildConfigField 'String', 'HOST', '"http://api.zuul.com"'
    buildConfigField 'String', 'FLAVOR', '"prod"'
    buildConfigField "boolean", "REPORT_CRASHES", "true"
}

次のようにアクセスできます。

BuildConfig.HOST  
BuildConfig.FLAVOR  
BuildConfig.REPORT_CRASHES  

フレーバーごとに異なるアイコン フレーバーごとに異なるアイコンが必要な場合は、開いているアイコンを視覚的に検出できます (名前で行うこともできます... しかし、スペースに収まりません!)。フレーバーごとに新しいディレクトリ構造を定義します。

先ほど使用した例では、devel と prod の 2 つのフレーバーがあります。次に、必要なリソースを定義できるように、2 つの新しいディレクトリ構造を定義できます。

構造

strings.xml, integers.xml, arrays.xmlこれは、 などの他のタイプのリソースで機能します。

署名設定の構成

Gradle ビルド構成を使用して、リリース ビルド タイプの署名構成を手動で構成するには:

1.キーストアを作成します。キーストアは、一連の秘密鍵を含むバイナリ ファイルです。キーストアは安全な場所に保管する必要があります。2.秘密鍵を作成します。秘密鍵は、個人や会社など、アプリで識別されるエンティティを表します。3. 署名構成をモジュール レベルの build.gradle ファイルに追加します。

android {
...
defaultConfig {...}
signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
}
buildTypes {
    release {
        ...
        signingConfig signingConfigs.release
    }
}

}

署名付き APK を生成します。

署名済み APK を生成するには、メイン メニューから [ビルド] > [署名済み APK の生成] を選択します。app/build/apk/app-release.apk のパッケージがリリース キーで署名されました。

参照: https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavors-on-android/

于 2016-08-04T12:02:36.353 に答える
0

重要で、かなり長い間私を妨げていたのは、グラドルのフレーバー定義内で定義されたパッケージではなく、パッケージに一致する必要があるフレーバー名です。例えば:

src/flavor1/java/com/foo/A.java

一致します

productFlavors {
  flavor1 {
    packageName 'com.android.studio.test.foobar'
  }
}

しかし

src/foobar/java/com/foo/A.javaフレーバー 1 ビルドには使用されません。

于 2015-11-09T03:37:22.207 に答える