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
在平时运行时,我们都是直接按绿色的三角形,但是都是默认debug环境,如果想切换运行环境,该怎么办呢?
该图位于AS的左下角,点击Build Variants,再点击右侧的名称,会给你选择debug还是release环境,选择自己想要运行的环境即可
打包
在控制台执行命令 gradlew assemble,执行完毕后会在 app\build\outputs\apk 里产生 所有你配置过的apk文件
在执行打包命令前,最好先执行下 gradlew clean 命令
前Android/Vue开发,现Infra从业人员,主营监控/AWS