使用Gradle构建Android应用内测版本
在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本。本文通过使用gradle来构建android应用变种版本,通过配置build type和productFlavors来进行实践,结果不完全尽如人意,但是提供了同一个程序不同变种在一个设备上共存的一种实践。
applicationID VS package
在android的manifest文件中,我们可以配置一个package字段,这个字段主要有两个作用:
- 作为包名指出当前应用的R文件所在路径和组件所在路径。所以我们在manifest文件中可以使用相对路径来配置activity等。
- 作为应用的唯一标识在系统中存在,此时,其作用==applicationID。
要使同一个应用的不同版本在设备上共存的前提是它们具有不同的applicationID。
buildTypes VS productFlavors
要修改applicationId可以通过配置buildTypes中的applicationIdSuffix属性,起作用是将applicationId设置为package加上你所配置的后缀。此时,面临的第一个问题是我可能需要对debug版本和线上版本进行区分,比如不同的app图标,app名字以便在launcher里面进行区分。此时,productFlavor可以帮上忙,productFlavor提供了替换程序资源文件的功能,只需要在当前项目的src目录下新建一个flavor目录,在里面覆写资源即可。
到此,我们可以构建出一个用于开发的内测版本,它不会覆盖手机上已经安装的线上版本。
一些尝试
通过第二节,我们可以打出一个内测包,但是还是存在如下问题:
- 两个版本中大部分的隐式跳转都一样,你能忍受在应用内随便点击一个页面,就会弹出选择框的情况?
- 如果应用中注册了Provider,将会被禁止安装第二个app,因为Provider不能重名
针对第一个问题,我目前的解决方案是将actvity声明的data字段全部引用资源文件,然后通过flavor去为debug版本修改data中的implict_intent_host字段。
<data android:host="@string/implict_intent_host"
android:path="/movie"
android:scheme="@string/implict_intent_scheme" />
这样,debug版本的activity的data将会改变,由于之前项目在创建隐式跳转都集中管理了,那么只需要修改创建的隐式intent Uri的host部分从资源文件读取即可。但是这个方案存在一些问题:从第三方(如html5页面)的跳转就会失效,因为内测版本的intent host已经不再是公约的版本,这个暂时还没有解决方案来处理。。。,小小的遗憾
第二个问题好解决,只需要将provider的authorities字段区分一下即可,同样也会带来一点点问题,比如一个公司内部存在多个app,之间通过provider来提供数据的话,那么这个provider应该对于其它app是已知的,修改authorities之后,其他app会找不到这个provider。
总结
以上提到的方法虽然存在一些问题,但是从目前来看只要注意到之前提到的这些内容,应该不会给开发带来太大的困扰,同时我们最好提供一个默认的flovar,它不定义任何特殊的行为,那么通过gradle assembleNormalDebug和我们正常打出来的debug包没有任何差别。
使用Gradle构建Android应用内测版本的更多相关文章
- 用Gradle 构建android程序
前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...
- 使用Gradle构建Android项目
阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...
- 在内网使用Gradle构建Android Studio项目
在Android Studio项目中,默认的远程仓库为jcenter,如果在项目引用了一些类库,Gradle构建程序的时候会将这些依赖类库从jcenter网站下载到本地,如我们在 build.grad ...
- gradle构建android项目详解
1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ...
- 使用gradle构建Android时 版本号versionName中嵌入git提交信息
为什么要这么做 在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦. 如果代码是通过git来管理的,git的commit id等 ...
- Gradle 构建 android 应用常见问题解决指南
前言 android gradle 插件已经发展到0.5.7,同时gradle 本身也到了1.8,相比两个月前,android gradle 更快,更完善,也更好用了,为了让各位androider 早 ...
- gradle构建android项目
工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ...
- 使用Gradle构建android应用
介绍: 由于Android Studio使用的构建工具是Gradle,所以如果Eclipse和Android Studio想互相构建彼此的应用,必须使用Gradle. Gradle 是以 Groovy ...
- [Gradle] Gradle 构建 android 应用常见问题解决指南
转载地址:http://www.cnblogs.com/youxilua/p/3348162.html 1: 使用最新的gradle android插件 以前我们写的时候会这么写 dependenci ...
随机推荐
- 网页、JavaScript 的DOM操作
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. Windows 对象操作 ...
- [MVC4-基礎] 從資料庫取值顯示在DropDownList中
剛開始學MVC4,以下是一些基礎的學習筆記! 完成效果像下面這樣,資料來源是既有的Database. 1.Controller public ActionResult Index() { SqlCon ...
- java中的变量
变量就是命名的内存空间 1.声明和赋值方式:数据类型 变量名 = 值: 数据类型即划分的内存空间,变量名即划分出的内存空间的名 2.变量必须先声明才能使用,不能使用一个没有经过预先声明的变量:没有 ...
- js库编写的环境和准备工作
在编写一个js库之前需要准备许多基础知识. 本人在编写之前主要参考了visjs和百度的echarts这两个库的部分内容,这之中提取出几个要点如下: 1.如何整理代码结构,使模块与模块分开又不至于出现调 ...
- Jquery 使用JSOPN实例
1.说明 dataType:返回的数据类型 jsonp:传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback:自定义的jsonp ...
- Jenkins学习之——(1)Jenkins的安装与配置
1.最近公司要求做自动化部署,于是自学了jenkins.这个参考书很少,网上的文章也讲得很模糊,于是打算把自己学习东西记下来,希望对大家有所帮助. 一.jenkins的安装 到jenkins官网(ht ...
- effective_c++条款20,用pass-by-reference-to-const替换pass-by-value
pass-by-value void f(A a); 1)导致复制是浪费资源 2)多态是导致对象切割 所以我们使用 void f(const A& a) 上面的话针对class,不针对基本类型 ...
- osg添加纹理示例
转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <o ...
- C# 获取计算机 信息
/// <summary> /// 获取本机 机器名 /// </summary> /// <returns></returns> public sta ...
- python 中变量的命名规范
出自:http://www.diybl.com/course/3_program/python/20111130/563643.html 模块名: 小写字母,单词之间用_分割 ad_stats.py ...