Help us understand the problem. What is going on with this article?

特定のproductFlavor/buildTypeにだけActivityを追加する

More than 5 years have passed since last update.

1 前提条件

AndroidStudio 1.3
productFlavor、buildTypeの設定は完了していて、以下のflavorがあるものとする

develop
staging

producFlavorの設定の仕方は以下を参照。
AndroidStudio1.3でproductFlavor (外部参照jarまで差し替えるよ)
http://qiita.com/le_skamba/items/af290f53f6d5ac0a2603

2 最終目標

あるproductFlavor/buildTypeにだけ、Activityを追加する
(当然、該当のBuildVarientにだけそのActivityを呼び出すコードがある)

3 Activityを追加したいflavorのパッケージ下に追加する

例えば、flavor「staging」の「flavortest.jp.sampleflavor.gui」に「SubActivity」を追加する場合。

(1) BuildVarientsをstagingのものにする

(2) プロジェクトエクスプローラの「flavortest.jp.sampleflavor.gui」を右クリック

(3) 「New」-「Activity」-「Blank Activity」(勿論作りたいActivityに合わせた物を選んで良い)をクリック

(4) Activity名やレイアウトファイル名など任意に記入し、パッケージ名を確認してFinishをクリック

(5) Manifestfileを確認する

上記手順で、manifests/下に、AndroidManifest.xml(stating)というのが増えているので開くと、以下のようにActivityだけ記述されている。

AndroidManifest.xml(stating)
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application>
        <activity android:name="flavortest.jp.sampleflavor.gui.SubActivity"
                  android:label="@string/title_activity_sub"
            >
        </activity>
    </application>

</manifest>

実際のファイルは、app/src/staging/下に存在する。
手動でActivityを追加したのであれば、app/src/staging直下にmanifestファイルを作ってやって、追加したいActivityだけ書いておけば良い。

ちなみに、AndroidManifest.xml(stating)を開くと、strings.xmlの参照などでCannot resolve symbolとエラー表示されている場合があるが、ビルドは通って実行も問題なく出来るので気にしなくて良い模様。

※ちなみに、Acticity名を以下のように相対パスで書くと、package名がdefaultConfigと異なる場合にActivity Not Foundになるので、絶対パスで書く必要がある模様。

相対パスはActivityNotFoundになる
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application>
        <activity android:name=".gui.SubActivity"  // <--相対で書いたらNG
                  android:label="@string/title_activity_sub"
            >
        </activity>
    </application>

</manifest>

おそらくパッケージ名の置換がビルド時にうまく行われないようだ。
(main/Manifestfile.xmlは相対パスで書いても大丈夫なのにね)

4 Activity呼び出しコードを書く

サンプル。staging/MainActivityに以下のように書いた。

MainActivity(staging)
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
        startActivity(intent);

同じコードをMainActivity(develop)に書くと、SubActivityがないよとコンパイルエラーが出る。developには作成していないので、正しい。

release/debugにだけ追加したい場合も、同様の手順でOK。
デバッグ時だけ出すデバッグ情報用の画面とか、レイアウトやアイコンの確認用の画面とか、デバッグしたいメニューの階層が深いのでいきなりそこに飛べるテスト用画面とか、特にdebugで用途がありそうですね。

le_skamba
Android/iPhoneアプリ開発者。その前はゲームプログラマをしてました。Windowsアプリも幾つか作りました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away