以前很少使用到多渠道,因为做的APP也不会发布到应用市场(太乐色了)因此也没遇到需要多渠道的场景。
现在是因为有个APP需要分为两个不同的功能,但是彼此之间有存在很强的相似度。因此没有必要维护两个应用。才想起来可以试试多渠道。
先简单的梳理一下:
多渠道也就是多环境,大部分时候一般我们可以使用debug、或者release包来区分不同的环境,其中不同环境指的是不同的网络请求地址,不同的混淆策略,不同的签名等。
但是很多时候我们需要更多不同的信息,比如不同的包名、不同的版本、不同的应用图标、应用名称、不同的资源文件等。
1.配置多渠道
android {
productFlavors{
newVersion{//新版本
applicationId rootProject.ext.appConfig.newAppId
resValue "string", "monitor_app_name", "新版抓包助手"
manifestPlaceholders=[APP_NAME:"新版测试软件"]
versionName "1.0.2"
}
oldVersion {//旧版本
applicationId rootProject.ext.appConfig.oldAppId
resValue "string", "monitor_app_name", "旧版抓包助手"
manifestPlaceholders=[APP_NAME:"旧版测试软件"]
versionName "1.0.0"
}
}
defaultConfig {
applicationId "${applicationId}"
//必须写一个共同的flavorDimensions ,gradle 3.0以后,否则会报错
flavorDimensions "versionCode==1.0.0"
}
//不同渠道不同资源文件配置
sourceSets{
newVersion.res.srcDirs 'src/main/res-new'
newVersion.res.srcDirs 'src/main/res-old'
}
|
在gradle配置文件中增加了上述配置之后,就让应用拥有了两个不同的环境。在打包的时候,可以直接去选择打哪种包。
也可以通过 右侧的gradle ->Tasks->build->assemble 命令来一件同时生成两个环境下的debug和release的apk安装包。
2.设置多环境资源
在配置完多环境之后,根据不同的环境,需要动态的使用不同的资源,比如app的名字动态的变化
需要获取manifestPlaceholders 中已经配置好的字段名称,这里我们使用的是APP_NAME;
在AndroidManifest 中 新增资源的引用:
<meta-data android:name="APP_NAME" android:value="${APP_NAME}"/>
<application
android:allowBackup="false"
android:icon="@mipmap/icon_1"
android:label="${APP_NAME}"
android:supportsRtl="true"
tools:replace="android:label,android:allowBackup"
android:theme="@style/activityTransTheme">
<activity
android:name=".SplashActivity"
android:theme="@style/activityTheme"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
此时再重新构建应用时,就会更具你所选择的构建环境动态的变化资源了。
3.多环境构建的简单使用
在完成上述的操作之后,我们再调试中,需要将软件安装到设备中,就不能直接使用 绿色三角直接运行了
而是应该在右侧的gradle ->Tasks->install->installxxDebug(installxxRelease)
4.根据多环境配置,动态的使用不同代码
在第一步骤配置中,我们使用了 newVersion、oldVersion 来表示不同环境的名称。
那么在代码中,可以通过BuildConfig.FLAVOR
来获取当前环境的名称。
if(BuildConfig.FLAVOR=="newVersion"){
//TODO 做新版本的变更
}
if(BuildConfig.FLAVOR=="oldVersion"){
//TODO 维持旧版本操作
}
上述只是使用了一些简单的多渠道多环境的配置操作,实际在使用中应该会使用一些比较成熟的多渠道打包方案,例如美团的 Walle、腾讯的 VasDolly,简介二者