美文网首页
Gradle多版本/多环境打包

Gradle多版本/多环境打包

作者: allsunny | 来源:发表于2018-08-17 14:34 被阅读0次

    本文开发环境:

    • Android Studio 3.1.4 Build #AI-173.4907809, built on July 24, 2018
    • JRE: 1.8.0_152-release-1024-b02 amd64
    • JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
    • Windows 10 10.0

    一、概述

    App开发过程中,基本都需要多个环境,比如开发环境develop,测试环境check,生产环境product。各个环境下,网络请求的url会有所区别,一般我们通过baseUrl进行切换。

    • 开发环境用于程序员开发和自测;
    • 测试环境用于测试人员测试使用,环境配置和生产环境完全相同;
    • 生产环境即正式环境,也就是用户所使用的环境。

    每个环境下,app还可以分为debug版本和release版本。

    • debug版本下,apk无需混淆,可以多一些打印日志的操作。
    • release版本下,文件混淆,隐藏日志打印。

    Android Studio中,多版本/多环境等需求都可以通过配置gradle文件来解决。

    二、实践

    debug和release版本的区分通过buildTypes

    1. 新建一个demo工程,AS默认生成的gradle只有release版本。
    defaultConfig {
        applicationId "com.allsunny.packagedemo"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    

    demo中的默认applicationId 为com.allsunny.packagedemo,我们知道,在Android系统中,同一个app只能安装一个,系统就是根据applicationId来判断是否为同一个apk。我们要想在一台手机中同时安装debug和release版本,就要修改applicationId 。

    2.我们将其略加修改,添加混淆和debug版本。debug版本下增加字段applicationIdSuffix用来修改applicationId
        buildTypes {
            //调试版本,无混淆
            debug {
                //为debug版本的包名添加.debug后缀
                applicationIdSuffix ".debug"
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
            release {
                minifyEnabled true
                zipAlignEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.config
            }
        }
    

    修改完成后,我们可以通过选择Build Variant来选择不同的打包环境和打包版本,目前只有两个版本debug和release。如图所示:

    1.png

    我们选择release后编译打包。
    因为我们现在有debug和release两个版本,release无法再使用默认的签名文件,所以我们要自己生成一个jks签名文件,release包使用新生成的正式签名文件来签名。否则会报错:

    the apk for your currently selected variant(app-release-unsigned.apk)is not signed.
    Please specity a signing configuration for this variant(release)

    配置签名文件方案:https://blog.csdn.net/l_lhc/article/details/77963683
    配置完成后,AS会自动在release{...}中生成 signingConfig signingConfigs.config。然后就可以正常编译打包了。至此,多版本的配置就完成了。接下来我们来看多环境的gradle配置。

    环境的区分通过productFlavors

    productFlavors {
        //开发环境
        develop {
            applicationIdSuffix ".dev"       //applicationId "com.allsunny.packagedemo.dev"
            buildConfigField("int", "ENV_TYPE", "1")
            manifestPlaceholders = ["app_name": "开发环境", "app_launcher_icon": "@mipmap/ic_launcher_dev"]
        }
    
        //生产环境
        product {
            buildConfigField("int", "ENV_TYPE", "2")
            manifestPlaceholders = ["app_name": "生产环境", "app_launcher_icon": "@mipmap/ic_launcher"]
        }
    }
    

    编译后如果报如下错误:

    All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

    则在android{...}中添加 flavorDimensions "default"

    android {
        flavorDimensions "default"
        ......
        }
    

    目前demo中只添加了开发环境和生产环境,开发者可以自主添加测试环境。我们在develop环境中增加了applicationIdSuffix ".dev" ,这样就可以在同一台手机中同时安装4个apk包了。分别是:

    • 开发环境debug版本,包名com.allsunny.packagedemo.dev.debug
    • 开发环境release版本,包名com.allsunny.packagedemo.dev
    • 生产环境debug版本,包名com.allsunny.packagedemo.debug
    • 生产环境debug版本,包名com.allsunny.packagedemo

    buildConfigField表示在编译生成的BuildConfig文件当中添加字段属性“ENV_TYPE”,我们可以在代码当中根据BuildConfig.ENV_TYPE的值来判断apk是处于开发环境(1== BuildConfig.ENV_TYPE)还是生产环境(2==BuildConfig.ENV_TYPE)。

    manifestPlaceholders中定义的属性字段会替换AndroidManifest当中的相关属性,我们目前替换了app名称和icon。在manifest文件中需做对应修改:

        <application
            android:allowBackup="true"
            android:icon="${app_launcher_icon}"
            android:label="${app_name}"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    

    编译后在Build Variant中可以看到可以生成4个apk版本了:

    2.png

    我们在页面中将包名和ENV_TYPE打印出来:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tvPackageName = findViewById(R.id.tv_package_name);
            tvPackageName.setText("packageName = " + getApplication().getPackageName() + "\n\n"
                    + "ENV_TYPE = " + BuildConfig.ENV_TYPE);
        }
    

    显示页面如图所示:


    3.jpg 4.jpg 5.jpg

    至此,我们就完成了多版本和多环境的gradle文件配置。

    三、注意:

    1. 网上的第三方推送一般以按包名唯一区分,已上线的app有集成推送模块的,要根据不同包名申请多个账号。防止把测试的推送信息推送给正式用户。
    2. 微信的分享也是根据包名来进行验证的,所以测试分享模块时候,要将环境改为生产环境的release版本。
    3. 在代码中使用到provider的地方,也需要根据包名做对应的修改,比如:
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${applicationId}.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths"/>
    
            </provider>
    
     Matisse.from(this)
         .choose(MimeType.ofImage())
         .showSingleMediaType(true)
         .countable(false)
         .capture(true)
         .captureStrategy(new CaptureStrategy(true, mContext.getPackageName() + ".fileprovider"))
         .maxSelectable(1)
         .thumbnailScale(0.85f)
         .imageEngine(new GlideEngine())
         .forResult(REQUEST_CODE_CHOOSE);
    

    四、demo下载地址:

    https://download.csdn.net/download/akirah/10610665

    相关文章

      网友评论

          本文标题:Gradle多版本/多环境打包

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