Android开发完全指南:深入解析构建类型与产品风味配置技巧

这是文章《Android的构建类型和产品风味》的第1部分(共1部分)。

在本教程中,我们将讨论Android的构建类型和产品风味。我们将看到它们如何在我们创建具有微小差异的应用程序时,使Android开发更轻松和更快速。这些差异可能只是主题和应用程序图标的改变,也可能是针对产品的不同阶段,如开发、测试、正式等。在Android Studio中创建一个新项目并选择基本活动。在下一节中,我们将介绍构建类型。

Android 构建类型

一旦创建了新项目,默认情况下包含两个构建类型/变体 – 调试和发布。调试是当我们直接从IDE运行应用程序到设备时使用的构建类型。发布是需要您对APK进行签名的构建类型。发布构建旨在上传到应用商店。在发布构建类型中,我们使用ProGuard对代码进行混淆,以防止反向工程。下图显示了默认的构建类型。在build.gradle中,默认只编写了发布构建类型块。

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

我们也可以在其他构建类型上添加属性。在此之前,让我们在android块中添加一些签名配置。

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

确保您已经创建了一个签名密钥文件,文件名为release-key并包含了上述密码,才能使上述代码正常工作。

让我们在 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"
        }
    }

应用程序Id后缀将字符串添加到应用程序的applicationId中。版本名称对defaultConfig中的版本名称进行同样的操作。现在我们有3个构建变体:在我们的设备上运行调试构建后,我们转到设置 | 应用程序 | 我们的应用程序名称。以下是应用信息的截图:底部的版本号已更改。这对于区分不同的构建非常有用。

构建配置

当创建不同的构建风味时,会自动生成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"'
        }
    }

以下是beta构建的BuildConfig。我们的Activities可以直接访问BuildConfig.java类及其字段。我们还可以使用buildConfigs添加资源字段。在您的beta buildConfig中添加以下内容,它将自动创建在resources | strings.xml文件夹中。

resValue "string", "my_name", "Anupam Beta"

Android产品风格

Android产品风味用于创建不同的应用版本。应用版本可以是免费的或付费的。它们可以有不同的主题和文本。它们可以使用不同的环境或API。让我们在我们的应用中分配两个产品风味,免费和付费。

productFlavors{

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

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

为了让上述代码在build.gradle中成功创建flavors,我们需要设置flavor维度。Flavor维度是按名称将flavors分组的一种方式。目前,我们只使用一个单一的分组。在您的defaultConfig块中添加以下行:

flavorDimensions "default"

现在同步Gradle会给你提供以下产品口味:

Android 构建变体结合了构建类型和产品风味,它们创建了一个包含所有组合的矩阵。

现在在我们的项目中,主文件夹包含所有应用版本的公共逻辑。要编写特定于不同版本的代码,请创建与该版本名称相同的文件夹。

  • 风味文件夹中具有相同名称的Java类不会覆盖主文件夹中的类。
  • 主文件夹中的res文件夹应该只包含所有风味共有的目录。

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

项目结构

因此,在免费和付费文件夹中,我们已经创建了res文件夹,其中app图标和strings.xml在每个风味中都是不同的。我们的最终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> - 免费版
<string name="textViewLabel">Hello Paid</string> - 付费版

MainActivity.java:

package com.Olivia.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, "风味: "+BuildConfig.FLAVOR + " 我的类型: "+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。以下是它们的样式:左边的应用是免费版,右边的是付费版。让我们分别启动它们。以下是它们的屏幕截图,一并展示。不同颜色的浮动操作按钮和应用程序名称。尝试点击浮动操作按钮,你会看到不同风格的SnackBar文本。

显示占位符

您可以直接在AndroidManifest.xml文件中为每个产品构建指定应用程序名称,而无需创建单独的strings.xml文件,只需使用build.gradle中的清单占位符即可。以下是它们的定义方式:现在我们可以在AndroidManifest.xml文件中使用appLabel键:教程到此结束。您可以从以下链接下载项目:

Android产品风格

从GitHub存储库下载

bannerAds