Unity自动打包-Android Studio - build.gradle详解

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

1. 根目录下的build.gradle

apply from: 'config.gradle' //应用全局公共配置

buildscript {

    // ext 用于定义动态属性
    ext {
        // 定义阿里云镜像配置
        repositories = [
                'https://maven.aliyun.com/repository/central',
                'https://maven.aliyun.com/repository/jcenter',
                'https://maven.aliyun.com/repository/public',
                'https://maven.aliyun.com/repository/google',
                'https://maven.aliyun.com/repository/gradle-plugin',
                'http://repo.springsource.org/libs-milestone-local'
        ]
    }

    // repositories闭包 配置远程仓库
    repositories {
        // 应用阿里云镜像配置
        rootProject.ext.repositories.each { repourl ->
            maven { url repourl }
        }

        google() // 代码托管库:声明后可引用google上的开源项目
        jcenter() // 代码托管库:声明后可引用jcenter上的开源项目
    }

    // dependencies闭包 配置构建工具
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4' // 声明gradle插件,插件版本号为3.1.4
        //classpath "com.mob.sdk:MobSDK:2018.0319.1724"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.cpdroid:fat-aar:1.1.0'
    }

    // 增加一些编译选项
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}

allprojects {
    repositories {
        rootProject.ext.repositories.each { repourl ->
            maven { url repourl }
        }

        google() // 代码托管库:声明后可引用google上的开源项目
        jcenter() // 代码托管库:声明后可引用jcenter上的开源项目
    }
}

// 运行gradle clean时,执行此处定义的task任务
// 该任务继承自Delete,删除根目录中的build目录
// 相当于执行Delete.delete(rootProject.buildDir)
task clean(type: Delete) {
    delete rootProject.buildDir
}

// 打印引用的仓库地址
task printRepos {
    doLast {
        repositories.each { repourl ->
            println "repository: ${repourl.name} ('${repourl.url}')"
        }
    }
}

2. module目录下的build.gradle

// 声明是Android程序
// com.android.application 表示这是一个应用程序模块, 可直接运行
// com.android.library 标识这是一个库模块, 作为代码库依附别的库运行
apply plugin: 'com.android.library'

def getProductName() { return "QuickUniSDK.Core" }

def config = rootProject.ext.android

