Android鬼点子 如何一只鸡下多个蛋!

385 阅读2分钟

如何一只鸡下多个蛋? 如何一套代码,对应多个版本,多个客户?

母鸡.jpg

实际的开发中遇到这样一个需求:一个产品要供应给不同的客户,绝大部分的逻辑代码和资源文件是一样的,服务器地址是不一样的。难道要把整个项目完整的拷贝一份,建一个新的项目?如果要修改共同的bug,这样就麻烦了。但是,不同的客户后期可能会有不同的需求,需要针对性的进行开发,怎么办?

不卖关子了,我的做法是坚持维护一套代码,同时还可以根据不同客户版本开发不同的功能。

我使用的开发环境是 Android Studio 3.0 Canary 9。利用gradle进行配置。

####1.服务器地址,String资源,不同的依赖

flavorDimensions "server"
productFlavors {
        C1_releaseServer {
                //BuildConfig.SERVER_ROOT_URL
                buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
                //R.String.app_name
                resValue("string", "app_name", "应用名1")
                dependencies {
                        compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
                }
                applicationId "com.smart1"
                dimension "server"
        }

        C2_releaseServer {
                //BuildConfig.SERVER_ROOT_URL
                buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
                //R.String.app_name
                resValue("string", "app_name", "应用名2")
                //依赖配置
                dependencies {
                         compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
                }
                applicationId "com.smart2"
                dimension "server"
        }
}

flavorDimensions 是版本的维度,这里只使用了一个维度,如果需要可以使用多个维度。多个维度会进行组合。applicationId 不同是为了一台手机上可以同时安装多个apk。注:AndroidManifest.xml中的package不需要修改。

Module的gradle修改完成之后,运行一下gradle。然后下面就会出现已经配置的Flavors了,可以选择之后,点击运行。注:如果你切换了不同的Flavors,gradle会再次运行一遍。运行之后代码中的BuildConfig.***才会编译成功。

Build Variants

####2.资源文件 不同的版本可能还会用到不同的图片资源。src文件夹下面间对应Flavors的资源文件,这里的资源文件可以是图片或者java文件。

AS
进入资源文件夹创建界面。

创建界面

红框里就是对应的Flavors,选择之后,上面是资源文件夹的类型。

文件夹创建好之后,就可以把资源文件拷贝进去了。这里需要注意的是,原来在main文件夹下的同名的文件需要删除。

//和productFlavors同级
sourceSets {
        //不同的资源要放在不同的版本对应文件夹中,main中不放,同且公用的资源放在main文件夹下

//        C1_releaseServer.java.srcDirs
//        C1_releaseServer.manifest.srcFile 'AndroidManifest.xml'

        C1_releaseServer.res.srcDirs = ['src/main/res','src/C1_releaseServer/res']
        C2_releaseServer.res.srcDirs = ['src/C2_releaseServer/res','src/main/res']
     

    }

最后,运行gradle,然后选择Build Variant,然后再运行gradle,完成后直接运行!