使用Gradle构建Android应用内测版本

在开发应用的过程当中,有时候须要比较当前线上版本和正在开发中的版本差别,目前的作法只能是在两个不一样的设备上面安装线上版本和开发中的版本,由于当前版本在调试过程当中会覆盖旧版本。本文经过使用gradle来构建android应用变种版本,经过配置build type和productFlavors来进行实践,结果不彻底尽如人意,可是提供了同一个程序不一样变种在一个设备上共存的一种实践。
html

applicationID VS package

在android的manifest文件中,咱们能够配置一个package字段,这个字段主要有两个做用:html5

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

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

buildTypes VS productFlavors

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

一些尝试

经过第二节,咱们能够打出一个内测包,可是仍是存在以下问题:ide

  1. 两个版本中大部分的隐式跳转都同样,你能忍受在应用内随便点击一个页面,就会弹出选择框的状况?
  2. 若是应用中注册了Provider,将会被禁止安装第二个app,由于Provider不能重名

针对第一个问题,我目前的解决方案是将actvity声明的data字段所有引用资源文件,而后经过flavor去为debug版本修改data中的implict_intent_host字段。gradle

<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已经再也不是公约的版本,这个暂时尚未解决方案来处理。。。,小小的遗憾ui

第二个问题好解决,只须要将provider的authorities字段区分一下便可,一样也会带来一点点问题,好比一个公司内部存在多个app,之间经过provider来提供数据的话,那么这个provider应该对于其它app是已知的,修改authorities以后,其余app会找不到这个provider。debug

总结

以上提到的方法虽然存在一些问题,可是从目前来看只要注意到以前提到的这些内容,应该不会给开发带来太大的困扰,同时咱们最好提供一个默认的flovar,它不定义任何特殊的行为,那么经过gradle assembleNormalDebug和咱们正常打出来的debug包没有任何差异。调试

相关文章
相关标签/搜索