前言
一般情况下我们apk有debug和release两种包,这是因为buildTypes有debug release两种类型,gradle还提供了多渠道打包区别打不同功能apk版本,在productFlavors中设置,我们项目中三个版本,因此道理上讲我们可以打出6种类型的apk。在AS左下角的buil variant工具栏可以查看。
需求
根据productFlavors的不同,不同版本可以配置各种的appname packname applocationid 等等,这些配置都是在gradle文件中配置即可,那是否能实现不同版本调用不同的java代码么。答案也是肯定的,同理debug和release版本也可以实现编译不同的代码。
原理
gradle在编译之前,会对工程进行合并(merge),其中Java代码的merge方式是目录整合。具体是把main目录的Java文件 + 当前buildType目录的Java文件 + 当前productFlavor目录的文件直接整合到同一个目录。
实现
在src目录下新建main的同级目录debug和release,分别在里建java目录,java目录放各种不同的java代码。
注意
- 编译会经常会出现报类名重复错误,release目录下的java目录未变色。此时只需注意原理中所讲的,比如打包是debug包会首先讲debug和main目录下的代码merge再编译,因此当然debug和main下不能存在相同的类名。release包也同理
- debug和release下代码报名路径必须一致,比如main中调用了MySettingActivity.java这个类,impor导包时如果报名不一致debug包可以导,release包必然倒不了啦。
总结
怕出锅,就老实切换build variant模式,看编译是否通过。。因为默认都是debug模式的,一般往往release模式需要特别调。