作Android開發的繞不開多渠道這件事,由於Android應用市場大大小小有幾百個,而咱們須要在發佈應用以後統計各個渠道的用戶下載量,這個時候就要多渠道打包,也就是對各個渠道進行標識,以便於統計。多渠道和統計時息息相關的,由於咱們作多渠道打包的目的就是要統計,友盟統計是你們平常開發中經常使用的渠道統計工具,使用至關廣泛,接下來我講到的打包方法就是基於友盟統計實施的。linux
1、按照友盟官方文檔說明,渠道信息一般須要在AndroidManifest.xml中配置以下值:android
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
複製代碼
統計的重點就是value值Channel_ID,即渠道標識,例如:360,qq,wandoujia等等,在這裏不直接寫出某個渠道名,而是寫一個佔位符,咱們會在build.gradle中進行設置,以後gradle編譯的時候會動態的替換掉這個佔位符。代碼以下:web
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_VALUE}" />
複製代碼
2、在app的build.gradle的android{}中添加以下內容:windows
android {
flavorDimensions "default"
productFlavors {
web {}
baidu {}
c360 {}
qq {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
複製代碼
也能夠單獨設置:bash
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節點的一個子節點。你須要打什麼渠道的包,就在這裏按友盟的要求用渠道名給UMENG_CHANNEL_VALUE賦值。上面這個配置的做用就是,爲每一個渠道包產生不一樣的 UMENG_CHANNEL_VALUE 的值。微信
3、自定義APK名稱,多渠道打包app
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名稱,最終輸出位置以下圖: 工具
4、配置簽名信息,代碼以下:gradle
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中添加如圖代碼:ui
5、執行打包命令
咱們只需在Android Studio的命令行Terminal下輸入如下命令便可:
linux下打包所有的Release版渠道包:
./gradlew assembleRelease
複製代碼
windows下打包所有的Release版渠道包
gradlew.bat assembleRelease
複製代碼
若是想要Debug的包:
gradlew.bat assembleDebug
複製代碼
若是隻要豌豆莢的包:
gradlew.bat assemblewandoujia
複製代碼
若是隻要豌豆莢的Release版:
gradlew.bat assemblewandoujiaRelease
複製代碼
能夠看出這個命令是能夠自由組合的,你們按照本身的需求去試試!OK!到此一行命令就能打出咱們想要的N個包啦!但願我寫的內容對你們有所幫助,有什麼不對的地方歡迎指正!!!
下面貼上我項目裏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
}
//線上環境
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"
...
}
複製代碼
更多內容,請關注個人微信公衆號——Android機動車