Gradle在Android的使用二

来源:互联网 发布:ps怎么制作淘宝详情页 编辑:程序博客网 时间:2024/06/07 02:40

Gradle构建变种版本

介绍

构建变种版本是有利于我们调试,多渠道打包。比如,我们需要上360,应用宝市场,然后需要区分这两个这两个市场的下载量,卸载量等,我们通过在清档文件带有一个渠道标识,当然,我们可以一次一次的分开打包,没打完一个包然后就再次修改渠道标识再次打包。但是这样子很繁琐时间也很长,我们就可以使用AS使用的Gradle实现变种apk来一次性打完所有的apk。同时使用多渠道打包,我们可以同时打出不同的安装名字和桌面名字的apk。比如在应用宝上面,安装名字是A,桌面名字是B,在360渠道上面安装名字是C,桌面名字是D,使用多渠道就可以一次性打出这些包。

使用

变种打包其实是等于productFlavors+不同的BuildType。
上一篇文件我们介绍了BuildType,虽然我们可以使用多个BuildType来达到使用不同的资源,代码,清单,依赖等,但是,当我们需要一次性输出多个apk的时候是行不通的,我们就可以使用productFlavors。
首先,我们需要在src目录下面建立一些我们需要的文件夹,就是我们需要打包的那些渠道,比如qihu360,yingyongbao,如下图:

然后,在可运行的app module根目录的build.gradle中的android节点下面,添加

   productFlavors{        dev {}        dev2 {}        qihu360{}        yingyongbao{}    }

这样子,同步一下,然后我们在运行测试的时候,可以在AS左下角BuildVariants中,选择安装不同的变种apk,可以用来测试。
他可以运行的种类是productFlavors的数目跟BuildType的数目的排列组合。比如4个变种,2个buildType,就可以输出8个apk。
我们通过AS的build工具,进行签名相关,就可以输出多个apk了。如下图:


我们输出的时候一般是选择release版本的需要的变种版本的apk,然后就静静等待一下apk打包完成即可。

高级

Android打包的时候回合并资源,上级会覆盖替换下级的资源。所以,假如我们需要统计某一个渠道,可以通过java的多台,使用继承,在各个变种使用不同的Application去继承main中的Application,或者是通过覆盖资源,或者是通过在各个变种的清单文件中添加不同的渠道,这样子就能起到不同的apk有不同的渠道而且可以一次性打包完成的作用。清单文件他也是会合并的。
在变种文件夹中,比如上面的qihu360,我们可以建立跟main文件夹一样的目录结构,只不过这些资源或是代码只可以在变种中存在和使用。这里就不一一截图了。
使用不同的资源和代码,通过覆盖和替换,我们可以定制各个不同的apk,公用大部分的代码和资源。比如我们的某一些变种需要广告,一些不需要,我们就可以通过java的多台实现。通过在main或者是lib中提供一个接口或者是类,然后在变种中实现,通过在变种的Application类写入,在main或者是lib中通过getApplication()获取,这样子就可以做到不同的变种使用不同的东西。
productFlavors中提供的变种除了可以输出不同的apk之外,他还可以设置更多的东西。
他可以定制变种的包名,变种的签名,变种的sdk版本等,比如:

productFlavors{        dev {            applicationId "com.example.user..dev"            minSdkVersion 14            targetSdkVersion 23            versionCode 1            versionName "1.0"            signingConfig signingConfigs.dev        }        dev2 {}        qihu360{}        yingyongbao{}    }

因为productFlavors和defaultConfig是同级的,所以defaultConfig的属性在productFlavors中也可以使用。这样子我们也就可以输出更加具有定制化的apk了,可以是不同签名的,不同version和针对不同android 版本的apk。
注意一点:
applicationId和package的区别:
applicationId是在build.gradle中定义的,package是在清单文件中定义的,他们二者可以不同。
applicationId是应用的真正包名,package是应用的资源包名,也就是R文件生成的路径,尹永峰资源的路径。某一些时候,他们不同是会出现一些问题的,比如,在个人实践中发现,使用友盟push的时候,假如不同会获取不到token,就是当你没有显示的设置包名参数给友盟的时候。有时候测试某一些广告的时候,有一些广告也是无法出现的。所以,还是建议这二者一般保持一致避免导致有时候找bug不知道是那里出问题了。

0 0
原创粉丝点击