您的位置:首页 > 移动开发 > Android开发

Android Studio之Gradle多渠道打包

2016-01-19 15:18 501 查看
转载至:http://blog.csdn.net/gao_chun/article/details/48218729

Android Studio之Gradle多渠道打包

由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了。


友盟多渠道打包

废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段:

[html] view
plain copy

 print?

<meta-data  

    android:name="UMENG_CHANNEL"  

    android:value="Channel_ID" />  

里面的 Channel_ID 就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

第一步 在 AndroidManifest.xml 里配置 PlaceHolder

[html] view
plain copy

 print?

<meta-data  

    android:name="UMENG_CHANNEL"  

    android:value="${UMENG_CHANNEL_VALUE}" />  

第二步 在 build.gradle 设置 ProductFlavors

[java] view
plain copy

 print?

android {    

    productFlavors {  

        xiaomi {  

            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]  

        }  

        _360 {  

            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]  

        }  

        baidu {  

            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]  

        }  

        wandoujia {  

            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]  

        }  

    }    

}  

或者批量修改

[java] view
plain copy

 print?

android {    

    productFlavors {  

        xiaomi {}  

        _360 {}  

        baidu {}  

        wandoujia {}  

    }    

  

  

    productFlavors.all {   

        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]   

    }  

}  

很简单,直接执行 ./gradlew assembleRelease , 然后就可以静静的等待打包完成。


assemble结合Build Variants来创建task

assemble 这个命令会结合 Build Type 创建自己的task,如:

./gradlew assembleDebug
./gradlew assembleRelease
除此之外 assemble 还能和 Product Flavor 结合创建新的任务,其实 assemble 是和 Build Variants 一起结合使用的,而 Build Variants = Build Type + Product Flavor 。

如我们想打包wandoujia渠道的release版本,执行如下命令就好了:
./gradlew assembleWandoujiaRelease

如果我们只打wandoujia渠道版本,则:
./gradlew assembleWandoujia

此命令会生成wandoujia渠道的Release和Debug版本

同理我想打全部Release版本:
./gradlew assembleRelease

这条命令会把Product Flavor下的所有渠道的Release版本都打出来。

总之,assemble 命令创建task有如下用法:

**assemble**: 允许直接构建一个Variant版本,例如assembleFlavor1Debug。

**assemble**: 允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。

**assemble**: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。



完整的gradle脚本

最后来一份我在项目中使用的完整的gradle文件配置:

[java] view
plain copy

 print?

apply plugin: 'com.android.application'  

  

def releaseTime() {  

    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))  

}  

  

  

android {  

    compileSdkVersion 21  

    buildToolsVersion '21.1.2'  

  

  

    defaultConfig {  

        applicationId "com.boohee.*"  

        minSdkVersion 14  

        targetSdkVersion 21  

        versionCode 1  

        versionName "1.0"  

          

        // dex突破65535的限制  

        multiDexEnabled true  

        // 默认是umeng的渠道  

        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]  

    }  

  

  

    lintOptions {  

        abortOnError false  

    }  

  

  

    signingConfigs {  

        debug {  

            // No debug config  

        }  

  

  

        release {  

            storeFile file("../yourapp.keystore")  

            storePassword "your password"  

            keyAlias "your alias"  

            keyPassword "your password"  

        }  

    }  

  

  

    buildTypes {  

        debug {  

            // 显示Log  

            buildConfigField "boolean", "LOG_DEBUG", "true"  

  

  

            versionNameSuffix "-debug"  

            minifyEnabled false  

            zipAlignEnabled false  

            shrinkResources false  

            signingConfig signingConfigs.debug  

        }  

  

  

        release {  

            // 不显示Log  

            buildConfigField "boolean", "LOG_DEBUG", "false"  

  

  

            minifyEnabled true  

            zipAlignEnabled true  

            // 移除无用的resource文件  

            shrinkResources true  

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  

            signingConfig signingConfigs.release  

  

  

            applicationVariants.all { variant ->  

                variant.outputs.each { output ->  

                    def outputFile = output.outputFile  

                    if (outputFile != null && outputFile.name.endsWith('.apk')) {  

                        // 输出apk名称为boohee_v1.0_2015-01-15_wandoujia.apk  

                        def fileName = "boohee_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"  

                        output.outputFile = new File(outputFile.parent, fileName)  

                    }  

                }  

            }  

        }  

    }  

  

  

    // 友盟多渠道打包  

    productFlavors {  

        wandoujia {}  

        _360 {}  

        baidu {}  

        xiaomi {}  

        tencent {}  

        taobao {}  

        ...  

    }  

  

  

    productFlavors.all { flavor ->  

        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]  

    }  

}  

  

  

dependencies {  

    compile fileTree(dir: 'libs', include: ['*.jar'])  

    compile 'com.android.support:support-v4:21.0.3'  

    compile 'com.jakewharton:butterknife:6.0.0'  

    ...  

}  

参考:http://stormzhang.com/posts.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: