アンドロイドのビルドタイプとプロダクトフレーバー

このチュートリアルでは、Androidのビルドタイプとプロダクトフレーバーについて説明します。これらが私たちのAndroid開発をより簡単かつ速くする方法を見ていきます、特に私たちが最小限の違いを持つアプリケーションを作成する場合です。これらの違いは、テーマやアプリアイコンの変更のように非常に小さなものであるか、dev、beta、productionなどの製品の異なる段階であるかもしれません。Android Studioで新しいプロジェクトを作成し、基本アクティビティを選択してください。次のセクションでは、ビルドタイプを見ていきます。

アンドロイドのビルドタイプ

新しいプロジェクトが作成されると、デフォルトで2つのビルドタイプ/バリアント(デバッグ、リリース)が含まれています。デバッグは、アプリケーションをIDEから直接デバイスに実行する際に使用されるビルドタイプです。リリースは、APKに署名する必要があるビルドタイプです。リリースビルドはプレイストアにアップロードすることが意図されています。リリースビルドタイプでは、逆アセンブルを防ぐためにProGuardを使用してコードを難読化します。次の画像はデフォルトのビルドタイプを示しています。build.gradleにはデフォルトでリリースビルドタイプブロックのみが書かれています。

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

他のビルドタイプにもプロパティを追加することができます。それを行う前に、androidブロックにいくつかのsigningConfigsを追加しましょう。

signingConfigs {
        release {
            storeFile file("release-key.keystore")
            storePassword 'password'
            keyAlias 'alias'
            keyPassword 'scdev'
        }
    }

上記のコードが動作するためには、Build | Generate Signed APKからリリースキー名および上記のパスワードを使用して署名済みのキーファイルを作成しているか確認してください。

ビルドタイプに新しいタイプを追加し、buildConfigにもっとプロパティを追加しましょう。

buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            applicationIdSuffix ".debug"
            versionNameSuffix "-debug"
        }

        beta{
            signingConfig signingConfigs.release
            applicationIdSuffix ".beta"
            versionNameSuffix "-beta"
        }
    }

applicationIdの接尾辞は、アプリケーションのapplicationIdに文字列を追加します。versionNameも同様に、defaultConfigに存在するバージョン名に追加します。今や3つのビルドバリアントがあります。デバッグビルドをデバイスで実行した後、設定|アプリケーション|アプリ名に移動しました。以下はアプリ情報のスクリーンショットです:下部のバージョン番号が変更されました。これは異なるビルドを区別するために役立ちます。

ビルドの設定

異なる buildFlavor が作成されると、BuildConfig.java クラスが自動生成されます。build.gradle で Build Config のフィールドを設定することができます。

buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            applicationIdSuffix ".debug"
            versionNameSuffix "-debug"
            buildConfigField "String", "TYPE", '"I AM A DEBUG NINJA"'
        }

        beta{
            signingConfig signingConfigs.release
            applicationIdSuffix ".beta"
            versionNameSuffix "-beta"
            buildConfigField "String", "TYPE", '"I AM A BETA NINJA"'
        }
    }

ベータビルドのためのBuildConfig
BuildConfig.javaクラスとそのフィールドは、私たちのアクティビティから直接アクセスすることができます。また、buildConfigs内でリソースフィールドを追加することもできます。次の内容をベータのbuildConfigに追加すると、リソース|strings.xmlフォルダに自動的に作成されます。resValue “string”, “my_name”, “Anupam Beta”

アンドロイド製品フレーバー

AndroidのProduct Flavorsは、異なるアプリのバージョンを作成するために使用されます。アプリのバージョンは無料または有料にできます。異なるテーマやテキストを持つことができます。異なる環境やAPIを使用することもできます。アプリケーションで無料と有料の2つのProduct Flavorsを割り当てましょう。

productFlavors{

        free{
            applicationId "com.scdev.androidproductflavors.free"
        }

        paid{
            applicationId "com.scdev.androidproductflavors.paid"
        }
    }

上記のbuild.gradleのコードでフレーバーを正常に作成するためには、フレーバーディメンションを設定する必要があります。フレーバーディメンションは、フレーバーを名前でグループ化する方法です。現時点では、われわれは単一のグループのみを使用しています。defaultConfigブロックに以下の行を追加してください。

flavorDimensions "default"

現在、Gradleを同期すると、次のプロダクトフレーバーが提供されます。

Androidのビルドバリアントは、ビルドタイプとプロダクトフレーバーを組み合わせています。これにより、すべての組み合わせの行列が作成されます。

私たちのプロジェクトでは、主フォルダにはすべてのアプリバージョンで共通のロジックが含まれています。フレーバー固有のコードを書くためには、フレーバーと同じ名前のフォルダを作成してください。

  • The java classes with the same name in the flavor folders won’t override the main folder.
  • The res folder in the main should only have those directories that are common to all flavors.

今、プロジェクト内に無料フォルダと有料フォルダを作成し、それぞれのために独立したリソースフォルダを作成しましょう。

プロジェクトの構造

フリーと有料のフォルダーには、それぞれのフレーバーごとにアプリアイコンとstrings.xmlの異なるresフォルダーを作成しました。最終的なbuild.gradleファイルは以下のようになります。これはcontent_main.xmlクラスです。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/textViewLabel"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

textViewには、strings.xmlから文字列を設定します。各フレーバーのstrings.xmlリソースには、同じキーが含まれています。

<string name="textViewLabel">Hello free</string> - For free
<string name="textViewLabel">Hello Paid</string> - For paid.

メインのアクティビティであるMainActivity.java:

package com.scdev.androidproductflavors;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Flavour: "+BuildConfig.FLAVOR + " My type: "+BuildConfig.TYPE , Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

私たちはデバイス上で「freeDebug」と「paidDebug」という2つのフレーバーを実行しました。これがそれらの様子です:わぁ!左側のアプリは無料で、右側のアプリは有料です。それぞれを起動しましょう。以下は、それらのスクリーンショットです。わぁ!異なる色のFloatingActionButtonとアプリケーション名です。FABをクリックしてみてください。フレーバーに特有のSnackBarテキストが表示されます。

マニフェストのプレースホルダー

以下のように、AndroidManifest.xmlファイル内で各製品フレーバーのアプリ名を直接設定することができます。別々のstrings.xmlファイルを作成する必要はありません。build.gradleでのManifest Placeholdersを使用します。以下にその定義方法が示されています。これで、AndroidManifest.xmlファイルでappLabelキーを使用することができます。このチュートリアルはこれで終了です。以下のリンクからプロジェクトをダウンロードできます。

アンドロイドのプロダクトフレーバー

GitHubリポジトリからダウンロードしてください。

コメントを残す 0

Your email address will not be published. Required fields are marked *