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

Chapter2:Android下Gradle的基本自定义构建

程序员文章站 2022-07-14 22:02:50
...

Chapter2:Gradle基本自定义构建

2.1 Gradle文件结构

Chapter2:Android下Gradle的基本自定义构建

  • settings.gradle:该文件在初始化阶段被执行,定义了哪些模块应该包含在构件内。对于只包含一个Android应用的新项目,文件内容为 include ‘:app’。单模块项目并不需要该文件,多模块项目必须定义该文件。

  • 顶层build.gradle

    //实际构建代码块
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.4.2'
        }
    }
    
    
    allprojects {
        repositories {
            jcenter()  
        }
    }
    
    • repositories代码块:将jcenter配置成一个仓库。
    • dependencies代码块:配置构建过程中的依赖包(不能讲应用或依赖项目所需的依赖包包含在顶层构建文件中)。默认之定义了一个依赖包:Gradle的Android插件(每个Android模块都需要有Android插件)。
    • allprojects代码块:声明需要被用于所有模块的属性。(甚至可以创建任务,该任务会被运用到所有模块;使用了allprojects会使模块耦合到项目,导致没有主项目构建稳健情况下,无法独立建构模块,会影响分类内部依赖库的操作。)
  • 模块层build.gradle

    //代码节选
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        buildToolsVersion '28.0.3'
        
        defaultConfig {
            applicationId "com.virtual.learn191024"
            minSdkVersion 24
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'androidx.appcompat:appcompat:1.1.0'
    }
    
    • 模块层build.gradle文件的属性只能应用在该模块,可以覆盖顶层build.gradle文件定义的属性。

    • apply plugin:使用Android应用插件。(使用该插件后便可以使用android代码块中的特有配置。)

    • android代码块:包含Android特有配置,必须配置的属性有:

      • compileSdkVersion :编译应用的 Android API 版本。
      • buildToolsVersion :构建工具和编译器使用的版本号。
    • defaultConfig代码块:配置应用的核心属性。可以覆盖AndroidManifest.xml文件中对应的条目。

      • applicationId:Google Play 唯一标识。
      • minSdkVersion:运行应用最小API级别。
      • targetSdkVersion:通知系统已在特定Android版本通过测试,不必启动向前兼容的行为。
      • versionCode:版本号
      • versionName:友好的版本名称
    • dependencies代码块:依赖代码块。

2.2 任务入门

  • 命令 $ gradle tasks:打印出所有可用的任务。

  • 命令 $ gradle tasks --all:打印出所有可用的任务,并显示它们之间的依赖。

  • 补充参数:-m或**–dry-run** 试运行。

  • Gradle的Android插件使用了Java基础插件;Java基础插件使用了基础插件。基础插件添加了任务的标准生命周期和一些共同约定的属性。基础插件定义了assemnleclean任务;Java插件定义了checkbuildtasks。在基础插件中,任务不被实现和执行操作,而是被用来定义插件之间的约定。

    • assemble:集合项目的输出。
    • clean:清理项目的输出。
    • check:运行所有的检查,通常是单元测试和集成测试。
    • build:同时运行assemble和check。
  • Android任务:Android插件扩展了基本任务,并实现了它们的行为。

    • assemble:为每个构建版本创建一个APK。
    • clean:删除所有的构建内容,比如APK文件。
    • check:运行Lint检查,Lint发现问题后终止构建。
    • build:同时运行assemble和check。

    assemble任务依赖于assembleDebug和assembleRelease(也可能包含更多构件类型),assemble将处罚所有依赖的构件类型进行构建操作。

  • Android插件一些新的任务

    • connectedCheck:在连接设备或模拟器上运行测试。
    • deviceCheck:一个占位任务,为其他插件在远端设备上运行测试。
    • installDebuginstallRelease:在连接的设备或模拟器上安装特定版本。
    • 所有的installtasks都会有相关的uninstall任务。
  • 构建任务依赖于check而非connectedCheck或deviceCheck。

  • 运行check任务会生成一份Lint报告,Lint报告会包含所有的警告和错误,以及一份详细的说明和一个相关文档的连接。存储在**app/build/reports/**文件夹下。

2.3 自定义构建

  • 补充一些通过构建配置的属性:

    • testApplicationId:针对instrument测试APK的applicationId。
    • testInstrumentationRunner:JUnit测试运行器的名称,被用来运行测试。
    • signingConfig
    • proguardFile/proguardFiles
  • BuildConfig和资源

    • Gradle可以通过 buildConfigField 扩展 BuildConfig生成类,通过 resValue 扩展资源文件。可以在Debug和Release使用不同的值。

      //代码节选
      debug{
          buildConfigField("boolean","mBollean","true")
          resValue("string","mString","test1")
      }
      release {
          buildConfigField("boolean","mBollean","false")
          resValue("string","mString","test2")
      }
      
  • 项目范围的设置

    • 若所有模块都是Android app项目时,可以将一些通用配置加到顶层build.gradle的allprojects代码块中:

      allprojects{
          apply plugin: 'com.android.application'
          android{
              compileSdkVersion 28
              buildToolsVersion '28.0.3'
          }
      }
      
    • Gradle允许在 Projet 对象上添加额外属性。通过ext代码块实现:

      //顶层build.gradle 最下面添加(注意有个等号)
      ext {
          compileSdkVersion = 28
          buildToolsVersion =  '28.0.3'
      }
      

      在模块层构建文件可以使用rootProject来获取属性:

      //代码节选 (注意没有等号)
      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion rootProject.ext.compileSdkVersion
          buildToolsVersion rootProject.ext.buildToolsVersion
          
          ···
      
  • 项目属性:(三种常用定义方法)

    • 1.ext 代码块

      ext {
          info = "abc"
      }
      
    • 2.gradle.properties 文件

      info = abc
      
    • 3.-P命令行参数

      • 首先创建一个任务:

        //任务的名字叫printProperties。
        //project.hasProperty("info")会返回boolean值,代表是否有info属性。
        //如果有就打印出info属性的值。
        task printProperties {
            if(project.hasProperty("info")){
                println(info)
            }
        }
        
      • 执行命令:(gradle + 任务名+参数)

        //-P为设置参数,后面紧随参数名,通过'='号赋参数值。
        $ gradle printProperties -Pinfo="Hello"
        

        结果:
        Chapter2:Android下Gradle的基本自定义构建

  • 默认任务

    • 在顶层build.gradle中添加:

      defaultTasks("clean","assembleDebug")
      
    • 使用命令查看:

      //Windows
      $ gradle task | findstr "Default tasks"
      
      //Mac or Linux
      $ gradlew task | grep "Default tasks"
      

2.4 加快Gradle 编译速度

  • Windos系统下增大Gradle的JVM内存分配。在 C:\Users\用户名\.gradle\ 目录下新建gradle.properties文件。文件内容:

    org.gradle.daemon=true
    org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    org.gradle.parallel=true
    org.gradle.configureondemand=true
    

2.5 参考资料

  • Gradle For Android
相关标签: Gradle Android