Android记录9--自动区分dev\release等环境变量并打包
    
  
      
      
     
    
      
        前言
平时Android项目打包,都是直接点击build选择release,让编译器自动进行打包操作
 
但是这样子操作有一个问题,dev环境跟release环境的接口请求地址并不一致,第三方sdk的appid等参数也得改,以至于每次切换环境,都得花好久才能把所有参数改一遍,如果改错了还得重来,被测试那边说,有没有办法可以一步到位,让编译器自动匹配参数呢?
解决办法
所有步骤都在app/build.gradle中,都在android{}括号中
我们这边第三方sdk以极光为例
首先,我们需要修改app路径下的build.gradle
第一步
定义好自己需要的环境,myDebug跟myRelease名字可以根据需要取
| 12
 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'
 }
 }
 }
 
 | 
第二步
| 12
 3
 
 |  defaultConfig {//可以在这里面写一些共通的配置信息,比方说versionCode之类的
 }
 
 | 
第三步
分别配置debug环境跟release环境的相关变量,
这边我们可以在manifestPlaceholders配置app名称/第三方appkey,这些配置可以在manifest文件中去进行引用;
也可以通过定义buildConfigField配置不同的环境访问的不同的ip地址,在retrofit相关的httpMethods中去引用
| 12
 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中定义的那些字段
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <applicationandroid: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声明的变量
| 12
 3
 4
 
 | public class Config {
 public static String BASE_URL = BuildConfig.BASE_URL;
 }
 
 | 
结尾
经过上面的五步操作,接下来我们可以在打包时自动区分环境了,不再需要每次切换环境的时候自己去改环境,改appkey之类的了,甚至也不需要给apk进行重命名了,打包的效率提升了不止一点点
##注意点
1.
| 12
 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