Android productFlavors 实现多项目打包

最近接到产品一个需求,需要将现有工程打一个新的apk出来,要给到新客户使用,需要替换appIcon, appName, appId以及切换新的api接口需要切换新的地址。
场景大概如下图:

使用场景

二话不说,直接上代码
第一步:添加productFlavors配置
打开项目app工程的build.gradle文件,在android {}标签里面添加下面代码

productFlavors {
        _pro_hongyuan {
            applicationId "com.bibt.aide"
            resValue("integer", "app_evn", "1")
            resValue("string", "app_name", "智运维-弘源")
            manifestPlaceholders = [
                    app_icon    : "@mipmap/ic_launcher",
                    package_name: applicationId,
                    JPUSH_PKGNAME: applicationId,
                    JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //极光开发平台上注册的包名对应的appkey.
                    JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
            ]
        }

        _pro_wantong {
            applicationId "com.bibt.wantong"
            resValue("integer", "app_evn", "2")
            resValue("string", "app_name", "智运维-万通")
            manifestPlaceholders = [
                    app_icon    : "@mipmap/ic_launcher",
                    package_name: applicationId,
                    JPUSH_PKGNAME: applicationId,
                    JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //极光开发平台上注册的包名对应的appkey.
                    JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
            ]
        }
    }

然后还需要在build.gradle里面的defaultConfig{}标签里面添加这个配置flavorDimensions "default"

defaultConfig {
        //其他配置项省略
        flavorDimensions "default"
    }

不加这行会报这个错

image.png

第二步:配置fileprovider信息
打开App的AndroidManifest.xml文件,在application标签内添加provider节点

        
            
        

注意看了,这里引用了package_name变量,而package_name变量是在步骤一的productFlavors 中声明的
第三步:新建file_paths.xml文件
在app/src/res目录中新建xml文件夹,并新建文件file_paths.xml,文件内容为



    
    
    

这里同样的,也是用了变量值package_name
到这里也就完成了,可以直接编译打包。

过程比较痛苦,作者我遇到一个问题困扰许久,给大家分享下,避免大家跟我一样浪费时间,报错截图如下

image.png

这个错误的意思大概就是com.bibt.aide.DataProvider已经被使用了,话里话外的意思就是要我把com.bibt.aide这个换成别的,当时我是一脸懵逼的,因为,我已经在productFlavors 中定义了package_name,而且也作为变量引用到了AndroidManifest.xml和file_path.xml两个文件当中,理论上是没有问题的呀,而且在网上搜索该问题,其他博主也都是说这里用变量引用替换即可,于是我新建了一个helloword工程,将上面配置信息填入,结果发现没有任何问题,可以根据productFlavors 打出不同的apk包。

后面我仔细对比,最后发现还有一个地方的AppId是写死的


image.png

于是乎,我将其注释掉,一起添加到productFlavors(步骤一已经配置过了)中,然后编译打包,一票通过,也就是说,替换AppId以及packageName的时候,也要考虑第三方引用变量。

第四步:根据productFlavors 配置中的app_evn字段,切换不同的服务器地址,代码如下

    /**
     * 该方法在Application的OnCreate方法里面调用即可
     * 初始化服务器
     */
    private void initServer(){

        int server = getResources().getInteger(R.integer.app_evn);
        if(server == HttpServerGet.ENV_TEST){

            //测试环境
            HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_TEST;
            LogWrite.d("initServer:"+"测试环境", LogModel.MODEL_COMMON);

        }else if(server == HttpServerGet.ENV_HONGYUAN){

            //弘源-生产环境
            HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_HONGYUAN;
            LogWrite.d("initServer:"+"弘源-生产环境", LogModel.MODEL_COMMON);

        }else if(server == HttpServerGet.ENV_WANTONG){

            //万通-生产环境
            HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_WANTONG;
            LogWrite.d("initServer:"+"万通-生产环境", LogModel.MODEL_COMMON);

        }

    }

最后分享一张打包成功的截图

image.png

你可能感兴趣的:(Android productFlavors 实现多项目打包)