1. 程式人生 > >AndroidStudio3.0多渠道打包:我用一行命令打出N個包

AndroidStudio3.0多渠道打包:我用一行命令打出N個包

前言: 做Android開發的繞不開多渠道這件事,因為Android應用市場大大小小有幾百個,而我們需要在釋出應用之後統計各個渠道的使用者下載量,這個時候就要多渠道打包,也就是對各個渠道進行標識,以便於統計。多渠道和統計時息息相關的,因為我們做多渠道打包的目的就是要統計,友盟統計是大家日常開發中常用的渠道統計工具,使用相當普遍,接下來我講到的打包方法就是基於友盟統計實施的。

正文: 一、按照友盟官方文件說明,渠道資訊通常需要在AndroidManifest.xml中配置如下值:

<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> 1 統計的重點就是value值Channel_ID,即渠道標識,例如:360,qq,wandoujia等等,在這裡不直接寫出某個渠道名,而是寫一個佔位符,我們會在build.gradle中進行設定,之後gradle編譯的時候會動態的替換掉這個佔位符。程式碼如下:

<meta-data             android:name="UMENG_CHANNEL"             android:value="${CHANNEL_VALUE}" /> 1 2 3 二、在app的build.gradle的android{}中新增如下內容:

android {     flavorDimensions "default"     productFlavors {         web {}         baidu {}         c360 {}         qq {}         wandoujia {}         }

        productFlavors.all {         flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name]         }     } 也可以單獨設定:

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 的值。

三、自定義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

四、配置簽名信息,程式碼如下:

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中新增如圖程式碼:

五、執行打包命令

到這一步,所有配置已經完成,從此以後我們就可以用一行命令打出N個包啦! 我們只需在Android Studio的命令列Terminal下輸入以下命令即可:

linux下打包全部的Release版渠道包:

./gradlew assembleRelease 1 windows下打包全部的Release版渠道包

gradlew.bat assembleRelease 1 如果想要Debug的包:

gradlew.bat assembleDebug 1 如果只要豌豆莢的包:

gradlew.bat assemblewandoujia 1 如果只要豌豆莢的Release版:

gradlew.bat assemblewandoujiaRelease 1 可以看出這個命令是可以自由組合的,大家按照自己的需求去試試!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"     ... } ---------------------  作者:康小白Code  來源:CSDN  原文:https://blog.csdn.net/k_bb_666/article/details/79113222?utm_source=copy  版權宣告:本文為博主原創文章,轉載請附上博文連結!