从配置Product Flavor拆解Gradle
什么情况下我们使用Product Flavor
1、 需要用相似的代码创建不同的产品,或者为不同产品分配专有属性,或者设置不同的产品引入不同的包
2、 设置不同代码或引用
这种情况下不管对不对app内容做修改,我们都需要使用Product Flavor,确保你一台手机能上能安装多个渠道的app,即使看起来他们长得一样,比较通用的一个案例是手游。
使用这个东西看着很简单,觉得分分钟上手,然而其实有各种坑,本文就是踩坑手册
1、如何划分渠道?
android{
//增加如下配置
flavorDimensions("app", "ar") //注意这里声明的下面一定要有,没有编译就会报错
productFlavors {
app_fir {
dimension "app"
}
app_google {
dimension "app"
}
app_ar {//如果删除该渠道,flavorDimensions中的ar也要删掉
dimension "ar"
}
}
}
2、仅划分渠道
这种情况下代码层级还是跟原有的编码结构没有变化,只需要写一个单例类用于判断当前渠道,剩下的操作就根据值自己写吧。
关键代码如下
String TAG = BuildConfig.FLAVOR; //这个里面得出的结果和你在Product Flavor中定义的“app_fir ”是一致的
3、根据不同渠道显示不一样的内容
这个就稍微复杂点了,实际上我找了不少博客研究了挺久的,最后搞通了,先上图
上面这个五颜六色框子的图片就是我的项目结构图,其实东西很少,主要是为了测试。
项目一定要在“project”下才能看见全貌,增加的分支和main要有同级目录,也就是说java和res如果用得到一个都不能少,用不到就不用写了。
你这样写完之后,其实编译是编译不过去的,为啥?因为此处有坑阿!他会给你提示一个**“错误:类重复 ”**的错误,那啥原因呢?因为你没有指定渠道,它默认把所有代码合在一起了就发现同名文件夹下有多个同名类。
那咋解决呢?通过Build Variant配置Build Types,其实还有第二种办法注释掉其他的选择,但这样不方便测试。
这是找了几个博客才找到的,但问题看完我是懵逼的,平时写代码侧边这一溜都是关上的,完全没注意还能选择渠道
选完了就正常了。
Product Flavor里面的属性都是做什么用的?
lavorDimensions "app"//维度
productFlavors {
app_fir {
applicationId "com.test.package" //包名
dimension "app" //所属维度
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei", app_name: "AppForHUAWEI"]
}
}
1、applicationId 配置包名
2、dimension 配置所属维度
3、manifestPlaceholders 此项目涉及到AndroidManifest的配置
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />