使用 gradle 编译多版本 android 应用
最近要做一个 android 产品的变种版本,需要编出不同版本,每个版本有不同的包名、图标等等,和一些特有的逻辑。
很久之前做过类似的工作,当时没有 gradle, 用的方法是把公共代码抽成一个 library,不同版本建一个工程引用公共 libery。但是这种方法每个版本要建一个工程,工作量较大,并且会有一些重复代码,不好维护。
现在的工程是用 gradle 构建的,网上查了一下应该用 product flavors 做这个事情,之前没接触过,现在把方法记录在这里。
定义多版本
Product flavors 用法很简单。在 build.gradle 的 android 段中加入
android
{
...
productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
}
demo2 {
applicationId "com.mycompany.demo2"
}
}
}
gradle 的任务里就会多了 assembleDemo1 和 assembleDemo2,可以编出不同的版本。applicationId 是 apk 的包名,而且这个 applicationId 不会影响资源类 R 所在的包,在代码里不同版本引用的 class R 都是在 AndroidManifest.xml 所指定的 package 里,所以很方便。
Android Studio 界面左下角有个Build Variants 的选项,可以选择当前编那个版本。
添加多版本的资源文件目录
在 sourceSets段中可以设置不同版本的代码和资源位置。
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/main/java']
resources.srcDirs = ['src/main/java']
aidl.srcDirs = ['src/main/java']
renderscript.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
demo1.java.srcDirs = ['src/demo1/java']
demo1.res.srcDirs = ['src/demo1/res']
demo2.java.srcDirs = ['src/demo2/java']
demo2.res.srcDirs = ['src/demo2/res']
}
这里 main 是公共的代码和资源,demo1 及 demo2 中找不到的文件会在 main 中查找,因此每个版本下只要放自己改动过的文件就可以了。
多版本配置
在 productFlavors 中,可以指定配置
productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
buildConfigField 'String', 'HOST', '"http://www.baidu.com"'
}
demo2 {
applicationId "com.mycompany.demo2"
buildConfigField 'String', 'HOST', '"http://www.google.com"'
}
在代码中可以用 BuildConfig.HOST 来访问不同的配置。
控制不同权限
如果不同版本权限不同,可以用 manifestPlaceholders 修改 AndroidManifest.xml 中的内容来实现。
AndroidManifest.xml 中:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="${billPermission}" />
对 billPermission 设置不同的值,可以控制有没有内购权限:
productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
manifestPlaceholders = [
"billPermission": "com.android.vending.BILLING",
]
}
demo2 {
applicationId "com.mycompany.demo2"
manifestPlaceholders = [
"billPermission": "android.permission.INTERNET",
]
}
只有 demo1 有 com.android.vending.BILLING 权限。demo2 由于 INTERNET 权限和前面重复,会被忽略掉
Product Flavor 还有许多可以控制的地方,了解更多可以访问 Android Plugin DSL Referrence
使用 gradle 编译多版本 android 应用的更多相关文章
- 深入理解gradle编译-Android基础篇
深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...
- Android 项目利用 Android Studio 和 Gradle 打包多版本APK
在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...
- 利用 Android Studio 和 Gradle 打包多版本APK
在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...
- Android Studio工程Gradle编译报错
一.环境的搭建: 首先搭建好AndroidStudio环境.我使用的是Ubuntu 12.04系统(由于此机器还要运行其他程序,为避免兼容性问题,暂未更新到最新,而继续沿用此稳定版),java和jdk ...
- Android提升Gradle编译速度或减少Gradle编译时间.md
目录 Android如何提升Gradle编译速度或减少Gradle编译时间 最终优化方案 优化效果比对 将所有项目源码,各种缓存临时目录都移动到高性能SSD磁盘上 gradle.properties ...
- 升级gradle后。需要修改jenkin 编译java版本从1.8 到11
错误提示 * What went wrong: A problem occurred evaluating project ':App'. > Failed to apply plugin 'c ...
- Android Studio Gradle编译项目报错
Gradle project sync failed Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing Gradl ...
- 第三篇:gradle 编译 Android app 概览
引言:经过上两篇的论述,我们已经从代码到架构都简单的熟悉了一遍,理论上,只要知道android app的编译过程,我们大可以自己写一份用gradle编译app的插件,插件内将将整个流程用Task的依赖 ...
随机推荐
- Python str字符串常用到的函数
# -*- coding: utf-8 -*- x='pythonnnnnnoooo' print type(x) # <type 'str'> 输出类型 print x.capitali ...
- WCF实例管理的三种方式
很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...
- Javaweb实现的优优图书商城(含源码)
原文地址:http://www.cnblogs.com/liaoyu/p/uushop.html 源码地址:https://github.com/liaoyu/uushop 贴出一个大学时做的小项目, ...
- IIS发布报错
IIS发布报错一般原因 ISAPI和CGI限制作为IIS与ASP.NET的连接桥梁
- TCP建立连接和释放的过程,及TCP状态变迁图
一.TCP报文格式 下面是TCP报文格式图: 重要字段介绍: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2)确认序号:Ack序号,占 ...
- Codeforces Round #247 (Div. 2) C. k-Tree (dp)
题目链接 自己的dp, 不是很好,这道dp题是 完全自己做出来的,完全没看题解,还是有点进步,虽然这个dp题比较简单. 题意:一个k叉树, 每一个对应权值1-k, 问最后相加权值为n, 且最大值至少为 ...
- 函数fsp_get_space_header
/**********************************************************************//** Gets a pointer to the sp ...
- Java 并发基础
Java 并发基础 标签 : Java基础 线程简述 线程是进程的执行部分,用来完成一定的任务; 线程拥有自己的堆栈,程序计数器和自己的局部变量,但不拥有系统资源, 他与其他线程共享父进程的共享资源及 ...
- JavaScript闭包示例
在下面的例子中,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. <html> <head> <meta charset="utf ...
- Jqgrid入门-显示基本的表格(一)
首先对Jqgrid网格插件做个简要的说明.在众多的表格插件中,Jqgrid的特点是非常鲜明的. 特点如下: 完整的表格呈现与运算功能,包含换页.栏位排序.grouping.新增.修改及 ...