从配置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}" />
发布了66 篇原创文章 · 获赞 5 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yuemitengfeng/article/details/103069144