美文网首页
Android自动区分dev\release等环境变量并打包

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

作者: 五月笑忘 | 来源:发表于2020-06-09 15:11 被阅读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 命令

    相关文章

      网友评论

          本文标题:Android自动区分dev\release等环境变量并打包

          本文链接:https://www.haomeiwen.com/subject/ruvbzhtx.html