Android自动区分dev\release等环境变量并打包
前言
平时Android项目打包,都是直接点击build选择release,让编译器自动进行打包操作
Build选项
但是这样子操作有一个问题,dev环境跟release环境的接口请求地址并不一致,第三方sdk的appid等参数也得改,以至于每次切换环境,都得花好久才能把所有参数改一遍,如果改错了还得重来,被测试那边说,有没有办法可以一步到位,让编译器自动匹配参数呢?
解决办法
所有步骤都在app/build.gradle中,都在android{}括号中
我们这边第三方sdk以极光为例
首先,我们需要修改app路径下的build.gradle
第一步
定义好自己需要的环境,myDebug跟myRelease名字可以根据需要取
android{
signingConfigs {
myDebug{
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file('jks的路径')
storePassword 'xxxx'
}
myRelease {
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file('jks的路径')
storePassword 'xxxx'
}
}
}
第二步
defaultConfig {
//可以在这里面写一些共通的配置信息,比方说versionCode之类的
}
第三步
分别配置debug环境跟release环境的相关变量,
这边我们可以在manifestPlaceholders配置app名称/第三方appkey,这些配置可以在manifest文件中去进行引用;
也可以通过定义buildConfigField配置不同的环境访问的不同的ip地址,在retrofit相关的httpMethods中去引用
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中定义的那些字段
<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声明的变量
public class Config {
//正式环境
public static String BASE_URL = BuildConfig.BASE_URL;
}
结尾
经过上面的五步操作,接下来我们可以在打包时自动区分环境了,不再需要每次切换环境的时候自己去改环境,改appkey之类的了,甚至也不需要给apk进行重命名了,打包的效率提升了不止一点点
注意点
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
-
在平时运行时,我们都是直接按绿色的三角形,但是都是默认debug环境,如果想切换运行环境,该怎么办呢?
切换run app的运行环境
该图位于AS的左下角,点击Build Variants,再点击右侧的名称,会给你选择debug还是release环境,选择自己想要运行的环境即可
-
打包
在控制台执行命令 gradlew assemble,执行完毕后会在 app\build\outputs\apk 里产生 所有你配置过的apk文件
在执行打包命令前,最好先执行下 gradlew clean 命令