在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本。本文通过使用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. Python-字符串开头或结尾匹配

    startswith() 和 endswith() 方法提供了一个非常方便的方式去做字符串开头和结尾的检查. 1.查看指定目录下的所有文件名 >>> import os >&g ...

  2. css圆角

    在CSS3中圆角属性,有四个.三个.两个和一个值. 四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下角.

  3. ORACLE网络配置大全没有比这个更详细的【weber出品】

    一.起篇 现在怎么说也是互联网时代,数据库也要联网,很多朋友学习Oracle的时候无外乎搭建的是以下两种学习环境: 1.直接在windows环境下安装Oracle后直接sqlplus连接. 2.在wi ...

  4. Dom对象和jQuery包装集

    Dom对象 在传统的JavaScript开发中,我们经常都是首先获取Dom对象,比如: document.getElementById("dv1"); 我们经常使用getEleme ...

  5. 东软实训2-在jsp中使用javaBean

    在JSP中可以像使用普通类一样访问JavaBean,在脚本元素中实例化类的对象,调用对象的方法.JSP提供了3个动作元素,和来访问JavaBean. 1.1 动作用于初始化JavaBean,或者定位一 ...

  6. spring 配置文件 数据库引入

    一.mysql数据库引入 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSourc ...

  7. url编码方法(暂时知道是什么

    var a="https://i.cnblogs.com/EditPosts.aspx?opt=1" encodeURI(a); encodeURIComponent(); dec ...

  8. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  9. CREATE DATABASE

    CREATE DATABASE IF NOT EXISTS `focusdata` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `fo ...

  10. PHP获取图片颜色值,检测图片主要颜色的代码:

    <?php $i=imagecreatefromjpeg("photo3.jpg");//测试图片,自己定义一个,注意路径 for ($x=0;$x<imagesx($ ...