Поиск по сайту:

Типы сборок Android и вкусы продуктов


В этом уроке мы обсудим типы сборки Android и вкусы продуктов. Мы увидим, как они сделают нашу разработку для Android проще и быстрее, особенно когда мы создаем приложения с минимальными отличиями. Эти различия могут быть такими незначительными, как изменения в темах и значках приложений, или могут быть связаны с различными этапами продукта, такими как разработка, бета-версия, производство и т. д. Создайте новый проект в Android Studio и выберите действие Basic. В следующем разделе мы рассмотрим типы сборки.

Типы сборки Android

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

Мы также можем добавить свойства для других типов сборки. Прежде чем мы это сделаем, давайте добавим несколько signingConfigs в блок android.

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

Убедитесь, что вы создали подписанный файл ключа с именем релиз-ключа и указанным выше паролем из Build | Создайте подписанный 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"
        }
    }

БилдКонфиг

Класс BuildConfig.java создается автоматически при создании разных buildFlavors. Мы можем установить поля конфигурации сборки в нашем build.gradle.

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"'
        }
    }

Вкусы продуктов Android

Android Product Flavors используются для создания различных версий приложений. Версии приложения могут быть бесплатными или платными. Они могут иметь разную тематику и тексты. Они могут использовать разные среды или API. Давайте назначим два вкуса продукта бесплатно и платно в нашем приложении.

productFlavors{

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

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

Чтобы приведенный выше код в build.gradle успешно создал варианты, нам нужно установить размеры вкусов. Flavor Dimensions — это способ группировки вкусов по названию. На данный момент мы используем только одну группу. Добавьте следующую строку в блок defaultConfig:

flavorDimensions "default"

Варианты сборки Android сочетают в себе типы сборки и вкусы продуктов. Они создают матрицу всех комбинаций.

Теперь в нашем проекте папка main состоит из общей логики для всех версий приложения. Чтобы написать код, специфичный для разновидности, создайте папку с тем же именем, что и у разновидности.

  • Класс Java с тем же именем в дополнительных папках не будет переопределять основную папку.
  • Папка res в main должна содержать только те каталоги, которые являются общими для всех разновидностей.

Теперь давайте создадим бесплатную и платную папки в нашем проекте и создадим для каждой отдельные папки res.

Структура проекта

<?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.journaldev.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);
    }
}

Заполнители манифеста

AndroidПродуктАроматы

Скачать из репозитория GitHub