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 版權宣告:本文為博主原創文章,轉載請附上博文連結!