Android内部版本和产品Flavor
在本教程中,我们将讨论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
键: