Gradle 学习记录


Gradle官方介绍
Android Gradle 插件版本

命令

  • 查看gradle版本gradlew -v
  • 查看taskgradle help --task

  • 查看项目接口gradle -q projects

Android SDK VERSION CODE

Android Studio gradle

mirror#

  • gradle wrapper: distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip
  • repo : init.gradle.kts

viewBinding#

    buildFeatures {
        viewBinding = true
        dataBinding = true
        compose = true
    }

aar#

    repositories {
        google()
        mavenCentral()
        flatDir {
            dirs 'libs'
        }
    }

    implementation(name: 'aar-name', ext: 'aar')
    //全部依赖
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

manifest&buildFieldConfig#

android {
  // For settings specific to a product flavor, configure these properties
  // for each flavor in the productFlavors block.
  defaultConfig {
    // Creates a property for the FileProvider authority.
    def filesAuthorityValue = applicationId + ".files"
    // Creates a placeholder property to use in the manifest.
    manifestPlaceholders =
      [filesAuthority: filesAuthorityValue]
      // Adds a new field for the authority to the BuildConfig class.
      buildConfigField("String",
                       "FILES_AUTHORITY",
                       "\"${filesAuthorityValue}\"")
  }
  ...
}
...

methods#

buildConfigStringField("CODE_BRANCH" to execCommand("git branch --show-current"))
buildConfigStringField("CODE_COMMIT" to execCommand("git rev-parse --short HEAD"))
buildConfigStringField("BUILD_TIME" to getCurrentTime())
fun execCommand(cmd: String, params: List<String> = emptyList()): String {
    return try {
        val sb = StringBuilder()
        val process = if (params.isEmpty()) {
            Runtime.getRuntime().exec(cmd)
        } else {
            Runtime.getRuntime().exec(cmd, params.toTypedArray())
        }
        process.waitFor()
        val readText = process.inputStream.bufferedReader().readText()
        sb.append(readText)
        sb.toString().trim().replace("\r", "").replace("\n", "")
    } catch (e: Exception) {
        e.message ?: ""
    }
}
fun ApplicationDefaultConfig.buildConfigStringField(pair: Pair<String, String>) {
    buildConfigField("String", pair.first, "\"${pair.second}\"")
}

fun getCurrentTime(): String {
    val sdf = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss")
    return sdf.format(Date())
}

RepositoriesMode

Build was configured to prefer settings repositories over project repositories but repository 'Gradle Libs' was added by unknown code

gradle7.0后android studio会自动生成以下代码

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

这会导致其他模块不能声明repository包括依赖gradleApi(),build直接失败,可改成RepositoriesMode.PREFER_SETTINGS解决。

重命名

app

        applicationVariants.all {
            outputs.all {
                this as com.android.build.gradle.api.ApkVariantOutput
                val releaseTime = SimpleDateFormat("yyyyMMddHHmm", Locale.US).format(Date())
                outputFileName =
                    "$dirName/${rootProject.name}_${name}_${versionName}_${releaseTime}.apk"
            }
        }

library

  • kts
    libraryVariants.all {
        outputs.all {
            this as com.android.build.gradle.internal.api.BaseVariantOutputImpl
            outputFileName = "${project.name}-${this.name}-${version}.aar"
        }
    }
  • groovy
    libraryVariants.all { v ->
        outputs.all {
            outputFileName = "${project.name}-${v.name}-${project.version}.aar"
        }
    }

Task

从Android Library导出Jar#

    task exportJar(type: Copy) {
        def name = "record-aidl.jar"
        group("build")
        //删除存在的
        delete 'build/libs/$name'
        //设置拷贝的文件
        from('build/intermediates/aar_main_jar/release/')
        //打进jar包后的文件目录
        into('build/libs/')
        //将classes.jar放入build/libs/目录下
        //include ,exclude参数来设置过滤
        include('classes.jar')
        //重命名
        rename ('classes.jar', "$name")
    }
    exportJar.dependsOn(build)

Copy aar to root dir#

afterEvaluate {

    task copyAAR(type: Copy) {
        doFirst {
            new File(rootDir, "aar/sdk").listFiles().each {
                delete(it.absolutePath)
            }
            logger.lifecycle("-------clear aar/sdk")
        }
        def source = layout.buildDirectory.dir("outputs/aar").get().asFile
        from(source)
        include("*.aar")
        destinationDir = new File(rootDir, "aar/sdk")
    }
    preBuild.doFirst {
        new File(project.buildDir, "outputs/aar").listFiles().each {
            logger.lifecycle("delete-------${it.absolutePath}")
            delete(it.absolutePath)
        }
    }
//    preBuild.dependsOn(clean)
    assemble.finalizedBy(copyAAR)
}

Maven

mavenLocal路径:C:\Users\userName.m2\repository
maven发布

plugins {
    id("com.android.library")
    kotlin("android")
    id("maven-publish")
}

group = "io.github.eldenmango"
version = "1.0.0"

afterEvaluate {
    publishing {
        repositories {
           
        }
        publications {
            create("release", MavenPublication::class.java) {
                from(components["debug"])
                groupId = "$group"
                artifactId = "lib-device-info"
                this.version = "${project.version}"
            }
        }
    }
}

其他

  • Android Studio远程库存放目录C:\Users\USERNAME.gradle\caches\modules-2\files-2.1

作者:徐影魔

出处:https://www.cnblogs.com/xunevermore/p/15931059.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   徐影魔  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示