Android studio gradle 详解

用studio 已经好长时间,对于gradle中的一些配置还是觉得默认,特花费一点时间进行梳理。(文章内容借鉴https://www.cnblogs.com/dasusu/p/6628099.html)

build.Gradle

//Model都有各自的build.gradle,这里声明该Model作为主项目,常见的还有另一个取值:
//apply plugin: 'com.android.library' 声明该Model作为库使用,当然还有其他取值,后面博客会介绍
apply plugin: 'com.android.application'

//这里是在as里引入一个retrolambda插件,具体我也不大懂,可以看看这篇博客: 
//http://blog.csdn.net/zhupumao/article/details/51934317?locationNum=12
apply plugin: 'me.tatarka.retrolambda'

//这里是groovy的代码了,定义了一个获取时间的方法,groovy是兼容java,它可以直接使用jdk里的方法
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

//file()是Project.java里的一个方法,这里定义一个File类型的对象,Project后面博客会介绍到
def keyStore = file('meizhi.keystore')

android {

    //这个大家应该很熟悉了,有疑问的应该是后面的代码,这里表示获取一些全局变量
    //这些变量的值在根目录下的build.gradle中定义,具体可以看看这篇博客:
    //http://blog.csdn.net/fwt336/article/details/54613419
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    //同理,这里都是通过获取全局设置的变量值来进行相关配置,这样做的好处在于当
    //你的项目里有多个model时,可以方便修改这些公共的配置,只需要修改一个地方就可以同步了
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }

    //这里应该是设置打包后的apk里的META-INF移除指定的文件吧
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        //省略部分exclude 代码...
    }

    //关闭指定的lint检查
    lintOptions {
        disable 'MissingTranslation', 'ExtraTranslation'
    }

    //lint检查到错误时不中断编译,好像是说lint检查是为优化代码,发现的错误其实并不会导致程序异常
    //所以有的时候及时发现Lint检查错误还是可以直接运行查看效果
    lintOptions {
        abortOnError false
    }

    //签名的相关配置
    signingConfigs {
        //这个标签名可以随意命名,这里的作用大概类似于定义一个对象,该对象里设置好了签名需要的各种配置
        //可以定义不止一种配置的签名对象,例如常见的还有 debug{...}, release{...},然后在buildTypes{}里
        //通过 signingConfigs.app1 进行调用
        app1 {
            //签名的相关配置,网上资料很多,STOREPASS, KEYALIAS, KEYPASS 这些常量是定义在
            //gradle.properties 文件里,如果没有该文件手动创建即可,这样可以保证安全
            //只有定义在 gradle.properties 里的常量才可以直接通过常量名引用
            storeFile file('meizhi.keystore')
            storePassword project.hasProperty('STOREPASS') ? STOREPASS : ''
            keyAlias project.hasProperty('KEYALIAS') ? KEYALIAS : ''
            keyPassword project.hasProperty('KEYPASS') ? KEYPASS : ''
        }
    }

    //编译,打包的项目配置
    buildTypes {

        debug {
            //在 BuildConfig 里自定义一个 boolean 类型的常量
            //更多资料可以查看:http://stormzhang.com/android/2015/01/25/gradle-build-field/ 
            buildConfigField "boolean", "LOG_DEBUG", "true"
            
            debuggable true
            applicationIdSuffix ".debug"
        }

        release {
            buildConfigField "boolean", "LOG_DEBUG", "false"

            debuggable false
            
            //开启混淆
            minifyEnabled true
            //删除无用的资源
            shrinkResources true
            //混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (keyStore.exists()) {
                println "Meizhi: using drakeet's key"
                //根据在signingConfigs.app1里的签名配置进行签名
                signingConfig signingConfigs.app1
            } else {
                println "Meizhi: using default key"
            }

            //这段代码应该会在大神的项目里挺常见的,我在很多项目里都看见过了
            //这也是groovy的代码,这里的代码作用是重命名最后打包出来的apk
            //根据 def fileName 设置的格式来命名,${}表示的是某个变量的引用
            //例如根据设置的格式最后apk命名可能是: Meizhi_v1.0.0_2017-03-28_fir.apk
            //至于 applicationVariants 这些变量含义后面博客会介绍
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "Meizhi_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }

        //这里的作用跟 singingConfigs 差不多,只是为不同的 flavor 设置一些属性
        //常见的设置比如设置不同的渠道编号,设置不同的 api 服务器等等
        productFlavors {
            fir {
                //这个的作用是将 AndroidManifest.xml 里的占位符 ¥{UMENG_CHANNEL_VALUE} 的值替换成fir
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fir"]
            }
            GooglePlay {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"]
            }
            Umeng {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Umeng"]
            }
        }
    }

    //设置JDK的版本通过compileOptions
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    //lint的相关配置吧
    lintOptions {
        disable "InvalidPackage"
        lintConfig file("lint.xml")
    }
}

//这里就不用说了
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(":libraries:headsupcompat")
    compile project(":libraries:smooth-app-bar-layout")
    //as默认会去下载传递依赖,下面是指定不需要去下载传递依赖
    compile ('com.squareup.retrofit2:retrofit:2.1.0') {
        exclude module: 'okhttp'
    }
    retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
    //省略部分compile代码...
}






参考文献

https://www.jianshu.com/p/9df3c3b6067a    Gradle 完成指南

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值