安卓构建类型和产品口味

在本教程中,我们将讨论Android构建类型和产品风格。我们将看到它们如何使我们的Android开发变得更容易、更快,特别是当我们创建差异最小的应用程序时。这些差异可以小到主题和应用程序图标的变化,也可以针对产品的不同阶段,如开发、测试、生产等。在您的Android Studio中创建一个新项目,并选择基本活动。在下一节中,我们将介绍构建类型。

Android构建类型

创建新项目后,默认情况下它由两种构建类型/变量组成--调试、发布。调试是当我们从IDE直接在设备上运行应用程序时使用的构建类型。发布是需要您签署APK的构建类型。发布版本应该上载到Play商店。在发布版本类型中,我们使用ProGuard混淆代码以防止反向工程。下图显示了默认的生成类型。<code>Build.gradle</code>中的安卓构建类型variants默认只写入发布构建类型块:

1buildTypes {
2        release {
3            minifyEnabled false
4            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5        }
6    }

我们也可以在其他生成类型上添加属性。在此之前,让我们将一些signingConfigs添加到android块中。

1signingConfigs {
2        release {
3            storeFile file("release-key.keystore")
4            storePassword 'password'
5            keyAlias 'alias'
6            keyPassword 'journaldev'
7        }
8    }

确保您已经使用版本密钥名称和来自Build|Generate Signed APK的上面的密码创建了一个签名密钥文件,以便上面的代码能够工作。

让我们向BuildConfig中添加新的构建类型和更多属性。

 1buildTypes {
 2        release {
 3            signingConfig signingConfigs.release
 4            minifyEnabled false
 5            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 6        }
 7        debug{
 8            applicationIdSuffix ".debug"
 9            versionNameSuffix "-debug"
10        }
11
12        beta{
13            signingConfig signingConfigs.release
14            applicationIdSuffix ".beta"
15            versionNameSuffix "-beta"
16        }
17    }

APPLICATION Id后缀将字符串附加到应用程序的APPLICATION ID。versionName对defaultConfig中的版本名做同样的处理。现在我们有了3个版本:Android版本类型variants在我们的设备上运行调试版本后,我们进入了设置|应用程序|我们的应用程序名称。以下是应用程序信息的截图:安卓构建类型调试截图应用程序info底部的版本号已更改。这对于区分不同的版本非常有用。

构建配置

在创建不同的构建风格时,会自动生成BuildConfig.java类。我们可以在Build.gradle中设置构建配置字段。

 1buildTypes {
 2        release {
 3            signingConfig signingConfigs.release
 4            minifyEnabled false
 5            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 6        }
 7        debug{
 8            applicationIdSuffix ".debug"
 9            versionNameSuffix "-debug"
10            buildConfigField "String", "TYPE", '"I AM A DEBUG NINJA"'
11        }
12
13        beta{
14            signingConfig signingConfigs.release
15            applicationIdSuffix ".beta"
16            versionNameSuffix "-beta"
17            buildConfigField "String", "TYPE", '"I AM A BETA NINJA"'
18        }
19    }

Caption id=)构建测试版配置[/Caption]我们的活动可以直接访问BuildConfig.java类及其字段。我们也可以使用在BuildConfigs中添加资源字段。在您的测试版BuildConfig中添加以下内容,它将自动创建在Resources|Strings.xml文件夹中。resValue字符串my_nameAnupam Beta``

Android产品口味

Android产品风格被用来创建不同的应用程序版本。应用程序版本可以是免费的,也可以是付费的。它们可以有不同的主题和文本。他们可以使用不同的环境或API。让我们在我们的应用程序中免费和付费地分配两种产品口味。

 1productFlavors{
 2
 3        free{
 4            applicationId "com.journaldev.androidproductflavors.free"
 5        }
 6
 7        paid{
 8            applicationId "com.journaldev.androidproductflavors.paid"
 9        }
10    }

为了让build.gradle中的上述代码成功创建口味,我们需要设置口味维度。风味维度是一种按名称对口味进行分组的方法。目前,我们只使用一个组。在defaultConfig块中添加以下行:

1flavorDimensions "default"

现在同步Gradle将为您提供以下产品口味:Android product Favors variants