// android闭包, 配置android构建参数
android {

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

    buildToolsVersion config.buildToolsVersion // build tools的版本, 其中包括了打包工具aapt、dx等等。
    compileSdkVersion config.compileSdkVersion // 编译sdk的版本, 也就是API Level, 例如API-19、API-20、API-21等等。

    // 默认配置
    defaultConfig {
        minSdkVersion config.minSdkVersion // 最小sdk版本, 如果设备小于这个版本或者大于maxSdkVersion将无法安装这个应用
        targetSdkVersion config.targetSdkVersion // 目标sdk版本
        versionCode config.versionCode // 版本号
        versionName config.versionName // 版本名称

        archivesBaseName = "test-$versionName"  // 指定打包成Jar文件时候的文件名称

        // 当方法数超过65535(方法的索引使用的是一个short值,而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex
        multiDexEnabled true

        ndk {
            moduleName "tttt"  // 设置库(so)文件名称
            ldLibs "log", "z", "m", "jnigraphics", "android"
            //设置支持的SO库架构
            //'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
            // 注:放开'arm64-v8a'会找不到腾讯人脸识别的类库包,>=android7.0 手机会崩溃
            abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
            cFlags "-std=c++11 -fexceptions"  // C++11
            stl "gnustl_static"
        }

        // ARouter配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        // debug闭包指定生成测试版安装文件的配置
        debug {
            buildConfigField('String', 'SERVER_ADDRESS', "xxxx") // 配置同字段不同开发环境取不同的值
            // manifest占位符
            manifestPlaceholders = [
                    APP_NAME: "@string/app_name_xxxx",
            ]

            zipAlignEnabled true          // 是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
            shrinkResources true          // 移除无用的resource文件
            debuggable false              // 是否支持调试
            jniDebuggable false           // 关闭jni调试
            multiDexEnabled true          // 是否启动自动拆分多个dex的功能
            multiDexKeepProguard file('multidex-config.pro')

            minifyEnabled false // 是否开启混淆(上线)
            // proguardFiles 指定混淆的规则文件
            // proguard-android.txt 通用混淆规则
            // proguard-rules.pro 自定义混淆规则
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release            // 设置签名信息
        }
        release.initWith(buildTypes.debug)
        // release闭包指定生成正式版安装文件的配置
        release {
            minifyEnabled false // 是否开启混淆(上线)
            //shrinkResources true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8 // source使用的jdk版本
        targetCompatibility JavaVersion.VERSION_1_8 // 编译时使用的jdk版本或者更新的java虚拟机兼容
    }

    // DEX工具配置, multiDex的一些相关配置, 提升编译速度
    dexOptions {
        preDexLibraries = false     // 让它不要对Lib做preDexing
        incremental true            // 开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
        javaMaxHeapSize "4g"        // 增加java堆内存大小
        jumboMode = true
    }

    // 程序在编译的时候会检查lint, 有任何的错误或者警告提示, 都会终止构建, 我们可以将其关掉
    lintOptions {
        disable 'InvalidPackage'
        abortOnError false // 即使报错也不会停止打包
        checkReleaseBuilds false // 打包release版本的时候是否进行检测
        quiet true // true 关闭lint报告的分析进度
        abortOnError false // true 错误发生后停止gradle构建
        ignoreWarnings true // true 只报告error
        //absolutePaths true // true 忽略有错误的文件的全/绝对路径(默认是true)
        checkAllWarnings true // true 检查所有问题点,包含其他默认关闭项
        warningsAsErrors true // true 所有warning当做error
        disable 'TypographyFractions', 'TypographyQuotes' // 关闭指定问题检查
        enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled' // 打开指定问题检查
        check 'NewApi', 'InlinedApi' // 仅检查指定问题
        noLines true // true error输出文件不包含源码行号
        showAll true // true 显示错误的所有发生位置,不截取
        lintConfig file("default-lint.xml") // 回退lint设置(默认规则)
        textReport true // true 生成txt格式报告(默认false)
        textOutput 'stdout' // 重定向输出, 可以是文件或'stdout'
        xmlReport false // true 生成XML格式报告
        xmlOutput file("lint-report.xml") // 指定xml报告文档(默认lint-results.xml)
        htmlReport true // true 生成HTML报告(带问题解释,源码位置,等)
        htmlOutput file("lint-report.html") // html报告可选路径(构建器默认是lint-results.html )
        checkReleaseBuilds true // true 所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
        fatal 'NewApi', 'InlineApi' // 在发布版本编译时检查(即使不包含**重点内容**lint目标),指定问题的规则生成崩溃
        error 'Wakelock', 'TextViewEdits' // 指定问题的规则生成错误
        warning 'ResourceAsColor' // 指定问题的规则生成警告
        ignore 'TypographyQuotes' // 忽略指定问题的规则(同关闭检查)
    }

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

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

        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'org/bouncycastle/x509/CertPathReviewerMessages_de.properties'
        exclude 'org/bouncycastle/x509/CertPathReviewerMessages.properties'
    }

    // 签名配置
    signingConfigs {
        release { // release签名配置
            storeFile file("xxxx.keystore") // 密钥文件路径
            storePassword "123456" // 密钥文件密码
            keyAlias "xxxx" // key别名
            keyPassword "123456" // key密码
        }
        debug { // debug签名配置
            storeFile file("xxxx.keystore")
            storePassword "123456"
            keyAlias "xxxx"
            keyPassword "123456"
        }
    }

    // 配置目录指向,默认的一些文件路径的配置
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'         // 指定AndroidManifest文件
            java.srcDirs = ['src']                         // 指定source目录
            resources.srcDirs = ['src']                    // 指定source目录
            aidl.srcDirs = ['src']                         // 指定source目录
            renderscript.srcDirs = ['src']                 // 指定source目录
            res.srcDirs = ['res']                          // 指定资源目录
            assets.srcDirs = ['assets']                    // 指定assets目录
            jniLibs.srcDirs = ['libs']                     // 指定lib库目录
        }
        debug.setRoot('build-types/debug')                 // 指定debug模式的路径
        release.setRoot('build-types/release')             // 指定release模式的路径
    }

    // 自动追加版本号和版本名称
    android.libraryVariants.all { variant ->
        variant.outputs.all { output ->
            if (output.outputFile != null
                    && output.outputFile.name.endsWith('.aar')
                    && output.outputFile.size() != 0) {
                def fileName = String.format("%s_v%s_%s_%s.aar", getProductName(), defaultConfig.versionName, rootProject.ext.common.packageTime, variant.buildType.name)
                outputFileName = fileName
            }
        }
        variant.assemble.doLast {
            if (variant.buildType.name.contains('release')) {
                def path = null
                variant.outputs.each { output ->
                    path = output.outputFile
                    if (output.outputFile != null
                            && output.outputFile.name.endsWith('.aar')
                            && output.outputFile.size() != 0) {
                        copy { // 每次导出aar后 拷贝一份到指定目录 作为备份  防止项目clean后找不到对应版本的aar
                            from output.outputFile
                            into rootProject.ext.common.AARBackupDir
                        }
                    }
                }
                if (path != null) {
                    if (System.properties['os.name'].toLowerCase().contains('mac os x')) {
                        ['open', '-R', path].execute()
                    } else if (System.properties['os.name'].toLowerCase().contains('windows')) {
                        ['explorer', '/select,', path].execute()
                    }
                }
            }
        }
    }
}

tasks.withType(JavaCompile) {
    // 在 Gradle 4.10 版本之后便默认使用了增量编译
    // 如果在更老的版本需要启动增量编译,可以使用如下配置:
    options.incremental = true
    // 解决java控制台输出中文乱码
    options.encoding = "UTF-8"
}

// 指定当前项目的所有依赖关系 一共又三种依赖方式:本地依赖, 库依赖, 远程依赖
// 本地依赖:可以对本地 Jar 包或目录添加依赖关系
// 库依赖:可以对项目中的库模块添加依赖关系
// 远程依赖:可以对 jcenter 库上的开源项目添加依赖
// 标准的远程依赖格式是 域名:组织名:版本号
// implementation implementation依赖的库只能自己库本身访问
// api 使用该方式依赖的库将会参与编译和打包, 依赖传递
// compileOnly 只在编译的时候有效, 不参与打包
// runtimeOnly 只在打包的时候有效, 编译不参与
dependencies {
    compileOnly files('libs/lib_unity/classes.jar')
    //implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0' // 远程依赖声明

    compileOnly fileTree(exclude: ['android-support*.jar'], include: ['*.jar'], dir: 'libs')
    // 本地依赖声明, 表示将libs目录下所有.jar后缀的文件都添加到项目构建路径中
    //implementation files('libs/soeasysdk_20181025.jar')
    //implementation files('libs/libPluginProtocolForUnity_fat.jar')
}

你可能感兴趣的:(Unity自动打包-Android Studio - build.gradle详解)