多渠道打包的目的:
为了实现应用包可以在多个应用商城上架
1.首先要有证书(jks文件)
2.在app/build.gradle配置证书信息
1).在gradle.properties中先写一些证书信息用于build.gradle配置的信息引入,增加安全性
KEY_PATH=/Users/zhangqianqian/Documents/packtest.jks
KEY_PASS=970421
ALIAS_NAME=zhangqianqiandev
ALIAS_PASS=970421
2).在android闭包中添加证书信息
signingConfigs{
config{
storeFile file (KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
3).在buildTypes闭包中引入signingConfigs标签
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
2.修改AndroidManifest.xml的application标签里添加一个meta-data标签定义
⚠️注:渠道信息通常需要在AndroidManifest.xml中配置如下值:
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
上面的value值Channel_ID就是渠道标识。我们的期望的就是在编译时候这个值能够自动变化以满足区分多渠道的需求。
所以,在AndroidManifest.xml里设置动态渠道变量
在中添加 标签和代码
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
3.修改app/build.gradle,在android标签中添加Flavors
flavorDimensions "default"
productFlavors{
xiaomi{
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]
}
qh360{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
}
productFlavors中配置的每一个flavors都代表着一个渠道的apk信息,如xiaomi渠道号就代表着小米渠道的apk。那么这个渠道号又是如何替换的呢?我们可以看到manifestPlaceholders这个字段,其实可以把它理解为一个HashMap的键值对容器,通过这个键值对容器,我们就可以替换AndroidManifest.xml里面的友盟渠道配置信息即前面所说过的${UMENG_CHANNEL_VALUE}占位符字段的值,要注意名称配置一定要跟gadle中的名称一致。这样就完成了多渠道的替换循环工作,当然多渠道打包的工作也就完成了。上面的多渠道打包配置是不是很明朗也很清晰,但却略带麻烦,其实还有下面一种多渠道配置写法,显得相当简洁,不过就是不太明朗罢了,各自选择吧:
productFlavors{
xiaomi{}
qh360{}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
4.打包
1).可视化安卓自带的打包方式
2).gradle方式打包
3).Terminal方式
输入./ gradlew assembleXiaomi
输入./ gradlew assembleQh360
5.一般工程会写两个代码块,分别名为debugConfig和releaseConfig
1).将打包签名文件拷贝到app目录下
2).AndroidManifest.xml的标签中添加标签内容(同上)
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"></meta-data>
3).gradle.properties的添加变量值(同上)
KEY_PATH=packagetest_2.jks
KEY_PASS=970421
ALIAS_NAME=zhangqianqiandev
ALIAS_PASS=970421
4).修改build.gradle(完全代码)
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.zhangqianqian.packagetest_2"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs{
releaseConfig{
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
debugConfig{
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
debug{
signingConfig signingConfigs.debugConfig
}
}
flavorDimensions "default"
productFlavors{
xiaomi{
manifestPlaceholders=[UMENG_CHANNEL_VALUE:"xiaomi"]
}
qh360{
manifestPlaceholders=[UMENG_CHANNEL_VALUE:"qh360"]
}
baidu{
manifestPlaceholders=[UMENG_CHANNEL_VALUE:"baidu"]
}
}
//写法二
// productFlavors{
// xiaomi{}
// qh360{}
// baidu{}
// }
// productFlavors.all{
// flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
// }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
5).打包方式(如上)
Androidstudio自动打包
gradle的task点击打包
Terminal中输入命令打包