在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本。本文通过使用gradle来构建android应用变种版本,通过配置build type和productFlavors来进行实践,结果不完全尽如人意,但是提供了同一个程序不同变种在一个设备上共存的一种实践。

applicationID VS package

在android的manifest文件中,我们可以配置一个package字段,这个字段主要有两个作用:

  1. 作为包名指出当前应用的R文件所在路径和组件所在路径。所以我们在manifest文件中可以使用相对路径来配置activity等。
  2. 作为应用的唯一标识在系统中存在,此时,其作用==applicationID。

要使同一个应用的不同版本在设备上共存的前提是它们具有不同的applicationID。

buildTypes VS productFlavors

要修改applicationId可以通过配置buildTypes中的applicationIdSuffix属性,起作用是将applicationId设置为package加上你所配置的后缀。此时,面临的第一个问题是我可能需要对debug版本和线上版本进行区分,比如不同的app图标,app名字以便在launcher里面进行区分。此时,productFlavor可以帮上忙,productFlavor提供了替换程序资源文件的功能,只需要在当前项目的src目录下新建一个flavor目录,在里面覆写资源即可。
到此,我们可以构建出一个用于开发的内测版本,它不会覆盖手机上已经安装的线上版本。

一些尝试

通过第二节,我们可以打出一个内测包,但是还是存在如下问题:

  1. 两个版本中大部分的隐式跳转都一样,你能忍受在应用内随便点击一个页面,就会弹出选择框的情况?
  2. 如果应用中注册了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应用内测版本的更多相关文章

  1. 用Gradle 构建android程序

    前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...

  2. 使用Gradle构建Android项目

    阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...

  3. 在内网使用Gradle构建Android Studio项目

    在Android Studio项目中,默认的远程仓库为jcenter,如果在项目引用了一些类库,Gradle构建程序的时候会将这些依赖类库从jcenter网站下载到本地,如我们在 build.grad ...

  4. gradle构建android项目详解

    1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ...

  5. 使用gradle构建Android时 版本号versionName中嵌入git提交信息

    为什么要这么做   在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦.   如果代码是通过git来管理的,git的commit id等 ...

  6. Gradle 构建 android 应用常见问题解决指南

    前言 android gradle 插件已经发展到0.5.7,同时gradle 本身也到了1.8,相比两个月前,android gradle 更快,更完善,也更好用了,为了让各位androider 早 ...

  7. gradle构建android项目

    工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ...

  8. 使用Gradle构建android应用

    介绍: 由于Android Studio使用的构建工具是Gradle,所以如果Eclipse和Android Studio想互相构建彼此的应用,必须使用Gradle. Gradle 是以 Groovy ...

  9. [Gradle] Gradle 构建 android 应用常见问题解决指南

    转载地址:http://www.cnblogs.com/youxilua/p/3348162.html 1: 使用最新的gradle android插件 以前我们写的时候会这么写 dependenci ...

随机推荐

  1. 关于driver_register做了些什么

    现在进入driver_register()函数去看看.在driver_register() 中,调用了driver_find(drv->name, drv->bus)函数,这里是干啥呢?这 ...

  2. .NET基础拾遗(7)多线程开发基础1

    一.多线程编程的基本概念 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块,拥有独占的资源和数据且可以被操作系统调度. But,即使是同一个 ...

  3. access 2007 vba 开发中学到的知识(一)

    使用ado连接本身的数据库,需要先创建一个 adodb.connection的连接对象 Set cn = CreateObject("ADODB.Connection") 数据库的 ...

  4. The Suspects

    算法:并查集 严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁.为了减少传播给别人的机会, 最好的策略是隔离可能的患者. 在Not-Spre ...

  5. 近期Responsive web design项目经验分享-高分辨率图片处理篇

    在高分辨率的情况下  商品的图片难免会失真 怎样才能让商品的图片在高分辨率的情况下 效果不失真 提供用户更好的体验呢 我发现了一个解决方案 不知道是不是你想要的 先上图片对比下效果 左侧是使用后   ...

  6. jQuery的Autocomplete插件的远程url取json数据的问题

    关于远程返回的json数据的展示,以前一样的代码,如果是本地写好的json串数据,插件显示就没有问题,一旦换成ulr方式读取一样的数据,插件就不能正常显示问题了. 今天偶然搜索资料找到一篇csdn上有 ...

  7. IOS 解析XML文档

    前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...

  8. Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析

    来自http://blog.csdn.net/luoshengyang/article/details/8479101 在Android系统中,Activity窗口的大小是由WindowManager ...

  9. POJ 3525 Most Distant Point from the Sea

    http://poj.org/problem?id=3525 给出一个凸包,要求凸包内距离所有边的长度的最小值最大的是哪个 思路:二分答案,然后把凸包上的边移动这个距离,做半平面交看是否有解. #in ...

  10. LeetCode_Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...