android多渠道打包配置 android编译打包流程

在平时的Android开发中 。我们经常会遇到在不同网络环境(比如:开发环境、测试环境)之间的切换、一次打多个渠道包等需求 。如何优雅的管理网络环境的配置?如何快速的打出多个渠道包?这是一个值得研究的问题 。
如果每一次在不同网络环境间切换 。都需要更改代码 。然而重新打包 。那未免有点低效 。下面是我的实践探索 。看网上很多人都是根据buildType来切换网络环境 。感觉有点不好 。因为网络环境可能很多种 。而buildType我们一般是2种 。而且 。不同网络环境的包最好能同时安装在手机上 。以便我们调试 。最好 。我一看这个包的名称和图标 。就能知道这是什么环境的包 。
一、概述
1.多版本
基于buildTypes
(1)debug:调试版本,无混淆
(2)release:发布版本,有混淆、压缩
2.多环境
基于productFlavors
(1)develop:开发环境 。开发和自测时使用
(2)check:测试环境 。克隆一份生产环境的配置 。在这里测试通过后 。再发布到生产环境 。
之所以没命名为test是因为在gradle编译时:ProductFlavor names cannot start with ‘test’
(3)product:生产环境 。正式提供服务的 。
3.多渠道
基于Android新的应用签名方案APK Signature Scheme v2中的APK Signing Block区块
我这里使用的是美团封装的Walle库 。使用Walle库请确保你的Android Gradle 插件版本在2.2.0以上 。
为什么不直接使用productFlavors来打包多渠道?因为productFlavors打多渠道包太慢了 。打30个包差不多十几分钟 。无法忍受!
为什么不使用美团之前基于META-INF进行渠道标识的方案?因为Android7.0之后的这种黑科技已经失效了!
二、示例
1、配置build.gradle
(1) 在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖 。如下:
buildscript{dependencies{classpath'com.android.tools.build:gradle:2.2.3'classpath'com.meituan.android.walle:plugin:1.0.3'}}
(2) 在当前app的 build.gradle 文件中apply这个插件 。并添加上用于读取渠道号的aar
applyplugin:'com.android.application'applyplugin:'walle'android{compileSdkVersion25buildToolsVersion"25.0.2"defaultConfig{minSdkVersion15targetSdkVersion25versionCode1versionName"1.0"testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"}signingConfigs{release{keyAliasKEY_ALIASkeyPasswordKEY_PASSWORDstoreFilerootProject.file(KEYSTORE_FILE)storePasswordKEYSTORE_PASSWORD}}buildTypes{//调试版本 。无混淆debug{minifyEnabledfalsesigningConfigsigningConfigs.release}//发布版本 。有混淆release{minifyEnabledtruezipAlignEnabledtrueshrinkResourcestruesigningConfigsigningConfigs.releaseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}productFlavors{//开发环境develop{buildConfigField"int","ENV_TYPE","1"applicationId'om.soubu.walledemo.develop'manifestPlaceholders=[app_name:"开-WalleDemo",app_icon:"@drawable/icon_develop"]}//测试环境check{buildConfigField"int","ENV_TYPE","2"applicationId'om.soubu.walledemo.check'manifestPlaceholders=[app_name:"测-WalleDemo",app_icon:"@drawable/icon_check"]}//生产环境product{buildConfigField"int","ENV_TYPE","3"applicationId'com.soubu.walledemo.product'manifestPlaceholders=[app_name:"WalleDemo",app_icon:"@drawable/icon_product"]}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{excludegroup:'com.android.support',module:'support-annotations'})compile'com.android.support:appcompat-v7:25.1.0'testCompile'junit:junit:4.12'compile'com.meituan.android.walle:library:1.0.3'}
(3) 这里 。我根据不同的环境生成了不同包名的apk 。方便在手机上同时安装多个环境的应用 。为了让gradle动态更改apk的名称和图标 。我们需要在manifest文件中使用

android多渠道打包配置 android编译打包流程

文章插图

android多渠道打包配置 android编译打包流程

文章插图
{app_name}等占位符
<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.soubu.walledemo"><applicationandroid:allowBackup="true"android:icon="${app_icon}"android:label="${app_name}"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>

推荐阅读