Gradle - Android Plugin DSL

Android Plugin DSL

Gradle 系列

  1. Gradle - 简介
  2. Gradle - Groovy Language
  3. Gradle - DSL
  4. Gradle - Android Plugin DSL
  5. Gradle - 插件开发
  6. Gradle - 插件发布

简介

Android Plugin DSL 就是 Google 为了开发 Android 应用定制了一个插件,具体的插件配置请查阅官方文档。

  • Android Plugin DSL Reference - 官方文档

新建一个 Android 项目,可以看到 project/app/build.gradle 文件中的内容类似如下:

// 使用 Android app 插件
apply plugin: 'com.android.application'
// app 插件中的配置
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.jeanboy.app.gradleplugintest"
        minSdkVersion 21
        // ...
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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

所有的配置都可以在上面官方文档中找到。
Gradle - Android Plugin DSL_第1张图片

打包过程

我们来通过 Apk 打包的过程来看一下 Gradle 在 Android Studio 中都做了哪些工作。

下图是谷歌官网给出的一个典型的 Apk 构建的过程,主要包括两个过程。首先是编译过程,编译的内容包括本工程的文件以及依赖的各种库文件,编译的输出包括 dex 文件和编译后的资源文件。然后是打包过程,配合 Keystore 对第一步的输出进行签名对齐,生成最终的 Apk 文件。

Gradle - Android Plugin DSL_第2张图片

下面这张图对上面的步骤以及每步用到的工具进行了细分,概括如下:

  1. Java 编译器对工程本身的 Java 代码进行编译,这些 Java 代码有三个来源:App 的源代码,由资源文件生成的 R 文件(aapt 工具),以及有 aidl 文件生成的 Java 接口文件(aidl 工具)。产出为 .class 文件。
  2. .class 文件和依赖的三方库文件通过 dex 工具生成 Delvik 虚拟机可执行的 .dex 文件,可能有一个或多个,包含了所有的 class 信息,包括项目自身的 class 和依赖的 class。产出为 .dex 文件。
  3. apkbuilder 工具将 .dex 文件和编译后的资源文件生成未经签名对齐的 Apk 文件。这里编译后的资源文件包括两部分,一是由 aapt 编译产生的编译后的资源文件,二是依赖的三方库里的资源文件。产出为未经签名的 .apk 文件。
  4. 分别由 Jarsigner 和 zipalign 对 Apk 文件进行签名和对齐,生成最终的 Apk 文件。

Gradle - Android Plugin DSL_第3张图片

Gradle 目录结构

Android 工程通过 Gradle 文件管理各项配置,Gradle 文件利用 DSL(Domain Specific Language)语言描述配置,并使用 Groovy 语言处理编译逻辑。

Gradle - Android Plugin DSL_第4张图片

在这里 Gradle 文件分布在几个不同的层级,Project 层级以及 Module 层级。

  1. Project 层级的 settings.gradle 描述的是该 Project 包含哪些 Module。

    include ':app', ':lib'
    
  2. Project 层级的 build.gradle 描述的是作用于所有 Module 的配置,包括 Gradle 版本等。

    buildscript {
        repositories {
            jcenter()
        }
        
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
  3. Module 层级的 build.gradle。每个 Module 下都有一个作用于该 Module 的 build.gradle 文件,描述了该 Module 相关的配置。这些配置主要包括:BuildTypes,ProductFlavors,Dependency,SigningSettings 等。

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.jeanboy.app.gradleplugintest"
            minSdkVersion 21
            // ...
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:27.1.1'
        // ...
    }
    

其他系列

  • Android 屏幕适配全攻略
  • Windows 环境下载 Android 源码
  • Android 性能优化-UI优化
  • Android 性能优化-内存优化
  • Java 虚拟机内存分配机制
  • Java 虚拟机垃圾回收机制
  • 一篇文章看明白 TCP/IP,TCP,UDP,IP,Socket 之间的关系
  • 一篇文章看明白 HTTP,HTTPS,SSL/TSL 之间的关系
  • 一篇文章看明白 Android 系统启动时都干了什么
  • 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
  • 一篇文章看明白 Android 从点击应用图标到界面显示的过程
  • 一篇文章看明白 Activity 与 Window 与 View 之间的关系
  • 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
  • 一篇文章看明白 Android Service 启动过程
  • 一篇文章看明白 Android PackageManagerService 工作流程
  • 一篇文章看明白 Android v1 & v2 签名机制

更多文章:

这是我博客长期更新的项目,欢迎大家 Star。
https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode

我的公众号

欢迎你「扫一扫」下面的二维码,关注我的公众号,可以接受最新的文章推送,有丰厚的抽奖活动和福利等着你哦!?

如果你有什么疑问或者问题,可以 点击这里 提交 issue,也可以发邮件给我 [email protected]

同时欢迎你 Android技术进阶:386463747 来一起交流学习,群里有很多大牛和学习资料,相信一定能帮助到你!

你可能感兴趣的:(Gradle,Gradle,系列)