Unity自动打包-Android Studio - Gradle全局公共配置

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。

为什么需要全局配置?

伴随项目模块化开发、组件化开发以及插件化开发等模式的出现,为方便在不同module中设置版本号等配置信息,可以通过配置全局变量来统一管理所有module的公共配置信息。

全局配置方式

1. 使用ext属性配置
//1.1 在项目build.gradle中使用ext属性
ext {
    androidToolsVersion: '28.0.3',
    buildToolsVersion  : '28.0.3',    //构建工具的版本,其中包括了打包工具aapt、dx等
    compileSdkVersion  : 28           //
    minSdkVersion      : 16           //
    targetSdkVersion   : 28           //
    versionCode        : 1
    versionName        : "1.0.0"
}
//1.2 在某个module的build.gradle中使用配置
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName
    }
}
2. 使用config.gradle配置
//2.1 在项目的根目录下新建config.gradle文件
//2.2 将gradle中的公共信息写入config.gradle文件中
ext {
    android = [
            androidToolsVersion: '28.0.3',
            buildToolsVersion  : '28.0.3',     //构建工具的版本,其中包括了打包工具aapt、dx等
            compileSdkVersion  : 28,           //
            minSdkVersion      : 16,           //
            targetSdkVersion   : 28,           //
            versionCode        : 1,
            versionName        : "1.0.0",
    ]
}
//2.3 在主项目的build.gradle中申明一下
apply from: "config.gradle"
//2.4 在项目中引用公共配置
android {
    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }
}
//个人完整的config.gradle配置

//config.gradle用于统一配置项目中各常量和依赖库
//使用在项目根build.gradle上方添加 apply from: "config.gradle"
//然后使用"rootProject.ext"对象调用各属性,例如 rootProject.ext.android.compileSdkVersion、daggerLibs.api、daggerLibs.values()
ext {
    //项目包名集合
    packageMap = [
            "app": "app的包名"
    ]

    android = [
            androidToolsVersion: '28.0.3',
            buildToolsVersion  : '28.0.3',     //构建工具的版本,其中包括了打包工具aapt、dx等
            compileSdkVersion  : 28,           //
            minSdkVersion      : 16,           //
            targetSdkVersion   : 28,           //
            versionCode        : 1,
            versionName        : "1.0.0",
    ]

    libVersions = [
            junit                   : '4.12',

            supportLibraryVersion   : '27.1.1',
            supportVersion          : '28.0.3',
            constraintLibraryVersion: "1.1.2",
    ]

    androidSupport = "com.android.support"

    testLibs = [
            junit: "junit:junit:${libVersions.junit}",
    ]

    depLibs = [
            junit  : 'junit:junit:4.12',

            support: [
                    appcompatV4 : "${androidSupport}:support-v4:${libVersions.supportLibraryVersion}",
                    appcompatV7 : "${androidSupport}:appcompat-v7:${libVersions.supportLibraryVersion}",
                    cardview    : "${androidSupport}:cardview-v7:${libVersions.supportLibraryVersion}",
                    design      : "${androidSupport}:design:${libVersions.supportLibraryVersion}",
                    recyclerview: "${androidSupport}:recyclerview-v7:${libVersions.supportLibraryVersion}",

                    constraint  : "${androidSupport}.constraint:constraint-layout:${libVersions.constraintLibraryVersion}",

            ],
    ]
}

ext.common = [
        packageTime : "${new Date().format("yyyyMMdd.HHmm.ss.SSS", TimeZone.getTimeZone("GMT+08:00"))}",
        AARBackupDir: "${rootDir}/aarBackupDir/",
]

def config = rootProject.ext.android

//配置当前project和其subproject的所有project(module)
subprojects {

    beforeEvaluate {
        println '配置阶段开始前的监听回调'
    }

    afterEvaluate {
        println '配置阶段完成以后的回调'
    }

    gradle.buildStarted {
        println 'build开始的回调监听'
    }

    gradle.buildFinished {
        println 'build完毕后的回调监听'
    }

    gradle.beforeProject {
        println 'gradle执行前的回调监听'
    }

    gradle.afterProject {
        println 'gradle执行前的回调监听'
    }

    //在所有子build.gradle(module)文件中添加android 字段
    afterEvaluate { project ->//回调
        if (project.hasProperty('android')) {//存在android 字段
            android {
                compileSdkVersion config.compileSdkVersion
                buildToolsVersion config.buildToolsVersion

                defaultConfig {
                    minSdkVersion config.minSdkVersion
                    targetSdkVersion config.targetSdkVersion
                    versionCode config.versionCode
                    versionName config.versionName
                    multiDexEnabled true

                    ndk {
                        //设置支持的SO库架构
                        //'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
                        // 注:放开'arm64-v8a'会找不到腾讯人脸识别的类库包,>=android7.0 手机会崩溃
                        abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
                    }
                }

                defaultConfig {
                    javaCompileOptions {
                        annotationProcessorOptions {
                            arguments = [AROUTER_MODULE_NAME: project.getName()]
                        }
                    }
                }

                buildTypes {
                    release {
                        minifyEnabled false
                        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                    }
                }

                compileOptions {
                    sourceCompatibility app.sourceCompatibilityVersion
                    targetCompatibility app.targetCompatibilityVersion
                }

                //关闭Android Studio的PNG合法性检查的
                aaptOptions.cruncherEnabled = false
                aaptOptions.useNewCruncher = false

                //减少编译错误和忽略 lint 检查
                packagingOptions {
                    //Espresso excludes
                    exclude 'META-INF/DEPENDENCIES.txt'
                    exclude 'META-INF/LICENSE.txt'
                    exclude 'META-INF/NOTICE.txt'
                    exclude 'META-INF/NOTICE'
                    exclude 'META-INF/LICENSE'
                    exclude 'META-INF/DEPENDENCIES'
                    exclude 'META-INF/notice.txt'
                    exclude 'META-INF/license.txt'
                    exclude 'META-INF/dependencies.txt'
                    exclude 'META-INF/LGPL2.1'
                    exclude 'LICENSE.txt'

                    //Android studio默认会有so文件进行压缩优化,加入以下配置可以不压缩so
                    doNotStrip "*/armeabi/*.so"
                    doNotStrip "*/armeabi-v7a/*.so"
                    //doNotStrip "*/x86/*.so"
                }

                //程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉
                lintOptions {
                    disable 'InvalidPackage'
                    checkReleaseBuilds false
                    abortOnError false
                }

                // dex预处理和最多八线程
                dexOptions {
                    // incremental true
                    preDexLibraries true
                    maxProcessCount 8
                }

                //关闭不需要task
                tasks.whenTaskAdded { task ->
                    if (task.name.contains("lint")
                            || task.name.contains("Aidl")
                            || task.name.contains("mockableAndroidJar")
                            || task.name.contains("UnintTest")
                            || task.name.contains("AndroidTest")
                            || task.name.contains("Ndk")
                            || task.name.contains("Jni")
                    ) {
                        task.enabled = false
                    }
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,543评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,175评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 123,618评论 2 7