Android StudioAndroid技术知识移动开发

Gradle构建Android差异包

2016-03-23  本文已影响446人  stefanli

【背景说明】

在Android项目开发过程中,需要和服务器进行通信,后台提供的接口区分了测试服务器和正式服务器,作为客户端,需要在测试环境上调试通过,才能发布到正式环境。由于接口API写死在代码中,所以每次测试服务器和正式服务器的切换,都需要修改本地的接口地址,这样做,显然不够灵活,而且也容易出错。那么能否在打包的时候进行配置,使得测试包连接测试服务器地址,正式包连接正式服务器的地址?我相信肯定是可以的,于是有了下面的尝试。

方案一:动态写入配置文件

当我想要解决这个问题的时候,首先想到的是动态写入配置文件,然后在应用启动的时候读取配置文件,这样就可以做到动态切换服务器地址。

主要有三个步骤:

  1. 在build.gradle文件中,定义一个方法,写入一个xml文件到assets目录下。
def setWebConfig(int type) {
    File file = new File("xxx/assets/web_config.xml");
    if (file.exists()) {
        file.delete();
    }
    def printWriter = file.newPrintWriter() //
    printWriter.write('<?xml version="1.0" encoding="utf-8"?>')
    printWriter.write('\n')
    switch (type) {
        case 0:
            printWriter.write('<config_type>release</config_type>')
            break;
        case 1:
            printWriter.write('<config_type>alpha</config_type>')
            break;
        case 2:
            printWriter.write('<config_type>beta</config_type>')
            break;
    }
    printWriter.flush()
    printWriter.close()
}

  1. buildTypes中,调用上面定义的setWebConfig方法,比如:
buildTypes {
    release {
        setWebConfig(0)
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    alpha {
        setWebConfig(1)
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    beta {
        setWebConfig(2)
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
  1. 在应用启动的时候读取assets目录下的xml配置文件,根据内容动态设置当前API地址。

通过以上步骤,就可以在打包的时候,选择不同的类型,应用不同的服务器地址。然而,这并不是最好的方法,在Android Studio里面,我们可以通过BuildConfig来轻松实现这个功能。

方案二:使用BuildConfig

刚刚转到Android Studio开发,很多东西还不熟,通过查询资料发现,Gradle会自动生成一个BuildConfig.java的类文件,这个文件无法手动编译,但是可以通过Gradle动态配置。有了这个特性,解决这个问题就变得很方便了。
直接读取BuildConfig.BUILD_TYPE值,判断包的类型,动态设置服务器地址就可以了。

if (BuildConfig.BUILD_TYPE.equals("release")) {
    // TODO xxx
} else if (BuildConfig.BUILD_TYPE.equals("alpha")) {
    // TODO xxx
} else if (BuildConfig.BUILD_TYPE.equals("beta")) {
    // TODO xxx
} else {
    // TODO xxx
}
上一篇 下一篇

猜你喜欢

热点阅读