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

前言:

作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名稱,最終輸出位置以下圖: 工具

這裏寫圖片描述
app-->build-->outputs-->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、執行打包命令

到這一步,全部配置已經完成,今後之後咱們就能夠用一行命令打出N個包啦!

咱們只需在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機動車

相關文章
相關標籤/搜索