随着项目中渠道的越来越多,终于要面对多渠道打包了(技术债是要还的),昨天花了2个小时学习了一下,下面将快速集成步骤写出来
- 在app的build.gradle中添加渠道,这里渠道我用双引号包住,其实如果首字母非数字也可以不用双引号
productFlavors { "baidu" {} "QQ" {} "OPPO" {} "vivo" {} "Huawei" {} "xiaomi" {} "meizu" {} "360" {} "sanxing" {} } //给上述渠道分别配置属性 productFlavors.all { flavor -> flavor.manifestPlaceholders = [InstallChannel: name] }
代码中的InstallChannel 是可以自定义的,但是需要和下面步骤中的InstallChannel 相对应,此时build一下你可能会报错
Error:All flavors must now belong to a named flavor dimension.Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
因为在studio 3.0以后添加了flavorDimensions的方式,定义风味维度(也就是命名风味维度)。
解决方法:defaultConfig { applicationId "com.demo.flavorsapp" minSdkVersion 18 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" flavorDimensions "versionCode" }
对,就是最后一行的代码。
-
然后配置一下多渠道打包的输出路径:(因为默认的话是在项目每个渠道都创建一个文件夹,难道还要一个一个从文件夹cv出来嘛?!)
这个也是在app的build文件中配置的,我定义的是,多渠道包的输出路径和之前没有配置多渠道时候的默认路径一样,所有的多渠道包都在这个路径下面,而且多渠道包的命名格式是Huawei_1.apk,这个命名格式是outputFileName 配置的//gradle3.0以上可用 android.applicationVariants.all { variant -> variant.outputs.all { variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/app/release") outputFileName = "${variant.getFlavorName()}_${variant.versionCode}.apk" } } // gradle3 3.0以下(待验证) /* applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) {//输出apk名称为:渠道名_版本名_时间.apk def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk" output.outputFile = new File(outputFile.parent, fileName) } } }*/
-
然后配置清单文件
<meta-data android:name="InstallChannel" android:value="${InstallChannel}"/>
注意你的InstallChannel 这个是和上面步骤中的InstallChannel 对应的
-
至此已经配置完成了,如果你项目中需要用到这个渠道的字段,比如传给后台的参数中需要这个渠道名,那么可以用过下面方法获取:
/** * 获取渠道名字 * * @param context * @return */ public static String getsDeviceName(Context context) { String channelName = ""; PackageManager packageManager = context.getPackageManager(); try { if (packageManager != null) { ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); if (applicationInfo != null) { if (applicationInfo.metaData != null) { channelName = applicationInfo.metaData.getString("InstallChannel"); } } } } catch (Exception e) { } return channelName; }
applicationInfo.metaData.getString("InstallChannel")的参数 注意与上面步骤一致
-
打包:选择你想要的渠道就可以
在最后,有些机智的小伙伴可能就要问了,我想在平时debug运行在手机测试的时候指定自己想要的渠道,这咋办?!
有办法:
在这里就可以指定渠道啦!
-
是不是发现多渠道打包如此简单?如果这篇文章帮助到您了,请给我个赞,谢谢~