Типы сборок 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