Android记录9--自动区分dev\release等环境变量并打包

前言

平时Android项目打包,都是直接点击build选择release,让编译器自动进行打包操作

但是这样子操作有一个问题,dev环境跟release环境的接口请求地址并不一致,第三方sdk的appid等参数也得改,以至于每次切换环境,都得花好久才能把所有参数改一遍,如果改错了还得重来,被测试那边说,有没有办法可以一步到位,让编译器自动匹配参数呢?

解决办法

所有步骤都在app/build.gradle中,都在android{}括号中

我们这边第三方sdk以极光为例

首先,我们需要修改app路径下的build.gradle

第一步

定义好自己需要的环境,myDebug跟myRelease名字可以根据需要取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
android{
signingConfigs {
myDebug{
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file('jks的路径')
storePassword 'xxxx'
}
myRelease {
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file('jks的路径')
storePassword 'xxxx'
}
}
}

第二步

1
2
3
 defaultConfig {
//可以在这里面写一些共通的配置信息,比方说versionCode之类的
}

第三步

分别配置debug环境跟release环境的相关变量,
这边我们可以在manifestPlaceholders配置app名称/第三方appkey,这些配置可以在manifest文件中去进行引用;
也可以通过定义buildConfigField配置不同的环境访问的不同的ip地址,在retrofit相关的httpMethods中去引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
buildTypes {
debug {
minifyEnabled false
// shrinkResources true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
manifestPlaceholders = [
app_label : "@string/app_name_dev",
JPUSH_APPKEY : "xxxxxxx", //JPush 上生产环境注册的包名对应的 Appkey.
JPUSH_CHANNEL: "developer-default" //暂时填写默认值即可.
]
applicationIdSuffix = '.test'
buildConfigField "String", "BASE_URL", "\"http://xxxxx:xxx\""
}
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
manifestPlaceholders = [
app_label : "@string/app_name_release",
JPUSH_APPKEY : "xxxxxxx", //JPush 上生产环境注册的包名对应的 Appkey.
JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
]
buildConfigField "String", "BASE_URL", "\"http://xxxxx:xxx\""
}
}

//这边可以根据版本自定义生成的apk的名字
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (variant.buildType.name.equals('debug')) {
outputFileName = "app-user-uat-release" + ".apk"
} else if (variant.buildType.name.equals('release')) {
outputFileName = "app-user-production-release" + ".apk"
}
}
}

第四步

现在我们可以在AndroidMenifests文件中,动态地设置app名称等信息,${xxxx}即第三部中在build.gradle中manifestPlaceholders中定义的那些字段

1
2
3
4
5
6
7
8
9
10
11
12
13
<application
android:name=".MyApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="${app_label}"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:allowBackup">
<meta-data
android:name="JPUSH_APPKEY"
android:value="${JPUSH_APPKEY}" />
</application>

第五步

我们可以在config文件中将BASE_URL赋值为第三步中通过buildConfigField声明的变量

1
2
3
4
public class Config {
//正式环境
public static String BASE_URL = BuildConfig.BASE_URL;
}

结尾

经过上面的五步操作,接下来我们可以在打包时自动区分环境了,不再需要每次切换环境的时候自己去改环境,改appkey之类的了,甚至也不需要给apk进行重命名了,打包的效率提升了不止一点点


##注意点
1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
signingConfigs {
debug{
keyAlias 'key0'
keyPassword 'android'
storeFile file('../sgi_back.jks')
storePassword 'android'
}
release {
keyAlias 'key0'
keyPassword 'android'
storeFile file('../sgi_back.jks')
storePassword 'android'
}
}

即第一步,必须要有!不然会报错
Could not get unknown property ‘release’ for SigningConfig container

  1. 在平时运行时,我们都是直接按绿色的三角形,但是都是默认debug环境,如果想切换运行环境,该怎么办呢?

    该图位于AS的左下角,点击Build Variants,再点击右侧的名称,会给你选择debug还是release环境,选择自己想要运行的环境即可

  2. 打包
    在控制台执行命令 gradlew assemble,执行完毕后会在 app\build\outputs\apk 里产生 所有你配置过的apk文件

在执行打包命令前,最好先执行下 gradlew clean 命令