在本教程中,我们将讨论Android构建类型和产品风格。我们将看到它们如何使我们的Android开发变得更容易、更快,特别是当我们创建差异最小的应用程序时。这些差异可以小到主题和应用程序图标的变化,也可以针对产品的不同阶段,如开发、测试、生产等。在您的Android Studio中创建一个新项目,并选择基本活动。在下一节中,我们将介绍构建类型。
Android构建类型
创建新项目后,默认情况下它由两种构建类型/变量组成--调试、发布。调试是当我们从IDE直接在设备上运行应用程序时使用的构建类型。发布是需要您签署APK的构建类型。发布版本应该上载到Play商店。在发布版本类型中,我们使用ProGuard混淆代码以防止反向工程。下图显示了默认的生成类型。默认只写入发布构建类型块:
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个版本:在我们的设备上运行调试版本后,我们进入了设置|应用程序|我们的应用程序名称。以下是应用程序信息的截图:
底部的版本号已更改。这对于区分不同的版本非常有用。
构建配置
在创建不同的构建风格时,会自动生成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_name,
Anupam 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"
Android版本集构建类型和产品风格于一身。它们创造了一个包含所有组合的矩阵。
现在在我们的项目中,main
文件夹包含了所有应用版本的通用逻辑。要编写特定于口味的代码,请创建与口味同名的文件夹。
- flavor文件夹中同名的java类不会覆盖主文件夹。
main
中的res
文件夹应该只包含所有风格通用的目录。
现在让我们在项目中创建免费和付费文件夹,并为每个文件夹创建单独的res文件夹。
项目结构
所以在免费和付费文件夹中,我们已经创建了res文件夹,其中的应用程序图标和strings.xml对于每种口味都是不同的。我们最终的build.gradle文件如下:
Content_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}
我们已经在我们的设备上运行了两种版本:freDebug
和paidDebug
。这是他们的样子:哇!左边的应用是免费的,右边的是付费的。让我们把它们一一推出。以下是他们并排拍摄的截图。
哇!不同颜色的FloatingActionButton和应用程序名称。尝试单击FAB,您将看到特定于风格的SnackBar文本。
清单占位符
您可以使用build.gradle中的清单占位符,在androidManifest.xml文件中直接为每种产品风格设置应用程序名称,而不需要创建单独的字符串.xml文件。它们的定义方式如下:现在我们可以使用androidManifest.xml文件中的
appLabel
键:这将结束本教程。您可以从下面的链接下载该项目: