当前位置: 首页 > 科技观察

GradleforAndroidPartIV(BuildVariants)

时间:2023-03-15 16:49:50 科技观察

开发应用程序时,通常有多个版本。大多数时候,您需要一个开发版本来测试应用程序并确定其质量,然后是一个生产版本。这些版本通常有不同的设置,例如不同的URL地址。您更有可能需要免费版本和付费版本。基于以上情况,需要对不同的版本进行处理:开发免费版,开发收费版,生产免费版,生产收费版,不同版本的配置不同,大大增加了管理难度。Gradle有一些方便的方法来管理这些问题。很早以前就讲过debug和release版本,现在讲另外一个概念,不同的产品版本。构建版本和生产版本通常可以合并,构建版本和生产版本的合并版本称为构建变体。在本章中,我们将学习可以使开发更高效的构建,并学习如何使用它们。然后我们讨论构建与生产有何不同以及它们是如何合并的。我们将讨论签名机制,如何为不同的变体签名等。在本章中,我们遵循以下规则:构建类型产品风格构建变体签名配置构建版本在Gradle的Android插件中,构建版本意味着定义如何应用程序或依赖库已构建。每个构建版本都有一个特殊的方面,比如是否调试,应用程序id是什么,是否删除不必要的资源等等。您可以通过buildTypes方法定义构建。例如:android{buildTypes{release{minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}这个文件定义了模块是release版本,然后定义了proguard的位置。发布版本不是唯一的构建版本,默认情况下,还有一个调试版本。AndroidStudio将其视为默认构建版本。创建自己的构建版本当默认的构建版本不够用时,创建一个版本也很容易。要创建构建版本,您只需要在buildTypes中编写自己的版本即可。如下:android{buildTypes{staging{applicationIdSuffix".staging"versionNameSuffix"-staging"buildConfigField"String","API_URL","\"http://staging.example.com/api\""}}}我们A定义了stagingversion,它定义了一个新的applicationid,这使得它不同于debug和release版本的applicationID。假设您使用默认配置,applicationID将如下所示:Debug:com.packageRelease:com.packageStaging:com.package.staging这意味着您可以在设备上安装暂存和发布版本。暂存版本也有自己的版本号。buildConfigField定义了一个新的URL地址。您不必创建所有内容,因此最可能的方法是继承现有版本。android{buildTypes{staging.initWith(buildTypes.debug)staging{applicationIdSuffix".staging"versionNameSuffix"-staging"debuggable=false}}}initWith()方法创建一个新版本,同时复制所有现有构建版本,类似于继承。我们还可以覆盖现有版本的所有属性。源集当您创建新构建时,Gradle还会创建新的源集。默认情况下,不会自动为您创建此文件夹,因此您需要手动创建它。app└──src├──debug│├──java│└──com.package│││├──res│└──layout│└──activity_main.xml│└──AndroidManifest.xml├──main│├──java││└──com.package││├──res└──MainActivity.java└──Constants.java│││││└──AndroidManifest.xml├──staging│├──java││└──com.package├──drawable└──layout└──activity_main.xml│││├──res│└└──layout││└──activity_main。xml│└──AndroidManifest.xml└──release├──java│└──com.package│└──Constants.java└──AndroidManifest.xml注意:添加Java类时,需要知道如下程序,当您将CustomLogic.java添加到暂存版本时,您可以将相同的类添加到调试和发布版本,但不能添加到主版本。如果添加,将抛出异常。当使用不同的源集时,需要对资源文件进行特殊处理。drawables和layout文件会覆盖main中的同名文件,但values文件下的resources不会。Gradle会将这些资源与main中的资源合并在一起。例如,当你在main中创建一个srings.xml:TypesAndFlavorsHelloworld!当你还添加环.xml在你的染色版本中:TypesAndFlavorsSTAGING然后合并的strings.xml将是这样的:TypesAndFlavorsSTAGINGHelloworld!当您创建新构建而不是暂存时,最终的strings.xml将位于主目录strings.xml中。manifest也和value文件下的文件一样。如果您为构建创建了清单文件,则不必将清单文件复制到主文件下,您需要做的就是添加标签。Android插件将为您合并它们。我们将在后面的章节中介绍更多关于合并的细节。依赖包每个构建版本都有自己的依赖包,gradle会自动为每个构建版本创建不同的依赖配置。如果你想为调试构建添加一个日志框架,你可以这样做:dependencies{compilefileTree(dir:'libs',include:['*.jar'])compile'c??om.android.support:appcompat-v7:22.2.0'debugCompile'de.mindpipe.android:android-logging-log4j:1.0.3'}你可以将不同的构建版本与不同的构建配置结合起来,就像这样,这让你不同版本的不同依赖成为可能。产品口味与构建不同。产品口味用于创建不同版本的应用程序。一个典型的例子是一个应用有付费版和免费版。产品风格大大简化了基于相同代码构建不同版本的应用程序。如果您不确定是否需要新构建或产品风味,您应该问问自己是否需要apk供内部使用和外部使用。如果您需要发布一个全新的应用程序,与以前的版本完全隔离,那么您需要产品风味。否则你只需要构建版本。创建产品口味创建产品口味非常容易。您可以在productFlavors中添加代码:android{productFlavors{red{applicationId'com.gradleforandroid.red'versionCode3}blue{applicationId'com.gradleforandroid.blue'minSdkVersion14versionCode4}}}productflavors和构建版本配置不同。因为产品口味有自己的ProductFlavor类,就像defaultConfig一样,这意味着您的所有productFlavors共享相同的属性。源集就像构建,产品风格有自己的代码文件夹。创建特定版本就像创建文件夹一样简单。例如,如果您的blueflavors的生产版本具有不同的应用程序图标,则该文件夹需要称为blueRelease。多种口味构建变体在某些情况下,您可能需要创建某些产品口味的合并版本。例如,客户端A和客户端B可能都想要免费和付费版本,并且它们都基于相同的代码,但颜色不同等。创建四种不同的风格意味着具有重复的配置。组合口味的最简单方法可能是使用口味维度,如下所示:{flavorDimension"price"}}}添加风味维度时,需要为每个风味添加flavorDimension,否则会提示错误。flavorDimensions定义了不同的维度,当然顺序也很重要。当您组合两种不同的风格时,它们可能具有相同的配置和资源。例如上面的例子:blueFreeDebug和blueFreeReleasebluePaidDebug和bluePaidReleaseredFreeDebug和redFreeReleaseredPaidDebug和redPaidRelease构建变体构建变体是构建版本和生产版本的组合。当您创建构建版本或生产版本时,也会创建新的变体。例如,当你有debug和releasebuild,你创建了red和blueproductionbuild,那么就会有四种变体:你可以在Androidstudio的左下角找到它,或者通过VIEW|ToolWindows|BuildVariants打开它。此视图列出所有变体并允许您在它们之间切换。更改它们会影响您按下“运行”按钮。如果你没有productflavors,那么variant只包含build版本,即使你没有定义任何build版本,Androidstudio也会默认为你创建debug版本。tasksandroid插件回忆起每个变体创建不同的配置。一个新的Android工程会有debug和release两个版本,所以你可以使用assembleDebug和assembleRelease,当然当你使用assemble命令时,两者都会被执行。添加新构建时,也会创建新任务。例如:assembleBlue使用blueflavor配置并组装BlueRelease和BlueDebug。assembleBlueDebug将风格配置与构建类型配置相结合,风格设置覆盖构建类型设置。源集构建变体也可以有自己的资源文件夹,例如,你可以有src/blueFreeDebug/java/。合并资源文件和清单在打包应用程序之前,Android插件会合并main中的代码和构建的代码。当然,依赖的项目也可以提供额外的资源,它们也会被合并。对于调试变体,您可能需要额外的Android权限。比如你不想在main中声明这个权限,因为它可能会导致一些问题,所以你可以在debug文件夹中额外添加一个mainfest文件来声明额外的权限。resources和manifests的优先级是这样的:如果一个资源定义在main和flavor中,那么那个flavor中的资源有更高的优先级。然后将flavor文件夹中的资源打包到apk中。在依赖项目中声明的资源始终具有最高优先级。创建构建变体Gradle可以轻松处理构建变体。android{buildTypes{debug{buildConfigField"String","API_URL","\"http://test.example.com/api\""}staging.initWith(android.buildTypes.debug)staging{buildConfigField"String","API_URL","\"http://staging.example.com/api\""applicationIdSuffix".staging"}}productFlavors{red{applicationId"com.gradleforandroid.red"resValue"color","flavor_color","#ff0000"}blue{applicationId"com.gradleforandroid.blue"resValue"color","flavor_color","#0000ff"}}}在这个例子中,我们创建了4个变体,blueDebug、blueStaging、redDebug、redStaging。每个变体都有其不同的apiurl和颜色。例如:变体过滤器也可以忽略变体。这样您就可以在使用assemble时加快构建速度,这样您列出的任务就不会执行您不需要的变体。您可以使用过滤器,像这样在build.gradle中添加代码:android.variantFilter{variant->if(variant.buildType.name.equals('release')){variant.getFlavors().each(){flavor->if(flavor.name.equals('blue')){variant.setIgnore(true);}}}}在此示例中,我们检查:您可以看到blueFreeRelease和bluePaidRelease被排除在外,如果您运行gradlew任务,您将发现与上述变体相关的所有任务都不再存在。签名配置在分发您的应用程序之前,您需要使用您的应用程序私钥对其进行签名。如果您有付费版本和免费版本,则需要使用不同的密钥来签署不同的变体。这就是配置签名的好处。配置签名可以定义如下:创建有2种不同的签名配置。调试配置是默认的,它使用公钥库和密码,所以不需要为调试版本创建签名配置。暂存配置使用initWith()方法,该方法复制其他签名配置。这意味着用于暂存和调试的键是相同的。发布配置使用storeFile,它定义了密钥别名和密码。当然这不是一个好的选择,需要在Gradleproperties文件中进行配置。定义签名配置后,您需要应用它们。构建版本有一个属性叫做signingConfig,你可以这样做:android{buildTypes{release{signingConfigsigningConfigs.release}}}上面的例子使用了buildTypes,但是你可能需要为每个版本生成不同的验证,你可以定义它像这样:android{productFlavors{blue{signingConfigsigningConfigs.release}}}当然,如果你在flavor中定义这些,肯定会被重写,所以最好的方式是:android{buildTypes{release{productFlavors.red.signingConfigsigningConfigs。redproductFlavors.blue.signingConfigsigningConfigs.blue}}}总结在本章中,我们讨论了构建和生产,以及如何组合它们。当您需要不同的url和不同的密钥,并且您拥有相同的代码和资源文件,但类型和版本不同时,这将是一个非常有用的工具,构建和生产版本将使您的生活更轻松。我们还讨论了签名配置以及如何使用它们。在下一章中,您将学习多模块构建,因为当您希望将代码分离到依赖包或依赖项目中时,或者当您希望将Androidwear模块放入应用程序时,这将非常重要。