EnvironmentPlugin 一款用来配置可动态切换App环境的Gradle插件

简介

gradle中配置开发时的所有环境,你只需要很少的代码就能实现环境动态切换的功能。而在打生产包时你只需要在gradle中修改release的值为true就能将非生产环境剔除(不会将非生产环境打包到Apk中),从而保证非生产环境不会泄漏。在gradle中配置完成后只需要clean一下就会在BuildConfig的目录中生成一个EnvConfig的类,你只需要通过EnvConfig.getEnv()方法就能获取到所有你在gradle中配置的值,而此时你不需要关心自己当前处于哪个环境。切换环境时你只需要调用EnvConfig.setEnv(Type type)方法切换当前环境即可。
#GitHub
如果你想get源码,请点击https://github.com/kelinZhou/EnvironmentPlugin

体验

点击下载或扫码下载DemoApk

DemoApk

下载

第一步:添加 gradlew plugins 仓库到你项目根目录的 gradle 文件中。
buildscript {
  repositories {
    maven { url "https://plugins.gradle.org/m2/" }
  }
  dependencies {
    classpath "gradle.plugin.com.kelin.environment:environment:1.1.2"
  }
}
第二步:在module中引入插件。
apply plugin: "com.kelin.environment"

效果图

效果图

使用

在App gradle中添加如下配置。
environment {
    release false

    initEnvironment "test"

    devConfig {
        appIcon "@mipmap/ic_android"
        appRoundIcon "@mipmap/ic_android"
        appName "EnvPlugin"
//        versionCode 100
        versionName "1.0.0"
        applicationId "${packageName}.test"
    }

    releaseConfig {
        appIcon "@mipmap/ic_launcher"
        appRoundIcon "@mipmap/ic_launcher"
        appName "@string/app_name"
//        versionCode 200
        versionName "2.0.0"
        applicationId packageName
    }

    releaseEnv {
        alias "生产"

        variable "API_HOST", "192.168.31.24"
        variable "API_PORT", "8443"
        variable "WX_APP_ID", "wxc23iadfaioaiuu0a"
        variable "WX_APP_SECRET", "ioa9ad9887ad98ay979axxx"
        variable "UM_APP_KEY", '7c2ed9f7f1d5ecccc', true
    }

    devEnv {
        alias "开发"

        variable "API_HOST", "192.168.30.11"
        variable "API_PORT", "8016"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eefff'
    }

    testEnv {
        alias "测试"

        variable "API_HOST", "192.168.36.18"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eebbb'
    }

    demoEnv {
        alias "预发"

        variable "API_HOST", "192.168.36.10"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eeaaa'
    }
}

android{
    //...省略N多行代码
}

不要看代码这么多,其实很简单,你甚至可以直接拷贝我这里的代码进行使用。只是要把devConfigreleaseConfig这两个Extension中的值替换成你自己的就可以了。

#####下面主要来讲一下这些参数的含义。
######一、release&initEnvironment。

1).release:用来配置当前如果要打包的话是打生产包还是要打开发包,如果要打生产包着要把改值设置为true(release true),否者需要把值设置为false(release false)。一旦设置为true之后无论你是打debug(调试)包还是release(签名)包,initEnvironment的值将会无效,而且除了releaseConfig和releaseEnv以外的其他配置包括:devConfig、devEnv、testEnv和demoEnv都会失效,他们是不会被打包到.apk文件中的,否则就会。

2).initEnvironment:用来配置当前应用安装到一台设备上之后默认是什么环境,这里有以下这些值可以选择。

参数 说明
“release” 生产环境。
“dev” 开发环境。
“test” 测试环境。
“demo” 预发布环境。

**注意:**只是在新安装到一个设备上才会有效,如果是覆盖安装的话则不一定有效,因为你上一个版本可能做过环境切换,当切换后即使覆盖安装也会继续使用之前的环境,这是为了保证环境不会被莫名其妙的切换。还有就是改参数也可以不配置,如果不配置,这默认会是"release",并且该配置项只有在releasetrue的时候才是有意义的,但你也没有必要把release改为true后就删除该配置,一直留着就行,留着不会有任何影响。

######二、devConfigreleaseConfig这两个Extension。
来说下这两个Extension中都是有哪些配置。
1).appIcon:devConfig中用来配置开发时的应用图标,releaseConfig用来配置打成生产包后的图标。做要作用是用来在没有打开应用的时候区分当前是生产包还是开发包。

2).appRoundIcon:devConfig中用来配置开发时Android7.0的圆形应用图标,releaseConfig用来配置生产包的Android7.0的圆形应用图标。做要作用是用来在没有打开应用的时候区分当前是生产包还是开发包。(如果不做Android7.0圆形图标适配的话可以不配置改参数)

