欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android Gradle 使用指南(收藏向)

程序员文章站 2022-04-29 15:11:41
...

前言

目前 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

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

相关标签: gradle