gradle android基本配置详解

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"

    defaultConfig {
        /**
         * 属性的配置
         */
        applicationId "cct.cn.gradle.lsn13"
        applicationIdSuffix "" // applicationId的后缀  最后组成的是cct.cn.gradle.lsn13.suffix
        minSdkVersion 14
        targetSdkVersion 25
        versionCode  1
        versionName "1.0"
        versionNameSuffix ".12"  // versionName  最后组成的是1.0.12

        //manifest占位符 给manifest传递变量
        manifestPlaceholders = [key:'xyz']

        //65535问题 0xffff是否开启分包dex
        multiDexEnabled true
        //每一行表示要配置到主dex的一个类 com/a/c/c.class 配置分包规则
        multiDexKeepFile file('keep_in_main.txt')
        //-keep com.a.b.c.**{*;} proguard写法的的分包规则
        multiDexKeepProguard

        //测试引擎
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //配置ndk的一些规则
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }

            //配置Gradle 构建时需要的.so动态库
            // Gradle会构建那些 ABI 配置,但是只会将 defaultConfig.ndk {} 代码块中指定的配置打包到 apk 中
            ndkBuild{
                abiFilters 'armeabi','armeabi-v7a'
            }
        }

        //指打包到apk里面的.so包种类
        ndk{
            abiFilters 'armeabi','armeabi-v7a'
        }

        //支持svg
        vectorDrawables{
            //如果minsdk小于21 会在mdpi的目录png图片
            generatedDensities 'mdpi'
            //如果设置为true 引入svg兼容包 不会再去管generatedDensities配置
            // 建议只选下面这个就好了 丢弃generatedDensities
            useSupportLibrary true
        }

        //能支持部分java8的特性 比如lambda
        jackOptions {
            enabled false
        }

        //可以配置Java的一些方法  比如apt注解处理器
        javaCompileOptions{

        }

        /**
         * 下面是方法使用
         */
        //配置在build/generated/source/buildConfig/ 下面有个BuildConfig文件下的属性
        buildConfigField('boolean','IS_RELEASE','false')

        //  res/value 设置一个值  之后就而已调用R.string.lin了
        //  生成的结果是<string name="lin" translatable="false">linyao</string>
        resValue('string','lin','linyao')
    }

    /**
     * 创建两个维度 维度是配合 productFlavors一起使用的
     * 下面一个时产品维度  一个时动态库维度
     */
    flavorDimensions('product','abi')

    /**
     * 创建产品风味 相当于集成了defaultConfig的属性  这里可以修改自己风味(变体)的属性
     * 不同的维度的风味结合在一起 组成一个apk的配置信息
     */
    productFlavors{
        free{
            dimension 'product'

            //这个属性是覆盖defaultConfig的
            manifestPlaceholders = [key: '66']

            //这个两个是追加在defaultConfig的
            applicationIdSuffix ""
            versionNameSuffix ".16"
        }

        pro{
            dimension 'product'
            manifestPlaceholders = [key: 'product']
        }

        x86{
            dimension 'abi'
        }

        arm{
            dimension 'abi'
        }

    }

    /**
     *    过滤风味(变体) 下面例子过滤pro变体
     */
    variantFilter{
        variant ->
            variant.flavors.each{
                if(it.name.contains('pro')){
                    setIgnore(true)
                }
            }
    }

    /**
     * 配置签名文件 里面可以配置多个签名文件
     */
    signingConfigs{
        mySign{
            //签名文件的路径
            storeFile file('debug.keystore')
            //签名文件密码
            storePassword 'android'
            //别名
            keyAlias 'androiddebygkey'
            //key的密码
            keyPassword 'android'
        }
    }

    /**
     * 变体
     * buildTypes和defaultConfig继承自同一个类 很多东西两者都可以配置
     */
    buildTypes {
        release {
            //选择配置的签名文件
//            signingConfig signingConfigs.mySign

            //proguard 优化是否开启 true的时候会进行代码混淆 并优化代码 去掉多余无用的类
            minifyEnabled true

            //将下面两个混淆文件都放在混淆文件proguardFiles中
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            //优化压缩资源文件 和minifyEnabled配合使用 必须开启混淆 这个可以减少apk的大小
            shrinkResources true
        }

        debug{
            /**
             * 属性
             */
            //和defaultConfig中配置是一样的  这个会累加到defaultConfig中配置的applicationId后面
            applicationIdSuffix ''

            //版本名字后缀,用法同上
            versionNameSuffix '.1'

            //生成的apk是否可以调试 默认是true
            debuggable true

            //是否可以调试NDK代码 使用lldb进行c和c++代码调试
            jniDebuggable true

            //帮助国际化的东西 然而并没有什么用 会多几个string的国际化的数据
            pseudoLocalesEnabled false

            //是否开启渲染脚本 就是一些c写的渲染方法
            renderscriptDebuggable false

            //渲染脚本等级 默认是5
            renderscriptOptimLevel 5

            //用jacoco 报告测试覆盖率的 必须是机器测试不能是本地测试(要在test文件加下 不能是androidTest文件夹)
            testCoverageEnabled false

            //优化 默认就是true app对齐
            zipAlignEnabled true

            /**
             * 方法
             */
            //配置在build/generated/source/buildConfig/ 下面有个BuildConfig文件下的属性
            buildConfigField('boolean','IS_RELEASE','false')
        }

        hello{
            //就是集成子debug 集成debug所有的配置
            initWith debug
        }
    }

    /**
     * 设置构建ndk的CMakeLists文件
     */
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    /**
     * 打包时候用的 Android资源文件编译工具
     */
    aaptOptions{
        //aapt执行时的额外参数 例如下面就是增加一条修改AndroidManifest包名的一条密令
        //还可以在参数后面加 '-S','src/main/res2','--auto-add-overlay'实现重叠包,这样res 和res2里面的资源会叠加
        //如果有重复的 以res为准
        additionalParameters '--rename-manifest-package',
                'cct.cn.gradle.lsn13','-S','src/main/res2','--auto-add-overlay'

        //对png进行优化检查 默认true
        //比如把.jpg格式图片改成.png后缀 那开启这个检查后编译就会报错 能够把这个错误检测出来
        cruncherEnabled true

        //对res目录下的资源文件进行排除 比如下面的写法 就不会把res文件夹下面的所有.jpg格式的文件打包到apk中
        //注意: 这个只排除res目录下的文件  不排除assets目录下的
        ignoreAssets '*.jpg'

        //对资源文件不进行压缩 默认是对.png .jpg等文件不压缩 对.xml等文件都进行压缩
        //如果写成空字符串 '' 则对所有文件都不压缩
        //下面是表示对所有.bat文件不进行压缩
        //运用 aapt l -v app/build/outputs/apk/app-debug.apk 可以查看这个apk的资源文件的压缩情况
        noCompress '.bat'

    }

    /**
    * 资源合并规则 下面是规则 前面的会覆盖后面的
    * Variant(freeDebug变体文件) > buildType(Debug) > flavor(hello) > (main >aapt -S) > dependencies
    * /
    /**
     * 资源整合
     */
    sourceSets{
        main{
            //这里如果res和myres中有冲突资源会报错  不像aapt里面会议res优先
            res.srcDirs 'src/main/res','src/main/myres'

            //把lib里面的资源整合到jniLibs里 指定.so文件目录
            jniLibs.srcDirs = ['libs']

            //下面是所有可以指定的目录 可以自己更改
            aidl.srcDirs 'src/main/aidl'
            assets.srcDirs 'src/main/assets'
            java.srcDirs 'src/main/java'
            jni.srcDirs 'src/main/jni'
            renderscript.srcDirs 'src/main/renderscript' // 渲染脚本目录
            resources.srcDirs 'src/main/resources'

            //这个是指定manifest文件 不是指定目录
            manifest.srcFile 'src/main/AndroidManifest.xml'

            //这个就是main 名字 跟release debug 一样
            name

            //下面的不需要考虑
            compileConfigurationName //compile编译+打包的依赖配置组的名字 这个不能改 也没啥用
            packageConfigurationName //apk 打包
            providedConfigurationName // provided 编译
        }

        //不仅仅可以指定main里的目录配置 还可以指定风味的配置(比如多渠道打包)
        //如果打的包是free风味包 那出来的apk会把free目录里的文件叠加到main里
        free{

        }
    }

    /**
     * adb命令的一些操作
     */
    adbOptions{
        //调用adb install命令时可以传递的参数
        //例如: 调用adb install -d 可以安装低版本的apk  -r 替换已经存在的application
        installOptions '-d'

        //执行adb命令的时候设定的一个超时时间 单位毫秒
        timeOutInMs 1000
    }

    /**
     *  编译的一些配置
     */
    compileOptions{
        //java源文件的编码格式 默认UTF-8
        encoding 'UTF-8'

        //java编译是否使用gradle新的增量模式 (这个就不需要管它了)
        incremental true

        //java源文件编译的jdk版本 默认是1.6 也可以指定1.7
        //但是不能指定1.8 除非开启了jackOptions  下面这个两个属性也没什么用 开启了jack自然可以用1.8的特性了
        sourceCompatibility JavaVersion.VERSION_1_7
        //编译出的class的版本
        targetCompatibility JavaVersion.VERSION_1_7
    }

    /**
     *  android提供的view和数据绑定的工具
     *  详细用法见官网http://developer.android.com/:搜索dataBinding
     */
    dataBinding {
        enabled true
    }

    /**
     * dx配置 打包时的分包工具
     */
    dexOptions{
        //指定附加的参数 像aaptOptions的additionalParameters  使用dx命令
        //和multiDexEnabled multiDexKeepFile配合使用 --main-dex-list命令会读取multiDexKeepFile指定的keep文件
        //--minimal-main-dex 表示设置主dex尽量最小 这样就算方法数不到65535 也可以开启分包
        //--set-max-idx-number 表示单个dex里面的最多id数 这样就会打出很多的dex包
        additionalParameters '--minimal-main-dex','--set-max-idx-number=10000'

        //执行dx时java虚拟机需要的内存大小 如果报内存不够错误  可以把下面的数字变大点
        javaMaxHeapSize '2048m'

        //开启大模式 dex大 如果=true 编译出的dex能够尽量大 存放更多的类
        jumboMode true

        //在dex中是否保留Runtime注解 默认是true
        keepRuntimeAnnotatedClasses true

        //默认dex中的进程数  默认是4  也没有必要修改
        maxProcessCount 4

        //默认的线程数
        threadCount 4

        //对library预编译 提高编译效率 但是会使clean的时候比较慢  默认开启的
        preDexLibraries true
    }

    /**
     * lint工具配置 lint工具帮助发现并纠正代码结构质量 检查未使用的资源
     */
    lintOptions{

        //默认true 表示当执行lint过程中发现错误 就停止构建
        abortOnError true
        //检测出错误时 输出绝对路径
        absolutePaths true
        //指定检测的id 设置这个属性后  只检测这一个id
//        check 'UnusedResources'
        //是否检查所有警告
        checkAllWarnings false
        //在release的buildType下是否检查fatal错误 如果有fatal错误 则会停止构建 默认true
        checkReleaseBuilds true
        //开启某一个id的检查
        enable 'UnusedResources'
        //关闭某一id的检查
        disable 'UnusedResources'

        //html的输出文件 传递一个文件
//        htmlOutput
        //执行检查的报告 是否需要生成 htmlOutput报告 默认true
        htmlReport true

        //xml的输出文件 传递一个文件
//        xmlOutput
        //执行检查的报告 是否需要生成xml报告 默认true
        xmlReport true

        //传入需要输出文本报告的的文件
        textOutput
        //是否输出文不报告 默认false
        textReport false

        //是否将警告变成错误
        warningsAsErrors false

        //是否忽略警告 只报告错误
        ignoreWarnings true
        //检查到错误时 是否包含错误的代码行数 默认true
        noLines true
        //是否关闭分析消息输出 如果是true就不会在终端中输出分析的消息 报告中仍然会有
        quiet true

        /**
         * 方法
         * 通过 lint --list 查看多有id
         */
        //把id为 UnusedResources(正常为警告级别) 提到错误界别
        error('UnusedResources')
        //忽略 用法同上
        ignore('UnusedResources')
        //警告
        warning('UnusedResources')
        //重大错误
//        fatal('UnusedResources')
    }

    /**
     * 打包配置
     */
    packagingOptions{
        //pickFirsts做用是 当有重复文件时 打包会报错 这样配置会使用第一个匹配的文件打包进入apk
        // 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时  只用第一个 这样打包就不会报错
        pickFirsts = ['META-INF/LICENSE']

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

        //排除文件 打包时排除匹配文件 也是有默认值得
        exclude 'META-INF/LICENSE'
    }

    /**
     * 分包规则
     * 根据cpu架构和屏幕像素密度分包
     */
    splits{

        //cpu架构配置
        abi{
            //开启abi分包
            enable true

            //是否创建一个包含所有有效动态库的apk
            universalApk true

            //清空所有默认值
            reset()

            //打出包含的包 这个是和默认值累加的
            include 'x86','armeabi'

            //排除指定的cpu架构
            exclude 'mips'
        }

        //根据手机屏幕像素密度打包
        density {
            //开启abi分包
            enable true

            //清空所有默认值
            reset()

            //打出包含的包 这个是和默认值累加的
            include 'xhdpi','xxhdpi'

            //排除指定
            exclude 'mdpi'
        }
    }

    /**
     * 测试配置
     * 在命令行输入 gradle :app:tDUT 可以进行测试 并输出测试报告
     */
    testOptions{
        //在设备化测试的时候关闭动画 设备化测试在androidTest里进行  test下的是单元测试
        animationsDisabled true

        //配置单元测试
        //详细说明见https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/testing/Test.html
        unitTests.all {

            // 设置测试时候的一些属性 下面这样在ExampleUnitTest类里写 可以获取value这个值
            // System.out.println(System.getProperty("key"));
            systemProperty 'key','value'

            //开启测试的标准输出  在命令行能够看到输出信息
            testLogging.showStandardStreams = true

            //排除对应包下的所有代码 只能排除包 不能单独排除类
            //下面是排除com.lin.test包下的所有测试代码
            exclude 'com/lin/test'
        }
    }

    /**
     * applicationVariants 获取所有变体
     * 遍历工程的所有变体
     *
     */
    applicationVariants.all{
        //会输出release、debug、hello
        println it.name
        //会输出apk的目录 ../../../debug.apk  outputs是个集合 所以用outputs* 展开操作符去遍历
        println it.outputs*.outputFile
    }
}

/**
 * 自定义dependencies过滤组
 * 因为dependencies只支持基本的风味分组 比如free x86 arm等 不支持组合
 * 这样定义后就支持组合了
 */
configurations{
    freeArmDebugCompile{}
}

dependencies {
    freeArmDebugCompile 'pub.devrel:easypermissions:0.1.9'
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    //导入myLibrary库 并指定配置为release 配和下面补充的第二条  ,
    compile project(path:':mylibrary',configuration:'release')
}

/**
 * 最后补充 都是在library库中的gradle配置
 * 1、consumerProguardFile 'proguard-rules.pro'
 * 这个是配置到library工程里的 defaultConfig中 意思是将library中的混淆文件添加到主工程当中
 * 主要是给library工程添加防混淆的proguard-rules.pro文件
 *
 * 2、publishNonDefault true  是否需要发布所有的依赖配置
 * 我们在引入library工程时 是可以指定library的变体的 指定是release还是debug
 * 这个参数等于true的意思是 库工程会生成多个配置 不仅仅是default的配置 这样我们就可以
 * 指定release变体了  不然的话会报错
 */

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值