Android build.gradle 基本规则

发布时间 2023-08-08 16:41:17作者: 汪氵淼

Android build.gradle 基本规则

一个完整示例:

// 此乃本脚本执行所需依赖, 以下分别对应maven库和插件
buildscript {
    repositories {
        // 从Android Studio3.0后新增了google()配置,可以引用google上的开源项目
        google()
        mavenCentral()
        // 一个类似于github的代码托管仓库,声明了jcenter()配置,可以轻松引用 jcenter上的开源项目
        jcenter() 
    }
    dependencies {
        //此处是android的插件gradle,gradle是一个强大的项目构建工具
        classpath 'com.android.tools.build:gradle:7.2.1'
    }
}

// 此乃声明自身是 Android 程序
// 其中 com.android.application 标识应用模块,可直接运行,打包后对应 .apk 文件
//      com.android.library 标识库模块,打包后对应 .aar 文件
apply plugin: 'com.android.application'

// 此乃配置本 android 项目构建所需的各种属性
android {
  // 此乃设置编译时用的Android API版本
  compileSdkVersion 27
  
  // 基础配置
  defaultConfig {
      applicationId "com.billy.myapplication" // 项目包名
      minSdkVersion 16                        // 项目最低兼容的版本
      targetSdkVersion 27                     // 项目的目标版本
      versionCode 1                           // 版本号
      versionName "1.0"                       // 版本名称
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
                                              // 表明要使用AndroidJUnitRunner进行单元测试
  }

  // 此乃静态检查配置, 默认有任何错误提示会停止build
  lintOptions {
    // 即使报错也不停止打包
    abortOnError false
    // 打包release版本时进行检测
    checkReleaseBuilds false
  }

  buildTypes {
    release {
      // 配置Log日志
      buildConfigField("boolean", "LOG_DEBUG", "false")//配置Log日志
      // 配置URL前缀
      buildConfigField("String", "URL_PERFIX", ""https://release.cn/"")
      // 是否混淆
      minifyEnabled false
      // 指定混淆规则文件
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      // 设置签名信息
      signingConfig signingConfigs.release
      // 是否在APK中生成伪语言环境,帮助国际化的东西,一般使用的不多
      pseudoLocalesEnabled false
      // 是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
      zipAlignEnabled true
      // 在applicationId 中添加了一个后缀,一般使用的不多
      applicationIdSuffix 'test'
      // //在versionName 中添加了一个后缀,一般使用的不多
      versionNameSuffix 'test'
    }
    debug { // 内容同上
      // 是否支持断点调试
      debuggable false
      // 是否可以调试NDK代码
      jniDebuggable false
      // 是否开启渲染脚本就是一些c写的渲染方法
      renderscriptDebuggable false
    }
  }

  // 此乃签名的配置
  signingConfigs {
      // 线上/发布/生产
      release {
        keyAlias 'test'
        keyPassword '123456'
        storeFile file('test.keystore')
        storePassword '123456'
      }
      // 开发/调试/测试
      debug {} // 内容同上
  }

  // 此乃目录指向的配置
  sourceSets {
    main {
      // 指定lib库目录
      jniLibs.srcDirs = ['libs']
    }
  }

  // 此乃打包时的相关配置
  packagingOptions{
    // 作用: 当有重复文件时,打包过程会报错,当配置了该字段时打包过程就将打包第一个匹配的文件。
    // 以下示例表示当META-INF目录下有重复的LICENSE文件时 只用第一个,打包过程不报错。
    pickFirsts = ['META-INF/LICENSE']

    // 作用: 当出现重复文件时,合并重复的文件并打包进应用
    // 默认值 merges = []
    merge 'META-INF/LICENSE'
  }

  productFlavors {
      wandoujia {}
      xiaomi {}
      _360 {}
  }

  productFlavors.all {
    // 批量修改,类似一个循序遍历
    flavor -> flavor.manifestPlaceholders = [IFLYTEK_CHANNEL: name]
  }
}
// 此乃本项目所需依赖,如maven库
allprojects {
  repositories {
      google()
      mavenCentral()
      flatDir{
          dirs 'src/main/libs', 'libs'
      }
  }

  // 此乃描述本项目的依赖关系
  dependencies {
    // 此乃声明本地的jar包依赖
    implementation fileTree(dir: 'src/main/libs', include: ['*.jar'])
    // 此乃声明远程的依赖
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    // 此乃声明测试用例的依赖
    testImplementation 'junit:junit:4.12'
    // 此乃声明测试用例需要的库
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  }
}

// 此乃执行 gradle clean 时将会执行的 task
// 该任务继承自 Delete,将删除根目录中的build目录。
// 相当于执行 Delete.delete(rootProject.buildDir)。
// gradle使用groovy语言,调用method时可以不用加()。
task clean(type: Delete) {
    delete rootProject.buildDir
}