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

2020-06-09  本文已影响0人  五月笑忘

前言

平时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

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


    切换run app的运行环境

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

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

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

上一篇下一篇

猜你喜欢

热点阅读