Android版本集构建类型和产品风格于一身。它们创造了一个包含所有组合的矩阵。

现在在我们的项目中,main文件夹包含了所有应用版本的通用逻辑。要编写特定于口味的代码,请创建与口味同名的文件夹。

  • flavor文件夹中同名的java类不会覆盖主文件夹。
  • main中的res文件夹应该只包含所有风格通用的目录。

现在让我们在项目中创建免费和付费文件夹,并为每个文件夹创建单独的res文件夹。

项目结构

android-product-flavors-project-structure所以在免费和付费文件夹中,我们已经创建了res文件夹,其中的应用程序图标和strings.xml对于每种口味都是不同的。我们最终的build.gradle文件如下:安卓产品风味构建gradleContent_main.xml类如下:

 1<?xml version="1.0" encoding="utf-8"?>
 2<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
 3    xmlns:app="https://schemas.android.com/apk/res-auto"
 4    xmlns:tools="https://schemas.android.com/tools"
 5    android:layout_width="match_parent"
 6    android:layout_height="match_parent"
 7    app:layout_behavior="@string/appbar_scrolling_view_behavior"
 8    tools:context=".MainActivity"
 9    tools:showIn="@layout/activity_main">
10
11    <TextView
12        android:layout_width="wrap_content"
13        android:layout_height="wrap_content"
14        android:text="@string/textViewLabel"
15        app:layout_constraintBottom_toBottomOf="parent"
16        app:layout_constraintLeft_toLeftOf="parent"
17        app:layout_constraintRight_toRightOf="parent"
18        app:layout_constraintTop_toTopOf="parent" />
19
20</android.support.constraint.ConstraintLayout>

在TextView中,我们设置字符串。每种口味的strings.xml资源都包含相同的键:

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

MainActivity.java

 1package com.journaldev.androidproductflavors;
 2
 3import android.os.Bundle;
 4import android.support.design.widget.FloatingActionButton;
 5import android.support.design.widget.Snackbar;
 6import android.support.v7.app.AppCompatActivity;
 7import android.support.v7.widget.Toolbar;
 8import android.view.View;
 9import android.view.Menu;
10import android.view.MenuItem;
11
12public class MainActivity extends AppCompatActivity {
13
14    @Override
15    protected void onCreate(Bundle savedInstanceState) {
16        super.onCreate(savedInstanceState);
17        setContentView(R.layout.activity_main);
18        Toolbar toolbar = findViewById(R.id.toolbar);
19        setSupportActionBar(toolbar);
20
21        FloatingActionButton fab = findViewById(R.id.fab);
22        fab.setOnClickListener(new View.OnClickListener() {
23            @Override
24            public void onClick(View view) {
25                Snackbar.make(view, "Flavour: "+BuildConfig.FLAVOR + " My type: "+BuildConfig.TYPE , Snackbar.LENGTH_LONG)
26                        .setAction("Action", null).show();
27            }
28        });
29    }
30
31    @Override
32    public boolean onCreateOptionsMenu(Menu menu) {
33        getMenuInflater().inflate(R.menu.menu_main, menu);
34        return true;
35    }
36
37    @Override
38    public boolean onOptionsItemSelected(MenuItem item) {
39        int id = item.getItemId();
40        if (id == R.id.action_settings) {
41            return true;
42        }
43
44        return super.onOptionsItemSelected(item);
45    }
46}

我们已经在我们的设备上运行了两种版本:freDebugpaidDebug。这是他们的样子:安卓产品口味应用output哇!左边的应用是免费的,右边的是付费的。让我们把它们一一推出。以下是他们并排拍摄的截图。安卓产品flavors哇!不同颜色的FloatingActionButton和应用程序名称。尝试单击FAB,您将看到特定于风格的SnackBar文本。

清单占位符

您可以使用build.gradle中的清单占位符,在androidManifest.xml文件中直接为每种产品风格设置应用程序名称,而不需要创建单独的字符串.xml文件。它们的定义方式如下:安卓产品风味清单placeholders现在我们可以使用androidManifest.xml文件中的appLabel键:安卓产品风味manifest这将结束本教程。您可以从下面的链接下载该项目:

AndroidProductFlavors

从GitHub Repository下载

Published At
Categories with 技术
Tagged with
comments powered by Disqus