一呀洲、友盟多渠道打包
1. 按照友盟官方文檔說明,渠道信息通常需要在AndroidManifest.xml中配置如下值:
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
統(tǒng)計(jì)的重點(diǎn)就是value值Channel_ID舌涨,即渠道標(biāo)識(shí)蛛株,例如:360,qq翰苫,wandoujia等等止邮,在這里不直接寫出某個(gè)渠道名,而是寫一個(gè)占位符奏窑,我們會(huì)在build.gradle中進(jìn)行設(shè)置导披,之后gradle編譯的時(shí)候會(huì)動(dòng)態(tài)的替換掉這個(gè)占位符。代碼如下:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}" />
2. 在app的build.gradle的android{}中添加如下內(nèi)容:
android {
flavorDimensions "default"
productFlavors {
web {}
baidu {}
c360 {}
qq {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
也可以單獨(dú)設(shè)置:
android {
flavorDimensions "default"
productFlavors {
web {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "web "]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu "]
}
c360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360 "]
}
qq {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq "]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
productFlavors是android節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)埃唯。你需要打什么渠道的包撩匕,就在這里按友盟的要求用渠道名給UMENG_CHANNEL_VALUE賦值。上面這個(gè)配置的作用就是墨叛,為每個(gè)渠道包產(chǎn)生不同的 UMENG_CHANNEL_VALUE 的值止毕。
3. 自定義APK名稱,多渠道打包
//自定義APK名稱,多渠道打包
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
variant.productFlavors.each { flavor ->
def project = "cpm"
def separator = "_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def versionName = variant.versionName
def versionCode = variant.versionCode
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
def apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + ".apk"
if (buildType == "release") {
apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + separator + formattedDate + ".apk"
}
output.outputFileName = apkName
}
}
}
output.outputFileName是apk輸出位置模蜡,其它的是自定義apk名稱,最終輸出位置如下圖:
app–>build–>outputs–>apk
4. 配置簽名信息扁凛,代碼如下:
Properties props = new Properties()
props.load(project.rootProject.file('local.properties').newDataInputStream())
android {
signingConfigs {
release {
storeFile file(props['release.keystore'])
storePassword '123456'
keyAlias '123456'
keyPassword '123456'
}
}
}
storeFile file(props[‘release.keystore’])是我的keystore位置忍疾,在local.properties中添加如圖代碼:
5. 執(zhí)行打包命令
到這一步,所有配置已經(jīng)完成谨朝,從此以后我們就可以用一行命令打出N個(gè)包啦膝昆!
我們只需在Android Studio的命令行Terminal下輸入以下命令即可:
- linux下打包全部的Release版渠道包:
./gradlew assembleRelease
- windows下打包全部的Release版渠道包
gradlew.bat assembleRelease
- 如果想要Debug的包:
gradlew.bat assembleDebug
- 如果只要豌豆莢的包:
gradlew.bat assemblewandoujia
- 如果只要豌豆莢的Release版:
gradlew.bat assemblewandoujiaRelease
6. build.gradle 總的配置文件,供參考:
apply plugin: 'com.android.application'
Properties props = new Properties()
props.load(project.rootProject.file('local.properties').newDataInputStream())
android {
compileSdkVersion rootProject.ext.compileSdkVersion
flavorDimensions "default"
defaultConfig {
applicationId "com.exmple.myApp"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled true
versionCode 11000
versionName "1.1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
storeFile file(props['release.keystore'])
storePassword '123456'
keyAlias '123456'
keyPassword '123456'
}
}
buildTypes {
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.release
}
//線上環(huán)境
release {
debuggable false
minifyEnabled false
signingConfig signingConfigs.release
}
}
lintOptions {
ignoreWarnings true
checkReleaseBuilds false
}
repositories {
flatDir {
dirs 'libs'
}
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir "src/main/jniLibs"
}
productFlavors {
web {}
baidu {}
c360 {}
qq {}
oppo {}
vivo {}
huawei {}
mi {}
meizu {}
lenovo {}
leshi {}
sogou {}
wandoujia {}
samsung {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name, JPUSH_CHANNEL: name]
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//自定義APK名稱,多渠道打包
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
variant.productFlavors.each { flavor ->
def project = "cpm"
def separator = "_"
def buildType = variant.variantData.variantConfiguration.buildType.name
def versionName = variant.versionName
def versionCode = variant.versionCode
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
def apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + ".apk"
if (buildType == "release") {
apkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + flavor.name + separator + formattedDate + ".apk"
}
output.outputFileName = apkName
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
implementation "com.android.support:design:$supportLibraryVersion"
implementation "com.android.support:cardview-v7:$supportLibraryVersion"
...
}
二叠必、美團(tuán)Walle多渠道打包
1.修改項(xiàng)目根目錄下build.gradle文件荚孵,在buildscripts下的dependencies中增加:
classpath 'com.meituan.android.walle:plugin:1.1.6'
2. 修改app工程的build.gradle文件,增加如下信息:
1)頭部增加:
apply plugin: 'walle'
2)確保有簽名配置纬朝,下面是樣例收叶,
signingConfigs {
release {
storeFile file("../test.jks") // 打包的文件的地址
storePassword "123456"
keyAlias "test"
keyPassword "123456"
}
debug {
storeFile file("../test.jks")
storePassword "123456"
keyAlias "test"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
3)增加如下配置(按照下面配置生成的渠道包在build/outputs/channels目錄下,而不是build/outputs/apk目錄):
walle {
// 指定渠道包的輸出路徑
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名稱
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
4)在dependencies中增加:
implementation 'com.meituan.android.walle:library:1.1.6'
3. 在app工程下新建文件channel共苛,放置渠道信息(根據(jù)實(shí)際需要修改):
xiaomi
360
huawei
vivo
4. 獲取渠道樣例:
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
5. 對(duì)于要設(shè)置到友盟里去判没,則需要參考友盟的設(shè)置方法。
6. 打包命令(更多命令及用法參考附錄官方指導(dǎo)):
mac:./gradlew clean assembleReleaseChannels
windows:gradlew clean assembleReleaseChannels
7. 生成多渠道包截圖:
8. build.gradle 總的配置文件隅茎,供參考:
apply plugin: 'com.android.application'
apply plugin: 'walle'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.administrator.dabao"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
shrinkResources true
minifyEnabled true
signingConfig signingConfigs.create("release")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
signingConfigs {
release {
v2SigningEnabled true
storeFile file("F:\\Android_studio\\keystore\\android.keystore")
storePassword "123456"
keyAlias "key0"
keyPassword "123456"
}
}
}
walle {
// 指定渠道包的輸出路徑
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名稱
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
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'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
implementation 'com.meituan.android.walle:library:1.1.6'
}