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存储库下载