Android Studio 使用Gradle多渠道打包的原理与方法

1、背景介绍

        之前在使用Eclipse做开发的时候,我会使用友盟的工具进行打包,不过不知道为什么,当我换了Android Studio进行开发之后,发现友盟的那个工具会报错,坑爹啊。没办法,我只好寻求能够在Android Studio上多渠道打包的工具,找了一圈好像也没有,只好在代码上写了。估计以后也会经常使用,我先在这里记录一下。


2、Windows系统

        如果你是在windows系统下使用,需要下载 Gradle,设置 GRADLE_HOME 环境变量,并且将Gradle的 bin 目录添加到环境变量PATH,然后将命令行中的 ./gradlew 替换为 gradle.bat。Windows系统下的命令行参考:

使用gradle: gradle.bat clean assembleRelease


3、设置GRADLE_HOME

设置GRADLE_HOME环境变量,需要先去下载Gradle,下载地址是:grade下载链接

设置的环境变量应该为:

一、设置path:E:\WorkProgram\gradle 

二、设置bin目录:%GRADLE_HOME%\bin;

注意:这里必须设置GRADLE_HOME,而不要直接引用路径,否则后面的命令可能会找不到而报错。


4、AS中修改文件

我们需要在Android Studio中修改几个相关的文件,如下:

修改项目根目录的 build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies{
        classpath 'com.mcxiaoke.gradle:packer:1.0.+'
    }
}

修改Android项目的 build.gradle:

apply plugin: 'packer'  

注意:这里的修改是添加就好了,千万不要把之前的给删除了。。


5、添加渠道列表

渠道列表应该写在一个文件中,这里使用的是一个纯文本文件,每行一个渠道号,列表解析的时候会自动忽略空白行,但是格式不规范会报错,渠道名和注释之间用 # 号分割开,行示例:

 Google_Play#play store market
 BaiDu#百度市场
 WanDouJia#豌豆荚
 360SC#360市场

注意:这个渠道的列表应该存在于项目的目录下(当然你也可以写在别的地方,只要你找得到,哈哈)。


6、打包命令

多渠道的打包命令如下:

./gradlew -Pmarket=markets.txt clean archiveApkRelease

需要在命令行指定 -Pmarket=yourMarketFileName属性,market是你的渠道名列表文件名,market文件是基于项目根目录的 相对路径 ,假设你的项目位于 ~/github/myapp 你的market文件位于 ~/github/myapp/config/markets.txt 那么参数应该是 -Pmarket=config/markets.txt,一般建议直接放在项目根目录,如果market文件参数错误或者文件不存在会抛出异常。


7、输出设置

输出的位置:

archiveOutput 指定渠道打包输出的APK存放目录,默认位于${项目根目录}/build/archives

输出的名称:

archiveNameFormat - Groovy格式字符串, 指定渠道打包输出的APK文件名格式,默认文件名格式是: ${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode},可使用以下变量:

projectName - 项目名字
appName - App模块名字
appPkg - applicationId (App包名packageName)
buildType - buildType (release/debug/beta等)
flavorName - flavorName (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)

manifestMatcher 指定渠道打包需要修改的AndroidManifest.xml的meta-data的项名称,列表类型,举例: ['UMENG_CHANNEL', 'Promotion_Market'],注意:需要同时在命令行使用 -Pmarket=yourMarketFileName 指定market属性多渠道打包才会生效,如果没有配置就使用多渠道打包,将会抛出异常


8、完整示例

项目的 samples 目录包含一个完整的项目示例,可以查看其中的 build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        // `添加packer插件依赖`
        classpath 'com.mcxiaoke.gradle:packer:1.0.0'
    }
}

repositories {
    mavenCentral()
}

apply plugin: 'com.android.application'
// 建议放在 `com.android.application` 下面  
// `使用 apply plugin使用packer插件`  
apply plugin: 'packer'

packer {
    // 指定渠道打包输出目录
    archiveOutput = file(new File(project.rootProject.buildDir.path, "apks"))
    // 指定渠道打包输出文件名格式
    archiveNameFormat = ''
    // 指定渠道打包需要修改的AndroidManifest文件项
    manifestMatcher = ['UMENG_CHANNEL','Promotion_Market']
    // 指定是否使用build版本号自增
    buildNumberAuto = true
    // 指定使用版本号自增的buildType,默认是全部
    buildNumberTypeMatcher = ['release', 'beta']

}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.mcxiaoke.packer.sample"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 12345
        versionName "1.2.3"
    }

    signingConfigs {
        release {
            storeFile file("android.keystore")
            storePassword "android"
            keyAlias "android"
            keyPassword "android"
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
        }

        beta {
            signingConfig signingConfigs.release
            minifyEnabled false
            debuggable true
        }

    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:21.0.2'
}


你可能感兴趣的:(Android,Studio使用)