gradle多渠道打包apk小贴士

来源:互联网 发布:经济学常用微观数据库 编辑:程序博客网 时间:2024/05/22 03:35

使用as+gradle 到现在,多多少少也用到了一些gradle的打包技巧,现在总结一下,备忘。。。这里写图片描述

首先看一下一般的gradle文件

apply plugin: 'com.android.application'//定义一个获取时间的方法,下面用到def releaseTime() {    return new Date().format("yyyy_MM_dd", TimeZone.getTimeZone("UTC"))}//定义一个获取名字的方法,下面用到def appName(){    return "contra"}android {    compileSdkVersion 22    buildToolsVersion "22.0.1"    //指定程序签名    signingConfigs {        release {           storeFile file("../app/special.jks")           storePassword "storePassword "           keyAlias "app"           keyPassword "keyPassword "        }        debug {          storeFile file("../app/special.jks")          storePassword "storePassword "          keyAlias "app"          keyPassword "keyPassword "        }    }    //缺省配置,gradle找不到符合的资源之后就在使用缺省的配置    defaultConfig {        applicationId "com.jadyn.chan"        minSdkVersion 14        targetSdkVersion 22        versionCode 2        versionName "1.0.2"        //BuildConfig类的常量值        buildConfigField 'boolean', 'HAS_SPLASH', 'Boolean.parseBoolean("false")'        buildConfigField 'String', 'GAME_URL', '"file:///android_asset/index.html"'        //TODO 配置友盟app_key        manifestPlaceholders = [UMENG_CHANNEL_VALUE: '55d6c92fe0f55a473b0ccccc']    }    //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。    lintOptions {        abortOnError false    }     buildTypes {        release {            //不显示Log            buildConfigField "boolean", "LOG_DEBUG", "false"            //不混淆            minifyEnabled false            //zipalign优化            zipAlignEnabled true            //移除无用的resource文件            shrinkResources false            //使用该目录下的混淆文件proguard-rules.pro'            proguardFiles 'proguard-rules.pro'            //应用上面写的签名            signingConfig signingConfigs.release        }        debug {            //显示Log            buildConfigField("boolean", "LOG_DEBUG", "true")            //不混淆            minifyEnabled false            //zipalign优化            zipAlignEnabled true            //移除无用的resource文件            shrinkResources false            //使用系统默认的android程序混淆文件,该文件已经包含基本的混淆声明            proguardFiles 'proguard-rules.pro'            //应用上面写的签名            signingConfig signingConfigs.debug        }    }    //渠道Flavors ,配置不同渠道的app    productFlavors {       //百度,针对该渠道的apk设置特定的值        baidu{            manifestPlaceholders = [CLIENT_ID: "ccxzc"]            applicationId 'com.ss'            versionCode 1            versionName '1'        }        //小米,没有针对apk设置特定的值,故使用defaultConfig 里面的声明值        xiaomi{}    }    //批量配置,这里的意思是为productFlavors 的所有渠道包设置meta_umeng_channel,    //name为渠道包名字(上面的baidu,xiaomi),UMENG_CHANNEL_VALUE在AndroidManifest.xml文件声明了,见下文    productFlavors.all { flavor ->        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]    }    //打包后应用名称,这里实现对打包出来的apk重命名    //appName(),releaseTime()已经在上面声明了    applicationVariants.all { variant ->        variant.outputs.each { output ->            def outputFile = output.outputFile            if (outputFile != null && outputFile.name.endsWith('.apk')) {                //命名根据applicationId                def fileName = "${appName()}_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"                output.outputFile = new File(outputFile.parent, fileName)            }        }    }}dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    compile 'com.android.support:appcompat-v7:22.2.0'    compile project(':x_Project2')}

下面解释下几个主要的参数

buildConfigField

当你声明了之后,gradle build之后会生成一个BuildConfig类,大概如下

public final class BuildConfig {  public static final boolean DEBUG = Boolean.parseBoolean("true");  public static final String GAME_URL = "file:///android_asset/index.html";  public static final boolean HAS_SPLASH = Boolean.parseBoolean("false");}

可以在defaultConfig声明通用常量或者在productFlavors针对某个特定的渠道声明一个常量

productFlavors {        //阿里巴巴        ali{            buildConfigField 'boolean', 'HAS_SPLASH', 'Boolean.parseBoolean("true")'        }}

然后在实现类中调用

insertSplashView(BuildConfig.HAS_SPLASH);private void insertSplashView(boolean hasSplash) {    ...}

就可以实现针对不同渠道配置不同参数


productFlavors

在里面声明多个渠道,打包的时候生成多个apk

productFlavors {        baidu {            manifestPlaceholders = [ UMENG_CHANNEL_VALUE: "百度", UMENG_APPKEY_VALUE: "dasd", GAME_URL: "file:///android_asset/index.html", GAME_ORIENTATION: "0"]            applicationId 'com.baidu.chan'            versionCode 1            versionName '1'        }        xiaomi {            manifestPlaceholders = [ UMENG_CHANNEL_VALUE: "xiaomi", UMENG_APPKEY_VALUE: "dasd", GAME_URL: "file:///android_asset/index.html", GAME_ORIENTATION: "0"]            applicationId 'com.xiaomi.chan'            versionCode 1            versionName '1'        }    }

manifestPlaceholders 里面的声明的值是在AndroidManifest.xml定义的

        <meta-data            android:name="UMENG_APPKEY"            android:value="${UMENG_APPKEY_VALUE}" />        <meta-data            android:name="UMENG_CHANNEL"            android:value="${UMENG_CHANNEL_VALUE}" />        <meta-data            android:name="GAME_URL"            android:value="${GAME_URL}" />        <meta-data            android:name="GAME_ORIENTATION"            android:value="${GAME_ORIENTATION}" />

通过这种方法实现多渠道配置。


某些时候每个渠道都要一些不同的图片或者代码,比如,小米市场打开的时候要小米的欢迎界面,360要360的欢迎界面。可以在代码src目录下新建想要渠道的文件,注意文件名要与productFlavors 下声明的渠道名相同,这样打包小米的渠道包时,就优先加载这个渠道包的文件

这里写图片描述

如上,小米需要特定的图片,故只需要重写ic_launch.png图片,就可以简单实现了

0 0
原创粉丝点击