Android Gradle基本解析

2019-07-22  本文已影响0人  RookieRun

Android Gradle 文件解析
1.项目project的build.gradle

    1.buildscript{①
        repositories{
            google()
            jcenter()
        }
        dependencies{
            classpath 'com.android.tools.build:gradle:3.2.1'
        }
    }
    2.allprojects{②
        repositories{
            google()
            jcenter()
        }
    }
    3.task clean(type:Delete){
        delete rootProject.buildDir
    }
>解释:
    buildscript{}闭包里是gradle脚本执行所需依赖,分别对应的是maven库和插件,包含buildscript和dependencies两个目录
        repositories{}闭包:配置远程仓库
        dependencies{}闭包:配置构建工具,该闭包使用classpath声明了一个Gradle插件,由于Gradle 并不只是用来构建Android项目,
            因此此处引入相关插件来构建Android项目,其中‘3.2.1’为该插件的版本号,可以根据最新的版本号来调整
    allprojects{}闭包里是项目本身需要的依赖,比如项目所需的maven库
    task clean {}是运行gradle clean时,执行此处定义的task任务,该任务继承子Delete,删除根目录中的build目录

2.Module中的build.gradle

    1.apply plugin:'com.android.application/library' 
    2.android{
        compileSdkVersion:28
        defaultConfig{
            applicationId "com.example.scrolltest"
            minSdkVersion 16
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
        }
        signingConfigs {// 自动化打包配置
            release {// 线上环境
                keyAlias 'test'
                keyPassword '123456'
                storeFile file('test.keystore')
                storePassword '123456'
            }
            debug {// 开发环境
                keyAlias 'test'
                keyPassword '123456'
                storeFile file('test.keystore')
                storePassword '123456'
            }
    }
    buildTypes{
            release {// 生产环境
            buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志
            buildConfigField("String", "URL_PERFIX", "\"https://release.cn/\"")// 配置URL前缀
            minifyEnabled false//是否对代码进行混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的规则文件
            signingConfig signingConfigs.release//设置签名信息
            pseudoLocalesEnabled false//是否在APK中生成伪语言环境,帮助国际化的东西,一般使用的不多
            zipAlignEnabled true//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
            applicationIdSuffix 'test'//在applicationId 中添加了一个后缀,一般使用的不多
            versionNameSuffix 'test'//在applicationId 中添加了一个后缀,一般使用的不多
        }
        debug {// 测试环境
            buildConfigField("boolean", "LOG_DEBUG", "true")//配置Log日志
            buildConfigField("String", "URL_PERFIX", "\"https://test.com/\"")// 配置URL前缀
            minifyEnabled false//是否对代码进行混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//指定混淆的规则文件
            signingConfig signingConfigs.debug//设置签名信息
            debuggable false//是否支持断点调试
            jniDebuggable false//是否可以调试NDK代码
            renderscriptDebuggable false//是否开启渲染脚本就是一些c写的渲染方法
            zipAlignEnabled true//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
            pseudoLocalesEnabled false//是否在APK中生成伪语言环境,帮助国际化的东西,一般使用的不多
            applicationIdSuffix 'test'//在applicationId 中添加了一个后缀,一般使用的不多
            versionNameSuffix 'test'//在applicationId 中添加了一个后缀,一般使用的不多
        }
    }
     packagingOptions{
        //pickFirsts做用是 当有重复文件时 打包会报错 这样配置会使用第一个匹配的文件打包进入apk
        // 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时  只用第一个 这样打包就不会报错
        pickFirsts = ['META-INF/LICENSE']

        //merges何必 当出现重复文件时 合并重复的文件 然后打包入apk
        //这个是有默认值得 merges = [] 这样会把默默认值去掉  所以我们用下面这种方式 在默认值后添加
        merge 'META-INF/LICENSE'

        //这个是在同时使用butterknife、dagger2做的一个处理。同理,遇到类似的问题,只要根据gradle的提示,做类似处理即可。
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }
     productFlavors {
        wandoujia {}
        xiaomi {}
        _360 {}
    }

    productFlavors.all {
            //批量修改,类似一个循序遍历
        flavor -> flavor.manifestPlaceholders = [IFLYTEK_CHANNEL: name]
    }
}
    3.dependencies{
        implementation fileTree(dir:'libs',include:['*.jar'])
        implementation/api 'com.android.support:appcompat-v7:28.1.1'
        ...
    }
>解释:
1.apply plugin:'com.android.application'表明该module是一个可以单独运行的应用程序,打包出来的是.apk文件
    而com.android.library,则表示该module需要作为其他module的library而运行,打包出来的是.aar文件

Gradle 与Gradle插件

1.gradle 插件-版本
com.android.tools.build:gradle:3.2.1
作用是:指明当前项目所用的gradle插件的版本,版本号受当前项目的gradle版本以及As版本影响,
而gradle插件又回和Android SDK BuildTool有关联,这也是为什么我们需要在local.propertites中指明sdk的路径,在build.gradle中指明buildToolsVersion的原因
Android Gradle Plugin本质上就是一个AS的插件,它一边调用Gradle本身的代码和批处理工具来构建项目,一边调用Android SDK的编译,打包功能
2.gradle环境变量
指明当前电脑的gradle环境,和jdk一个道理
3.gradle.propertites
指明当前项目所使用的gradle版本
4.applicationID与manifest中package的区别及各自的作用
applicationId对应的是应用包名,package对应的是R文件,也就是java包名
5.Android Studio版本与Gradle插件版本的关系
Android Studio3.0.0后,AS升级时会自动升级gradle插件
6.gradle插件与gradle版本关系
gradle插件是在项目的gradle文件的buildscript{}节点中指明的,每一个版本的gradle插件,都需要有与之对应的gradle版本,这个gradle版本,在gradle.propertites中指明即可

上一篇下一篇

猜你喜欢

热点阅读