AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk

news/2024/5/20 5:02:05 标签: android, Gradle

在实际的开发与发布过程中,我们常需要根据不同的构建场景或者发布渠道,选择不同的.java文件进行编译。而在AndroidStudio中,其自带的Gradle组件能帮我们快速实现这一功能。

什么是BuildTypes、Flavors、BuildVariants

BuildTypes:构建类型,AndroidStudio的Gradle组件默认提供给了“debug”“release”两个默认配置,此处用于配置是否需要混淆、是否可调试等
Flavors:产品渠道,默认不提供任何默认配置,在实际发布中,根据不同渠道,我们可能需要用不同的包名,服务器地址等
BuildVariants:每个buildtype和flavor组成一个buildvariant


实施步骤

实现目的:我们通过新增staging和 production渠道,分别针对调试阶段和发布阶段指向不同的服务器地址,并假设服务器地址编写于Constants.java文件中,在通过AndroidStudio默认的apk构建选项,动态根据不同渠道去自动生成指向不同服务器的apk

1、添加staging、production渠道

apply plugin: 'com.android.application'

dependencies {
    ...
}

android {
    compileSdkVersion 15
    buildToolsVersion "22.0.1"

    sourceSets {
        ...
    }

    buildTypes {
        //开启混淆
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        }

    }

    productFlavors {
        //新增渠道staging,表示调试阶段的发布
        staging {
        }

        //新增渠道production,表示产品发布阶段的发布
        production {
        }
        //其他不同apk市场渠道添加,类似...
    }

在”android”闭包内添加配置如上,新增了staging和production渠道。本文不对这两个渠道做个性化配置。

2、添加staging、production对应的源码目录

(1)在主Module目录中的创建目录“src/staging/java”“src/production/java”与原有的“src/main/java”目录对称
这里写图片描述
(2)在build.gradle中,指定staging、production的源码目录

apply plugin: 'com.android.application'

dependencies {
    ...
}

android {
    compileSdkVersion 15
    buildToolsVersion "22.0.1"

    sourceSets {
        ...
        staginge {
            java.srcDirs = ['src/staging', 'src/staging/java', 'src/staging/java/']
        }

        production {
            java.srcDirs = ['src/production', 'src/production/java', 'src/production/java/']
        }
    }

    buildTypes {
        ...
    }

    productFlavors {
        ...
    }

步骤分析:AS的Gradle组件会根据sourceset的配置,在实际编译过程中,根据选择的buildtype和。productfalvor(即buildvariant)到指定的源码目录查找源码文件,并且将main目录下的源码和这些指定目录下的源码进行合并(不是替换)

3、迁移Constant.java文件(关键)

把main下的Constant.java文件剪切+粘贴到”src/staging/java”和”src/main/java”的对应包下(注意千万不能保留main下的Constant.java文件),并且相应修改Constant.java里面的服务器地址

步骤分析:在Gradle进行构建时,它会现在main目录下寻找所需的.java文件,如果找不到,就会在构建时选择的渠道对应源码目录下寻找,如果此时main和渠道源码目录都有同一个.java文件,就会报“duplicate class(重复类)”错误。因此,应该删除main的原文件。

4、定义apk命名规则

我们暂定apk命名规则为:[appName][versionName]-[flavorName]-[date].apk,
如:MyAPPv2.0.0-production-201508171214.apk

apply plugin: 'com.android.application'

dependencies {
   ...
}



android {
    ...

    //修改生成的apk名字
    applicationVariants.all { variant ->

        if (variant.buildType.name.equals('release')) {
            variant.outputs.each { output ->
                def appName = 'MyApp'
                def oldFile = output.outputFile
                def buildName
                def releaseApkName

                variant.productFlavors.each { product ->
                        buildName = product.name
                }

                releaseApkName = appName + getVersionNameFromManifest() + '-' + buildName + '-' + getDate() + '.apk'
                output.outputFile = new File(oldFile.parent, releaseApkName)
            }
        }
    }
}

//获取时间戳
def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMddHHmm')
    return formattedDate
}

//从androidManifest.xml中获取版本号
def getVersionNameFromManifest() {
    def manifestParser = new com.android.builder.core.DefaultManifestParser()
    return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)
}

5、开始构建

Build->Generate Signed APK,补充好签名信息,可以看到Flavors多了两个我们添加的渠道,这时候选择一个然后开始构建,看效果吧!



http://www.niftyadmin.cn/n/1588738.html

相关文章

CentOS 6.5下安装Zabbix 2.2.x

操作系统:CentOS Mini 6.5 yum install httpd.x86_64 httpd-manual.x86_64 php-xml php-mbstring mysql-server.x86_64 mysql.x86_64 php-mysql.x86_64 php.x86_64 php-bcmath.x86_64 php-gd.x86_64 mysql-devel.x86_64 curl-devel gcc.x86_64 libgcc.x86_64 make …

Listsuper T 和Listextends T详解

代码中经常发现有List< super T>、Set的声明&#xff0c;是什么意思呢&#xff1f; < super T>表示包括T在内的任何T的父类&#xff0c;< extends T>表示包括T在内的任何T的子类&#xff0c;下面我们详细分析一下两种通配符具体的区别。 extends List<…

Minimum Fleet Problem

本文为MIT Senseable City Laboratory 2018年5月23号发表于Nature杂志Addressing the minimum fleet problem in on-demand urban mobility论文的学习笔记。 问题定义 给定一批出行需求&#xff0c;在出行需求被严格满足且最大空驶时间不超过δ分钟约束下&#xff0c;找到最小车…

Data URI浅析

在最近的印象中&#xff0c;最受期待的浏览器功能之一就是data URI了。最近已经有不少关于data URI的文章&#xff1a;我同事Stoyan Stefanov已经写了两篇关于data URI的文章&#xff0c;我旧同事Hedger Wang也写了一篇关于如何在IE使用data URI的文章。但出乎意料的是&#xf…

ViewStub的介绍

ViewStub是Android布局优化中一个很不错的标签/控件&#xff0c;直接继承自View。 ViewStub是一个非常轻量级的View&#xff0c;它是一个看不见&#xff0c;不占布局位置&#xff0c;占用资源非常小的空间。 可以为ViewStub指定一个布局文件&#xff0c;在inflate布局时&#x…

web.config中配置数据库(多数据)连接的两种方式

这是我的第一篇文章&#xff0c;既然是第一篇了&#xff0c;那就从最基础的只是说起--web.config中配置数据库连接。 网上有很多这方面的资料&#xff0c;但发现并没有一篇从头到位很清楚明了说完的&#xff0c;今天就把我的整理写在这里吧。 在网站开发中&#xff0c;数据库操…

android keystore

1、生成私钥 Keytool 选项 描述 -genkey 产生一个键值对&#xff08;公钥和私钥&#xff09; -v 允许动作输出 -alias<alias_name> 键的别名。只有前八位字符有效。 -keyalg 产生键的加密算法。支持DSA和RSA。 -keysize 产生键的长度。如果不支持&#xff0c;keytool用默…

DatePickDialog的基本用法(实例)

private DatePickerDialog pickerDialog; private void datePickDialog(){if(pickerDialog ! null){pickerDialog.dismiss();pickerDialog null;}Calendar calendar Calendar.getInstance();/*** 后面的三个参数是设置DatePickDialog显示时的默认日期*/pickerDialog new Dat…