gradle實現多渠道打包

Gradle應該都不陌生,熟悉android studio的應該都用過gradle,這篇文章主要內容有:

a.Gradle的基本認識

b.Gradle實現多渠道打包

本文原創,轉載請注意在CSDN上的出處:

http://blog.csdn.net/kemeng7758/article/details/56673751

1、Gradle的認識

Gradle是一種基於Groovy的動態DSL,而Groovy語言是一種基於jvm的動態語言。如果對java語言比較熟悉的話,查看Groovy語言應該不難。我們如果純粹使用Gradle去構建工程,可以不必深入瞭解Groovy,如果要做一些插件化的開發的話,需要比較深入的瞭解一下Groovy。

每個Module都有一個build文件,裏面是相應module一些配置信息,在我們的主工程下面有一個全局的build,裏面的配置信息爲所有的Module所共享。下面我們看一下Android Studio下面的工程目錄:


2、多渠道打包

2.1、在上面的工程目錄中,我們可以看到選中部分爲主工程下面的build文件,這個build文件裏面的配置信息爲所有的module所共享。下面我們看一下這個文件裏面的內容,直接上代碼

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
    }
}
def supportVersion ="25.0.1"
ext{
    COMPILESDKVERSION = 25
    BUILDTOOLSVERSION = "25.0.2"
    MINSDKVERSION = 17
    TARGETSDKVERSION = 25
    libSupportAppCompat="com.android.support:appcompat-v7:${supportVersion}"
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

在上面的代碼中,我們可以看到在buildscript下的repositories使用的倉庫是jcenter(),這個倉庫類似於maven倉庫,當然我們也可以使用其他的倉庫,無論是遠程的還是本地的。

ext下面的內容,爲我們項目的共有部分,之所以將這一部分內容抽取出來是爲了避免編譯版本或者版本信息發生變化的時候,我們還要去逐個修改module下面的build文件,我們的這個全局build文件對應的對象就是rootProject,所以我們在其他module中引用的時候直接通過rootProject.ext.COMPILESDKVERSION這樣的方式來引用,以後我們只要修改這一個地方就可以了。當然我們也可以將我們app這個module的build文件中dependencies下面依賴的庫統一整理到這下面,爲了便於修改版本號發生的變化。例如:

libSupportAppCompat="com.android.support:appcompat-v7:${supportVersion}"

2.2、下面我們看一下我們app module下面的build文件的內容

apply plugin: 'com.android.application'
apply from: rootProject.getProjectDir().getAbsolutePath() + "/utils.gradle"

android {
    compileSdkVersion rootProject.ext.COMPILESDKVERSION
    buildToolsVersion rootProject.ext.BUILDTOOLSVERSION
    defaultConfig {
        applicationId "com.guannan.gradlepractice"
        minSdkVersion rootProject.ext.MINSDKVERSION
        targetSdkVersion rootProject.ext.TARGETSDKVERSION
        versionCode VERSIONCODE.toInteger()
        versionName VERSIONNAME
        // dex突破65535的限制
        multiDexEnabled true
    }
    //簽名的相關信息
    signingConfigs{
        debug{
            storeFile file(KEY_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword STORE_PASSWORD

        }
        release{
            storeFile file(KEY_PATH)
            storePassword STORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword STORE_PASSWORD
        }
    }

    buildTypes {
        release {
            //對簽名信息的引用
            signingConfig signingConfigs.release
            minifyEnabled true
            //指向我們系統默認的系統混淆文件,我們可以對此修改
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug{
            signingConfig signingConfigs.debug
        }
    }

    //列出我們要打的那些渠道的包的名稱
    productFlavors{
        wandoujia{}
        _360{}
        baidu{}
        xiaomi{}
    }
    //批量修改清單文件中的渠道號
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

task cleanApks {
    deleteTargetFile(file("$outputLocation").getAbsolutePath())
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile rootProject.ext.libSupportAppCompat
}
//這裏定義了我們打好的包的輸出的位置
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = file("$outputLocation/demo_${VERSIONNAME}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk");
    }
}
app module下面的gradle.properties裏面的配置信息

VERSIONCODE = 1
VERSIONNAME = 3.0
KEY_PATH=./myDemo.jks
STORE_PASSWORD=521kemeng
KEY_ALIAS=demoKey
outputLocation= ./guannan

2.3多渠道打包的步驟(這裏以友盟統計爲例)

(一)在AndroidManifest.xml文件中的application下面有這樣一段代碼

<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/>
我們在編譯的時候希望能夠改變UMENG_CHANNEL_VALUE這個值
(二)在build文件中設置productFlavors,動態修改manifestPaceholders的值

 //列出我們要打的那些渠道的包的名稱
    productFlavors{
        wandoujia{}
        _360{}
        baidu{}
        xiaomi{}
    }
    //批量修改清單文件中的渠道號
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
或者使用

productFlavors{
        wandoujia{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        _360{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
        }
        baidu{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        xiaomi{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }

(三)設置完了以後我們可以使用命令行或者android studio自帶的方式一鍵打包

1.我們可以進入我們項目所在的目錄,打開命令行,使用gradle assembleRelease或者gradle assembleDebug打出所有的Release和debug包,如果我們想只打出某一個市場上面的包,我們可以使用命令:gradle assembleBaidu這樣的命令,這樣就會在我們所修改的目錄下面生成包

//這裏定義了我們打好的包的輸出的位置
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = file("$outputLocation/demo_${VERSIONNAME}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk");
    }
}

如果我們不修改目錄,默認會在app module下面的build下的outputs文件夾下面

2.或者使用android studio自帶的方式一鍵打包,如圖所示


我們只要雙擊我們想打的包就可以了,當然前提是你已經配置好了build文件,然後編譯好了之後就會自動生成這些文件。


歡迎大家留言,指出不當的地方,大家一起學習!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章