3).appName:devConfig中用来配开发时的应用名称,releaseConfig用来配置打成生产包后的应用名称。做要作用是用来在没有打开应用的时候区分当前是生产包还是开发包。

4).versionCode:devConfig中用来配开发时的版本号,releaseConfig用来配置打成生产包后的版本号。做要作用是用来分离开发包和生产包的不同版本,因为在开发过程中我们可能要出很多个版本这时你只需要修改devConfig中的viersionCode的值就可以了。改配置可以省略,如果省略者会用versionName的值来代替,例如versionName="1.0.1"那么versionCode的值就为101,这也就意味着如果你没有配置versionCode那么你一定要配置versionName。你可以在clean过后通过BuildConfig类文件查看到这两个值。

5).versionName:devConfig中用来配开发时的版本名,releaseConfig用来配置打成生产包后的版本名。做要作用与versionCode的主要作用一致。同样versionName的配置也是可以省略的,如果省略着会使用versionCode转字符串的方法为versionName赋值,例如versionCode=121那么versionName的值就为1.2.1,如果versionName的值不足3位数,那么将会在前面补0,例如versionCode=2那么versionName的值就为0.0.2。如果你的versionCode与versionName的规则与我的不一致那么你就需要两个都进行配置,例如:

versionCode 201908
versionName "1.4.05"

6).applicationId:通常情况下你不需要使用该参数进行applicationId的配置,因为这个就是你的应用包名(packageName),而包名不应该有多个,如果你有多个且有分享功能or三方登录功能的话你就要针对不同的包名申请不同的key,这是比较麻烦的,但是有的时候又确实需要不同的包名进行测试,例如推送Push服务(例如极光推送),如果你没有分离包名这有可能造成生产环境下的用户都能收到推送消息,如果项目还没有上线还好,但是如果上线了,这就会给用户带来不必要的困扰。所以,这个参数配置根据你的义务场景酌情选择。

devConfigreleaseConfig这两个Extension中就只有这么多的配置,But你只在这里配置过了并不会有什么作用,你需要在正常配置这些参数的地方使用它。就像下面这样。
versionCode、versionName以及applicationId的使用
app gradle 中

android {
    defaultConfig {
        //使用environment中配置的versionCode
        versionCode environment.versionCode
        //使用environment中配置的versionName
        versionName environment.versionName
        //使用environment中配置的applicationId
        applicationId environment.applicationId
    }
}

appIcon、appRoundIcon以及appName的使用
AndroidManifest 清单文件中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.kelin.environmenttoolsdemo">

    <application
            android:allowBackup="true"
            android:name=".App"
            android:icon="${APP_ICON}" //使用environment中配置的appIcon
            android:label="${APP_NAME}"//使用environment中配置的appName
            android:roundIcon="${APP_ROUND_ICON}"//使用environment中配置的appRoundIcon
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

**注意:**通过这种方式配置后,当你的release的值为true时使用的就是releaseConfig中的配置,否则使用的就是devConfig中的配置。还有一点需要注意就是appIconappRoundIconappName这三项配置在devConfigreleaseConfig这两个Extension中必须保证对等出现,例如你在devConfig中使用了appIcon这个配置,那么就必须要在releaseConfig中也配置appIcon否者在manifest清单文件中使用他们时是会报错的。

你也可能会觉得这么配置比较麻烦,首先声明我觉得不麻烦,就算是麻烦也就这一次,以后每次出包的时候省掉了很多修改。其次如果你实在不需要这样配,那么devConfigreleaseConfig这两个Extension也是可以省略不配的。就像下面这样:

environment {
    release false

    initEnvironment "test"

    releaseEnv {
        alias "生产"

        variable "API_HOST", "192.168.31.24"
        variable "API_PORT", "8443"
        variable "WX_APP_ID", "wxc23iadfaioaiuu0a"
        variable "WX_APP_SECRET", "ioa9ad9887ad98ay979axxx"
        variable "UM_APP_KEY", '7c2ed9f7f1d5ecccc', true
    }

    devEnv {
        alias "开发"

        variable "API_HOST", "192.168.30.11"
        variable "API_PORT", "8016"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eefff'
    }

    testEnv {
        alias "测试"

        variable "API_HOST", "192.168.36.18"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eebbb'
    }

    demoEnv {
        alias "预发"

        variable "API_HOST", "192.168.36.10"
        variable "UM_APP_KEY", '7c2ed9f7f1d5eeaaa'
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值