通过gradle文件构建不同包名的Apk

2,911 阅读3分钟

由于业务需求,我们可能需要将同一个工程项目为不同的公司进行定制开发,在代码逻辑基本相同的情况下,我们可以通过在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等。而具体的业务逻辑代码,我们也可以通过比对不同的包名数据,去判断具体的代码执行逻辑,从而实现更好的渠道定制。

以上是我的一些心得,本人技术水平一般,不喜勿喷,也希望各位大神有更好的方案可以与我分享,让我们共同进步!谢谢