使用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 ...
随机推荐
- 关闭窗口(window.close)
close()关闭窗口 用法: window.close(); //关闭本窗口 或 <窗口对象>.close(); //关闭指定的窗口 例如:关闭新建的窗口. <script typ ...
- 移动端(IOS)iframe监听不到 onscroll 事件
问题描述: 我在一个页面A中有瀑布流,点击瀑布流中的图片需要进入到另外一个页面B,点击返回需要回到页面A中点击的位置,为了实现该效果所以在页面A中嵌入iframe,iframe指向页面B,页面B中同样 ...
- easyui 点击combox 文本框 显示下拉 panel
$(".combo-text").click(function () { var mid = $(this).parent().parent().find("select ...
- ref参数的用途
ref参数 能够将一个变量带入方法进行改变,改变完成后再将改变完成后的变量带出方法 ref参数要求在方法外必须为值赋值,而方法内可以不赋值 static void Main(string[] arr) ...
- JSP Servlet SQL 三者之间数据传递
前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记,web开发重点在于前台数据交互,页面美化而不要太沉溺于底层数据. 浏览器时代来到,向我们召唤出更炫.更简洁.更方便.更大气的网 ...
- 转自:Tsihang 三层网络设备对于IP报文的分片和重组处理原理
三层网络设备对于IP报文的分片和重组处理原理 对于网络分片,我一年前就想整理出来,虽然说网络上的资料很多,但是真正掌握精髓的除非真正做过分片程序,不然很难将协议栈整体联系起来理解.这篇文章,包括设计分 ...
- Java实现生产者消费者问题与读者写者问题
摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...
- MapDB:专为Java设计的高性能的数据库
MapDB是一个快速.易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps.Sets.Que ...
- 一个ajax的后台controller
@RequestMapping("/api/merBrand") @ResponseBody public ResultBrand merBrand(HttpServletRequ ...
- iOS开发:自定义tableViewCell处理的问题
还在适配iOS6,索性下一个版本不适配了~~~~~ 问题: *** Assertion failure in -[ PCDiaryDetailReplyCell layoutSublayersOfLa ...