由于业务需求,我们可能需要将同一个工程项目为不同的公司进行定制开发,在代码逻辑基本相同的情况下,我们可以通过在gradle在去为不同的公司构建指定的打包配置信息,而最主要的信息有应用包名、版本信息、icon以及其他一些配置信息。
那么下面看下具体是如何进行配置的:
android {
...
//在android下方添加
productFlavors {
//第一个apk的打包配置
fashionlazy1 {
//应用包名
applicationId 'com.fashionlazy.demo1'
versionName "1.0.0"
versionCode 100
minSdkVersion 21
targetSdkVersion 21
resValue "string","app_name","FashionLazy"
//为manifest配置添加参数,供manifest调用
manifestPlaceholder = [authorities:"com.fashionlazy.demo1.fileprovider"]
falvorDimensions "demo1"
}
//第二个apk的打包配置
fashionlazy2 {
//应用包名
applicationId 'com.fashionlazy.demo2'
versionName "1.0.0"
versionCode 100
minSdkVersion 21
targetSdkVersion 21
resValue "string","app_name","FashionLazy"
//为manifest配置添加参数,供manifest调用
manifestPlaceholder = [authorities:"com.fashionlazy.demo2.fileprovider"]
falvorDimensions "demo2"
}
}
...
}
现在看到在gradle中我们已经配置了两个apk的打包配置,几个比较常用的值就不过多解释,让我们看下下面几个配置的说明
resValue
这里是定制string资源数据,主要是在资源文件中添加一个string的资源,这里特别注意不要在string.xml中再添加这个字段,否则可能会报错,出现重复定义字段的。例子中我们主要是配置了app_name这个值
manifestPlaceholder
这个参数可以理解为往manifest中添加一个对象,然后我们可以在AndroidManifest中去引用这个添加的对象。比如配置中我添加了一个authorities的参数,那么在AndroidManifest中要怎么调用,让我们来看下
<provider
android:authorities="${authorities}"
android:name=".provider.FileProvider"
android:exported="false"
>
....
</provider>
在代码中,通过${authorities}就可以去根据不同的打包配置去给AndroidManifest的provider设置不同的值啦,同理,其他一些参数我们也可以这样来配置
然后再让我们来看下怎么来打不同的apk包吧,不多说,有图有真相, 首先在Build中选择Generate signed Bundle/APK选项

然后选择一个签名文件进行打包签名,输入文件的相关信息,如下图:

然后让我们再次点击下一步,如下图所示

从图片中我们可以看到,此时我们可以打出四种包,分别是fashionlazy1包名的debug与release包,以及fashionlazy2包名的debug与release包,而fashion1跟fashion2就是我们在gradle文件的productFlavors属性下添加的两种配置信息。
总结
通过gradle文件,我们可以轻松的定制不同渠道下、不同公司业务下的apk包,去定义各个渠道下的包名、版本信息等,同时对于资源文件以及AndroidManifest中的一些配置,我们可以通过resValue、manifestPlaceholder去给各个渠道添加定制的参数信息,比如app_name、app_icon等。而具体的业务逻辑代码,我们也可以通过比对不同的包名数据,去判断具体的代码执行逻辑,从而实现更好的渠道定制。
以上是我的一些心得,本人技术水平一般,不喜勿喷,也希望各位大神有更好的方案可以与我分享,让我们共同进步!谢谢