赞
踩
Android Plugin DSL 就是 Google 为了开发 Android 应用定制了一个插件,具体的插件配置请查阅官方文档。
新建一个 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' // ... }
所有的配置都可以在上面官方文档中找到。
我们来通过 Apk 打包的过程来看一下 Gradle 在 Android Studio 中都做了哪些工作。
下图是谷歌官网给出的一个典型的 Apk 构建的过程,主要包括两个过程。首先是编译过程,编译的内容包括本工程的文件以及依赖的各种库文件,编译的输出包括 dex 文件和编译后的资源文件。然后是打包过程,配合 Keystore 对第一步的输出进行签名对齐,生成最终的 Apk 文件。
下面这张图对上面的步骤以及每步用到的工具进行了细分,概括如下:
.class
文件。.class
文件和依赖的三方库文件通过 dex 工具生成 Delvik 虚拟机可执行的 .dex
文件,可能有一个或多个,包含了所有的 class 信息,包括项目自身的 class 和依赖的 class。产出为 .dex
文件。.dex
文件和编译后的资源文件生成未经签名对齐的 Apk 文件。这里编译后的资源文件包括两部分,一是由 aapt 编译产生的编译后的资源文件,二是依赖的三方库里的资源文件。产出为未经签名的 .apk
文件。Android 工程通过 Gradle 文件管理各项配置,Gradle 文件利用 DSL(Domain Specific Language)语言描述配置,并使用 Groovy 语言处理编译逻辑。
在这里 Gradle 文件分布在几个不同的层级,Project 层级以及 Module 层级。
Project 层级的 settings.gradle
描述的是该 Project 包含哪些 Module。
include ':app', ':lib'
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 }
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' // ... }
这是我博客长期更新的项目,欢迎大家 Star。
https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode
欢迎你「扫一扫」下面的二维码,关注我的公众号,可以接受最新的文章推送,有丰厚的抽奖活动和福利等着你哦!?
如果你有什么疑问或者问题,可以 点击这里 提交 issue,也可以发邮件给我 jeanboy@foxmail.com。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。