Unity自動(dòng)打包-Android Studio - Gradle全局公共配置

Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建開(kāi)源工具。它使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置。

為什么需要全局配置?

伴隨項(xiàng)目模塊化開(kāi)發(fā)、組件化開(kāi)發(fā)以及插件化開(kāi)發(fā)等模式的出現(xiàn),為方便在不同module中設(shè)置版本號(hào)等配置信息,可以通過(guò)配置全局變量來(lái)統(tǒng)一管理所有module的公共配置信息。

全局配置方式

1. 使用ext屬性配置
//1.1 在項(xiàng)目build.gradle中使用ext屬性
ext {
    androidToolsVersion: '28.0.3',
    buildToolsVersion  : '28.0.3',    //構(gòu)建工具的版本,其中包括了打包工具aapt、dx等
    compileSdkVersion  : 28           //
    minSdkVersion      : 16           //
    targetSdkVersion   : 28           //
    versionCode        : 1
    versionName        : "1.0.0"
}
//1.2 在某個(gè)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 在項(xiàng)目的根目錄下新建config.gradle文件
//2.2 將gradle中的公共信息寫(xiě)入config.gradle文件中
ext {
    android = [
            androidToolsVersion: '28.0.3',
            buildToolsVersion  : '28.0.3',     //構(gòu)建工具的版本,其中包括了打包工具aapt、dx等
            compileSdkVersion  : 28,           //
            minSdkVersion      : 16,           //
            targetSdkVersion   : 28,           //
            versionCode        : 1,
            versionName        : "1.0.0",
    ]
}
//2.3 在主項(xiàng)目的build.gradle中申明一下
apply from: "config.gradle"
//2.4 在項(xiàng)目中引用公共配置
android {
    defaultConfig {
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }
}
//個(gè)人完整的config.gradle配置

//config.gradle用于統(tǒng)一配置項(xiàng)目中各常量和依賴庫(kù)
//使用在項(xiàng)目根build.gradle上方添加 apply from: "config.gradle"
//然后使用"rootProject.ext"對(duì)象調(diào)用各屬性,例如 rootProject.ext.android.compileSdkVersion、daggerLibs.api、daggerLibs.values()
ext {
    //項(xiàng)目包名集合
    packageMap = [
            "app": "app的包名"
    ]

    android = [
            androidToolsVersion: '28.0.3',
            buildToolsVersion  : '28.0.3',     //構(gòu)建工具的版本,其中包括了打包工具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

//配置當(dāng)前project和其subproject的所有project(module)
subprojects {

    beforeEvaluate {
        println '配置階段開(kāi)始前的監(jiān)聽(tīng)回調(diào)'
    }

    afterEvaluate {
        println '配置階段完成以后的回調(diào)'
    }

    gradle.buildStarted {
        println 'build開(kāi)始的回調(diào)監(jiān)聽(tīng)'
    }

    gradle.buildFinished {
        println 'build完畢后的回調(diào)監(jiān)聽(tīng)'
    }

    gradle.beforeProject {
        println 'gradle執(zhí)行前的回調(diào)監(jiān)聽(tīng)'
    }

    gradle.afterProject {
        println 'gradle執(zhí)行前的回調(diào)監(jiān)聽(tīng)'
    }

    //在所有子build.gradle(module)文件中添加android 字段
    afterEvaluate { project ->//回調(diào)
        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 {
                        //設(shè)置支持的SO庫(kù)架構(gòu)
                        //'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
                        // 注:放開(kāi)'arm64-v8a'會(huì)找不到騰訊人臉識(shí)別的類庫(kù)包,>=android7.0 手機(jī)會(huì)崩潰
                        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
                }

                //關(guān)閉Android Studio的PNG合法性檢查的
                aaptOptions.cruncherEnabled = false
                aaptOptions.useNewCruncher = false

                //減少編譯錯(cuò)誤和忽略 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默認(rèn)會(huì)有so文件進(jìn)行壓縮優(yōu)化,加入以下配置可以不壓縮so
                    doNotStrip "*/armeabi/*.so"
                    doNotStrip "*/armeabi-v7a/*.so"
                    //doNotStrip "*/x86/*.so"
                }

                //程序在buid的時(shí)候,會(huì)執(zhí)行l(wèi)int檢查,有任何的錯(cuò)誤或者警告提示,都會(huì)終止構(gòu)建,我們可以將其關(guān)掉
                lintOptions {
                    disable 'InvalidPackage'
                    checkReleaseBuilds false
                    abortOnError false
                }

                // dex預(yù)處理和最多八線程
                dexOptions {
                    // incremental true
                    preDexLibraries true
                    maxProcessCount 8
                }

                //關(guān)閉不需要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
                    }
                }
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽(tīng)閱讀 10,843評(píng)論 0 11
  • 彩排完,天已黑
    劉凱書(shū)法閱讀 4,473評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,644評(píng)論 2 7

友情鏈接更多精彩內(nèi)容