gradle多渠道打包apk小贴士

使用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值