android gradle 实例教程一(同时打多渠道包)

Posted 夜宿山寺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android gradle 实例教程一(同时打多渠道包)相关的知识,希望对你有一定的参考价值。

gradle多渠道


一,多渠道:

之前也很少接触gradle,后来因为一些需求,去研究了一段时间,先记录一下打多渠道包吧,首先得在项目的build.gradle文件里面加入下面几行。然后在build.gradle的同级目录下,输入gradle build就能够打出两个包来了,这个是非常方便的,针对多个市场来说,基本上一个命令就能够搞定所有的市场,而且还能够动态的变化

//    渠道列表
android
    productFlavors 
        flavor1 
            applicationId "com.k.note1"
            versionCode 20
        

        flavor2 
            applicationId "com.k.note"
            minSdkVersion 14
        
    
    我用的gradle 版本是1.11  所以在项目的 build/outputs/apk中能够看到如下的版本

Note-flavor1-debug-unaligned.apk  Note-flavor1-release-unsigned.apk Note-flavor2-debug-unaligned.apk  Note-flavor2-release-unsigned.apk

以上的包都没有签名,而且默认是打两个包,分别是release和debug,但是很多时候我们不需要打debug得包,当市场比较多得时候打包速度会非常的慢,所以我们其实可以直接assembleRelease 这个task。

简化后的打包代码如下: 这个时候只需要输入 gradle rele 就能够打包release版本的包,同时deb也一样

android
    productFlavors 
        flavor1 
            applicationId "com.k.note1"
            versionCode 20
        

        flavor2 
            applicationId "com.k.note"
            minSdkVersion 14
        
    

task rele(dependsOn:"assembleRelease") << 
    println "release complete"

task deb(dependsOn: "assembleDebug") << 
    println "debug complete"



二.groovy脚本自定义渠道名:
一个市场加上一个flvor,确实有点头疼,同时如果我们还有更多需要扩展的需求,例如给某个市场加广告,某个市场不加广告,这些变态的需求,这个时候我们定义在这里就不太合适。我们需要通过对市场的命名来确定扩展相应的市场的需求,比如一个市场需要广告是安智的,另外一个广告是木蚂蚁的,这个时候我们可以通过命名的方式,例如:azAD.com.baidu  mmy.com.baidu 可以通过这种命名方式来进行扩展。当然也得写相应的groovy脚本,其实写到这里,我也不会groovy脚本,大概的看了下教程,其实跟java差不多,所以顺手就写了


initAllResource()
def initAllResource()

    //加载市场
    initChannels()
    //把加载后的广告生成渠道列表
    android.productFlavors
        project.ext.channels.each channel->
            "$channel"
                applicationId project.ext.appsettings['packageName']
            
        
    

//初始化市场
def initChannels()

    //定义一个项目的数组,project.ext可以直接定义全局的变量
    project.ext.channels=[]
    //相对目录下得文件
    def path="channles.txt"
    //调用groovy的函数去遍历读取一行,判断如果是#开头,那么久不读。主要是用#来做注释
    file(path).eachLineline->
        println "loading... $line###"
        line = line.trim();
        if(line.size()>0&& !line.startsWith("#"))
        
            //这里定义的是全局变量,之后在任意一个地方都可以访问
            project.ext.channels.add(line)
        

    


channles.txt文件
com.baidu
com.360


以上的函数会再执行gradle的时候自动就默认调用函数initAllResource(),一下是全部的gradle配置文件

apply plugin: 'android'
android 
    compileSdkVersion 21
    buildToolsVersion "21.0.0"
    compileOptions.encoding = "UTF-8";
    defaultConfig 
        applicationId "com.k.note"
        targetSdkVersion 21
        versionName "1.0"
        versionCode project.ext.appsettings['versionCode']
        versionName project.ext.appsettings['versionName']
        minSdkVersion project.ext.appsettings['minSdkVersion']
        targetSdkVersion project.ext.appsettings['targetSdkVersion']
        applicationId project.ext.appsettings['packageName']

    
    lintOptions 
        abortOnError false
    
//    渠道列表
    productFlavors 
        flavor1 
            applicationId "com.k.note1"
            versionCode 20
        
    

    signingConfigs 
        myConfig
            storeFile file("$project.ext.appsettings['keyfile']")
            storePassword project.ext.appsettings['keycert']
            keyAlias project.ext.appsettings['keyalias']
            keyPassword project.ext.appsettings['keycert']
        
        release 
            storeFile file("$project.ext.appsettings['keyfile']")
            storePassword project.ext.appsettings['keycert']
            keyAlias project.ext.appsettings['keyalias']
            keyPassword project.ext.appsettings['keycert']
        
    
    buildTypes 

        release 
            signingConfig signingConfigs.myConfig
//            发布版打开混淆,具体混淆规则可以百度
            runProguard true
//            打开zip优化,优化可以较少app的大小,和app效率
            zipAlign true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
        debug 
            runProguard false
            zipAlign false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    

initAllResource()
def initAllResource()

    //加载市场
    initChannels()
    //把加载后的广告生成渠道列表
    android.productFlavors
        project.ext.channels.each channel->
            "$channel"
                applicationId project.ext.appsettings['packageName']
            
        
    

//初始化市场
def initChannels()

    //定义一个项目的数组,project.ext可以直接定义全局的变量
    project.ext.channels=[]
    //相对目录下得文件
    def path="channles.txt"
    //调用groovy的函数去遍历读取一行,判断如果是#开头,那么久不读。主要是用#来做注释
    file(path).eachLineline->
        println "loading... $line###"
        line = line.trim();
        if(line.size()>0&& !line.startsWith("#"))
        
            //这里定义的是全局变量,之后在任意一个地方都可以访问
            project.ext.channels.add(line)
        

    

task rele(dependsOn:"assembleRelease") << 
    println "release complete"

task deb(dependsOn: "assembleDebug") << 
    println "debug complete"


project.ext.appsettings 这个是定义在同级目录下得配置文件,也是通过project.ext设置的全局变量 

setting.gradle文件内容如下

project.ext.appsettings = [
        'enumName'           :  'Note',
        'packageName'        :  'com.k.note',
        'versionCode'        :  1,
        'versionName'        :  '1.1.0',
        'minSdkVersion'      :  15,
        'targetSdkVersion'   :  21,
        'keyfile'            :  "NoteKeys.jks",
        'keyalias'           :  "Note_WK",
        'keycert'            :  "qq123456",
]

keyfile是直接用studio生成的加密文件,具体可以百度下,非常简单


以上是关于android gradle 实例教程一(同时打多渠道包)的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 中的实例之动态修改AndroidManifest文件

Android Gradle 中的实例之动态修改AndroidManifest文件

Android Gradle 中的实例之动态修改AndroidManifest文件

Android Gradle 中的实例之动态修改AndroidManifest文件

Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )

Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )