Android productFlavors多环境配置

一般开发过程都会有开发环境和线上环境,而他们的服务器地址是不同的;每次打包都要去改里面的url地址很麻烦。下面说一下我自己的配置方法:

defaultConfig {
//        applicationId rootProject.ext.android.applicationId  //ysl 通过下面的多环境来配置,这里不需要写包名了
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
        ndk {
            // 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置
            abiFilters 'armeabi-v7a'//,'armeabi','x86'
        }

        //必须要保证所有的flavor 都属于同一个维度
        flavorDimensions "default"

        //这里是集成的极光推送时定义的,也是为在清单文件中引用;已经放在下面的多环境配置中了
//        manifestPlaceholders = [
//                JPUSH_PKGNAME : applicationId,
//                JPUSH_APPKEY : "df9895e5495fd197d7319a03", //JPush 上注册的包名对应的 Appkey.
//                JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
//        ]
    }
    buildTypes {
        debug{
            minifyEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        //开发环境
        develop {
            applicationId 'com.dtrt.preventpro.develop'
            buildConfigField "int", "ENV_TYPE", "1"
            resValue "string", "app_name", "开发-安全管理"
            manifestPlaceholders = [
                    //极光推送的相关信息配置,便于清单文件中的引用
                    JPUSH_PKGNAME : applicationId,
                    JPUSH_APPKEY : "df9895e5495fd197d7319a03", //JPush 上注册的包名对应的 Appkey.
                    JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
                    app_icon: "@mipmap/splash"
            ]
        }
        //测试环境
//        check {
//            buildConfigField "int", "ENV_TYPE", "2"
//            applicationId 'com.dtrt.preventpro.test'
//            manifestPlaceholders = [
//                    app_name: "测-安全管理",
//                    app_icon: "@mipmap/splash"
//            ]
//        }
        //生产环境
        product {
            applicationId 'com.dtrt.preventpro'
            buildConfigField "int", "ENV_TYPE", "3"
            resValue "string", "app_name", "安全管理"
            manifestPlaceholders = [
                    //极光推送的相关信息配置,便于清单文件中的引用
                    JPUSH_PKGNAME : applicationId,
                    JPUSH_APPKEY : "df9895e5495fd197d7319a03", //JPush 上注册的包名对应的 Appkey.
                    JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
                    app_icon: "@mipmap/logo"
            ]
        }
    }

注意:里面写注释的地方,通常写包名的地方不需要了,写在了productFlavors里面;极光推送的配置也写在了里面;buildTypes里面照常写混淆规则,debug不混淆代码,release混淆代码。

通过上面的配置,来看一下打包时的样子:

开发环境和生产环境的debug/release包全都列出来了,我们一次可以全部打出来;

清单文件的写法:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.dtrt.preventpro">

    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature"></permission>
    <uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE"/>

<application
        android:name="com.dtrt.preventpro.App"
        android:allowBackup="true"
        android:icon="${app_icon}"
        android:roundIcon="${app_icon}"
        android:label="@string/app_name">

<activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false"
            android:theme="@android:style/Theme.NoTitleBar">
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </activity>

注意:我测试的结果是最顶部的package不用改,就是代码的文件夹路径那个包名;其余部分,appIcon使用${app_icon}来引用gradle文件中配置的图标名字;其它的有关极光推送的地方都是使用${applicationId}来引用;同理像极光推送的Key也可以在gradle文件中做配置。其它第三方的引用都可以通过此方式来写。

代码中怎么使用:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.dtrt.preventpro";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "product";
  public static final int VERSION_CODE = 10;
  public static final String VERSION_NAME = "1.0.10";
  // Fields from product flavor: product
  public static final int ENV_TYPE = 3;
}

上面是Android为我们自动生成的,可以看到FLAVOR、ENV_TYPE这些参数;生产环境定义的就是3,准确无误。

然后我们就可以在代码中利用这个来判断当前的环境了,根据环境切换服务器地址:

public static String getUrl() {
    String baseUrl;
    if(BuildConfig.ENV_TYPE == ApiConstants.PRODUCT){
        baseUrl = ApiConstants.BASE_URL_PRODUCT;//生产环境的服务器地址
    }else {
        baseUrl = ApiConstants.BASE_URL_DEVELOP;//开发环境的服务器地址
    }
    logger.info("BASE_URL = "+baseUrl);
    return baseUrl;
}

通过上面的一系列配置;每次打包的时侯,再也不用去修改代码里的服务器地址了。一次打多个包出来,测试验证通过后,把生产环境的包直接发布即可。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值