AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
来源:互联网 发布:单片机工程师 名称 编辑:程序博客网 时间:2024/05/22 02:07
在实际的开发与发布过程中,我们常需要根据不同的构建场景或者发布渠道,选择不同的.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多了两个我们添加的渠道,这时候选择一个然后开始构建,看效果吧!
- AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
- AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
- AndroidStudio工程中的build.gradle中的buildTypes、productFlavors的多构建、多渠道打包APK
- Android Studio -使用 Gradle打包多版本APK——buildTypes和productFlavors
- Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
- Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
- Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
- Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
- AndroidStudio动态调试apk
- cocos环境下AndroidStudio安装以及编译APK文件
- Android开发中Gradle的高级用法---productflavors, buildTypes
- scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
- scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名
- AndroidStudio环境下导出APK
- AndroidStudio无源码动态调试apk
- Androidstudio每次生成APK自增版本号、自动命名
- AndroidStudio下的混淆编译
- 解决 AndroidStudio 中 gradle 的 buildTypes 配置不生效问题
- php manual中的可修改范围
- mysql导出为CSV的同时加上表头
- [软件]_[Windows]_[实用系统工具类]
- 动态规划之矩阵连乘
- tableau自定义地图
- AndroidStudio下BuildTypes和ProductFlavors动态编译并重命名apk
- 【FastDev4Android框架开发】AndroidAnnnotations注入框架使用之第三方框架集成Otto事件总线(十四)
- 自定义简易确认取消Dialog
- 我认为的SSH数据流程
- ADB server didn't ack问题解决方法(ADB连接问题)
- 出差杂谈
- 超实用的JavaScript代码段 Item3 --图片轮播效果
- IOS学习基础-基础英语单词<01>
- IOS开发笔记32-UITableView(3)