Android Gradle 使用指南(收藏向)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/afei__/article/details/87958681

前言

目前 Android 的开发大都使用 Android Studio 了,而 Android Studio 所使用的 Gradle 也是大有文章,其中有许多可以定制和使用的技巧。

Gradle 的语法是使用的 Groovy 语言,这里不做详细介绍了。

下面是我总结的一些常用的选项以及释义:

apply plugin: 'com.android.application'

android {

    compileSdkVersion 27 // 编译代码使用的Android版本
    buildToolsVersion '27.0.3' // 使用的编译工具的版本

    // 指定使用的库,例如org.apache.http.legacy是一个HttpClient的库,在23以上的系统使用HttpClient就可以加上这个
    useLibrary 'org.apache.http.legacy'

    // 1.定义所有公共的默认配置,其本质是一个ProductFlavor
    defaultConfig {
        applicationId "com.afei.myapplication" // 指定APP包名,默认为null,此时会从AndroidManifest.xml文件中读取
        minSdkVersion 23 // APP最低支持的Android版本
        targetSdkVersion 27 // APP的目标Android版本,通常填写目前最新的Android版本
        versionCode 1 // APP版本号,没有配置时会从AndroidManifest.xml文件中读取
        versionName "1.0" // APP版本名称,没有配置时会从AndroidManifest.xml文件中读取
        resConfigs "zh", "xxhdpi" // 配置那些类型的资源被打包到apk中
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // 配置单元测试使用的Runner
        // manifest占位符,可动态配置AndroidManifest.xml文件,通过${CHANNEL}取得该值
        manifestPlaceholders.put("CHANNEL", "google")
        // 自定义BuildConfig,在代码中通过BuildConfig.URL获取该值
        buildConfigField 'String', 'URL', '"http://www.google.com"'

        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a' // 配置生成的so文件包含的平台架构
        }
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions" // 通常不在这里配置 cppFlags 了
                // 使用下面这种语法向变量传递参数:
                // arguments "-D变量名=参数".
                arguments "-DANDROID_ARM_NEON=TRUE",
                        // 使用下面这种语法向变量传递多个参数(参数之间使用空格隔开):
                        // arguments "-D变量名=参数1 参数2"
                        "-DANDROID_CPP_FEATURES=rtti exceptions"
            }
        }
    }

    // 2.APP签名配置
    signingConfigs {
        // release包的签名配置
        release {
            storeFile file("releasekey.jks") // 传入JKS文件路径
            storePassword "password" // 公钥
            keyAlias "afei" // 私钥名
            keyPassword "123456" // 私钥密码
        }
        // debug包的签名配置
        debug {
            // 同上。可以不配置,默认使用的是 $HOME/.android/debug.jks
        }
    }

    // 3.构建类型,内置有debug和release两种
    buildTypes {
        // release包的构建配置
        release {
            signingConfig signingConfigs.release // 指定使用上述signingConfigs中的release包的签名配置
            minifyEnabled true // 是否混淆,release一般开启
            proguardFile 'proguard-rules.pro' // 指定单个混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 指定多个混淆文件
            multiDexEnabled false // 是否拆分为多个dex,当方法数超过65535时需要开启
            zipAlignEnabled true // 是否整理优化apk,能提高运行效率,更快的读写apk的资源,默认开启
            shrinkResources true // 是否自动清理未使用的资源文件,默认为false

        }
        // debug包的签名配置
        debug {
            signingConfig signingConfigs.debug // 指定使用上述signingConfigs中的debug包的签名配置
            applicationIdSuffix ".debug" // 配置包名的后缀,例如包名会变成com.afei.myapplication.debug,一般不使用
            debuggable true // 配置是否生成一个可供调试的apk
            minifyEnabled false // 是否混淆,debug一般关闭
        }
        jnidebug {
            initWith debug // 复制debug的配置
            applicationIdSuffix ".jnidebug"
            jniDebuggable true // 配置是否生成一个可供调试JNI代码的apk
        }
    }

    // 4. 配置生成的apk文件名,all表示所有的
    applicationVariants.all { variant ->
        variant.outputs.all {
            // 注意这里buildTime()方法是我们下面自定义的一个获取时间的方法,例如MyApplication_v1.0_20190225_debug.apk
            outputFileName = "MyApplication_v${defaultConfig.versionName}_${buildTime()}_${variant.buildType.name}.apk"
        }
    }

    // 6. Java编译选项,例如要使用Java1.8的新特性(例如lambda表达式)需要加上如下声明
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    // 7. adb配置
    adbOptions {
        timeOutInMs = 5*1000 // 设置超时时间
        installOptions '-r','-t','-g' // 设置adb install的安装选项
        // -l 锁定该应用
        // -r 替换已存在的应用
        // -t 允许测试包
        // -s 把应用安装在SD卡上
        // -d 允许降级安装
        // -g 给应用授予所有运行时的权限
    }

    // 8. dex配置
    dexOptions {
        javaMaxHeapSize '2g' // 执行dx命令为其分配的最大堆内存,用于解决执行dx时内存不够的情况
        jumboMode true // 默认为false,当方法超过65535时,需要开启jumboMode才可以构建成功
        threadCount 2 // 配置gradle运行dx命令使用的线程数量
    }

    // 9. lint配置
    lintOptions {
        abortOnError false // lint发现错误时是否停止构建,默认true
        absolutePaths true // 配置错误的输出里是否显示绝对路径,默认true
        check 'NewApi', 'Override' // 配置哪些项目需要lint检查,可通过lint --list查看有哪些选项
        checkAllWarnings false // 是否检查所有警告的issue,包括默认关闭的issue,默认false
        checkReleaseBuilds true // 配置在release构建中lint是否检查致命的错误,默认true
        ignoreWarnings true // 是否忽略警告级别的检查,默认false
        noLines true // error输出是否包含源代码的行号
        quiet false // 是否开启安静模式,安静模型下分析进度和信息将不会显示
        showAll true // 是否显示所有输出,并且不会对过长的消息进行截断
        warningsAsErrors false // 是否把警告当作错误处理
    }

    // 10. Native构建配置
    externalNativeBuild {
        // cmake构建配置
        cmake {
            path "CMakeLists.txt" // CMakeLists.txt文件路径
        }
    }

    // 11. 源代码集合
    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/aidl']
        }
    }

}

// 自定义获取指定格式时间字符串的方法
def buildTime() {
    def date = new Date()
    def formattedDate = date.format("yyyMMdd")
    return formattedDate
}

// 依赖
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
}

最后,官方介绍文档为:https://developer.android.com/studio/build

其中也有许多我没介绍到的地方值得参考。

猜你喜欢

转载自blog.csdn.net/afei__/article/details/87958681