app在上线前一般会在测试环境,预发布环境测试没有问题才会正式上线到正式环境,每次测试人员需要切换不同的环境就需要将当前的app卸载,在重新安装新的环境的app,这样体验非常差 ,因此测试人员提出可不可以同时安装三个不同环境的apk,理论上是可以的,就着手实践了.
productFlavors 可以配置不同渠道的,同时在不同的渠道可以配置applicationId,我们知道applicationId在安卓设备和商店中是作为应用的唯一标识,一旦发布就不可以再修改applicationId,否则就被视作不同的应用,想必大家已经知道思路了
第一步:
android {
defaultConfig {
......
flavorDimensions "versionCode"
}
productFlavors {
ehafangTest{
applicationId 'com.app.manager.test'
buildConfigField("int", "APP_TYPE","0")
// buildConfigField("string", "appName","app测试")
manifestPlaceholders = [APP_NAME: "易管家测试"]
/* manifestPlaceholders = [
app_name: "开-WalleDemo",//应用名
app_icon: "@drawable/icon_develop"]//icon替换
*/
}
ehafangPreRelease{
applicationId 'com.app.manager.prerelease'
buildConfigField("int", "APP_TYPE","1")
manifestPlaceholders = [APP_NAME: "app预发布"]
}
//preRelease
//release
ehafangRelease{
applicationId 'com.app.manager'
buildConfigField("int", "APP_TYPE","2")
manifestPlaceholders = [APP_NAME: "app正式"]
}
}
}
如果A是主模块,B依赖于A 那么在B的gradle中需要添加如下代码
defaultConfig {
......
flavorDimensions "versionCode"
}
publishNonDefault true
productFlavors {
ehafangTest{
buildConfigField("int", "APP_TYPE","0")
}
ehafangPreRelease{
buildConfigField("int", "APP_TYPE","1")
}
ehafangRelease{
buildConfigField("int", "APP_TYPE","2")
}
}
同时在A的gradle中使用
implementation project(':B')
使用implementation 依赖
第二步 在主模块的清单文件中配置app的名字和icon
android:icon="${app_icon}"
android:label="${APP_NAME}"
第三步 在我们定义切换环境中的属性这样设置
public static final int IS_DEBUG = BuildConfig.APP_TYPE;
第四步 全局搜索应用中的provide 动态设置provider
清单文件中设置为:
<provider
android:name=".provider.MyProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
代码中设置为:
newUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID+".provider", new File(newUri.getPath()));
最后打包选择不同的打包渠道就可以生成不同的渠道包了 每个包都有一个applicationId 可以独立安装
当我们连接手机运行时可以选择渠道进行调试