Android内部版本和产品Flavor

时间:2020-02-23 14:28:47  来源:igfitidea点击:

在本教程中,我们将讨论Android构建类型和产品Flavor。
我们将了解它们如何使我们的Android开发更加轻松快捷,尤其是在创建差异最小的应用程序时。
这些差异可以与主题和应用程序图标的变化一样小,也可以针对产品的不同阶段(例如开发,测试版,生产等)进行。

在您的Android Studio中创建一个新项目,然后选择基本活动。
在下一节中,我们将介绍构建类型。

Android构建类型

创建新项目后,默认情况下,它包含两种构建类型/变体-调试和发布。

调试是当我们从IDE直接在设备上运行应用程序时使用的构建类型。

发布是一种构建类型,要求您对APK进行签名。
该发行版本应上传到Play商店。
在发行版本类型中,我们使用ProGuard混淆代码以防止进行逆向工程。

下图显示了默认的构建类型。

默认情况下,在build.gradle中,仅写入release build type块:

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

确保已使用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"
      }
  }

" applicationId"后缀将字符串附加到应用程序的applicationId。

versionName对defaultConfig中存在的版本名称执行相同的操作。

现在,我们有3个构建变体:

在我们的设备上运行调试版本后,我们转到设置|应用领域我们的应用名称。
以下是应用程序信息的屏幕截图:

底部的版本号已更改。
这对于区分不同的版本很有用。

BuildConfig

创建不同的buildFlavor时,将自动生成BuildConfig.java类。
我们可以在我们的build.gradle中设置Build Config Fields。

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

我们的活动可以直接访问" BuildConfig.java"类及其字段。

我们也可以在buildConfigs中使用添加资源字段。
在您的beta" buildConfig"中添加以下内容,它将在资源中自动创建| strings.xml文件夹。
resValue" string"," my_name"," Anupam Beta"

Android产品flavor

Android产品风味用于创建不同的应用版本。
应用程式版本可以免费或者付费。
它们可以具有不同的主题和文本。
他们可以使用不同的环境或者API。

让我们为应用分配免费和付费的两种产品flavor 。

productFlavors{

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

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

为了使build.gradle中的上述代码成功创建flavor ,我们需要设置flavor 尺寸。

风味尺寸是一种按名称对风味进行分组的方法。
目前,我们仅使用一个组。

在您的defaultConfig块中添加以下行:

flavorDimensions "default"

现在,同步gradle将为您提供以下产品flavor :

Android Build Variants结合了构建类型和产品风格。
它们创建所有组合的矩阵。

现在在我们的项目中," main"文件夹由所有应用程序版本中的通用逻辑组成。
要编写风味特定的代码,请创建与风味同名的文件夹。

  • 风味文件夹中具有相同名称的Java类不会覆盖主文件夹。

  • " main"目录中的" res"文件夹应仅具有所有风味通用的目录。

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

项目结构

因此,在免费和付费文件夹中,我们创建了res文件夹,其中每种flavor 的应用程序图标和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设置字符串。
每种flavor 的strings.xml资源都包含相同的键:

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

MainActivity.java:

package com.theitroad.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"。

这是它们的外观:

哇!左边的应用是免费的,右边的是付费的。

让我们启动每个。
以下是它们并排的屏幕截图。

哇!不同颜色的FloatingActionButton和应用程序名称。

尝试点击FAB,您会看到特定flavor 的SnackBar文本。

列表占位符

您可以直接在AndroidManifest.xml文件中为每种产品flavor 设置应用程序名称,而无需使用build.gradle中的Manifest占位符来创建单独的strings.xml文件。

现在我们可以使用AndroidManifest.xml文件中的apLabel键: