今天我给大家带来的是Android Gradle系列文章的开篇;
现创建了一个Android开发水友圈,圈内会不定时更新一些Android中高级的进阶资料,欢迎大家带着技术问题来讨论,共同成长进步!(包含资深UI工程师,Android底层开发工程师,Android架构师,原生性能优化及混合优化,flutter专精);希望有技术的大佬加入,水圈内解决的问题越多获得的权利越大!
1.什么是Gradle的Android插件
我们知道Gradle有很多插件,为了支持Android项目的构建,谷歌为Gradle编写了Android插件,新的Android构建系统就是由Gradle的Android插件组成的,Gradle是一个高级构建工具包,它管理依赖项并允许开发者自定义构建逻辑。Android Studio使用Gradle wrapper来集成Gradle的Android插件。需要注意的是,Gradle的Android插件也可以独立于AndroidStudio运行。
在 Android的官方网站提到了新的Android构建系统主要有以下几个特点:代码和资源易于重用
无论是针对多个apk发行版还是针对不同风格的应用程序,都可以很容易创建应用程序的多个不同版本。
易于配置、扩展和自定义构建过程
良好的IDE集成
Gradle的Android插件结合Android Studio成为了目前最为流行的Android构建系统。
2. Android Studio的模块类型和项目视图
Android Studio中的每个项目包含一个或多个含有源代码文件和资源文件的模块,这些模块可以独立构建、测试或调试,一个Android Studio的模块类型可以有以下几种:
Android应用程序模块
Android应用程序模块可能依赖于库模块,尽管许多Android应用程序只包含一个应用程序模块,构建系统会将其生成一个APK。
Android 库模块Android库模块包含可重用的特定于Android的代码和资源,构建系统会将其生成一个AAR。
App 引擎模块包含应用程序引擎集成的代码和资源。
Java 库模块包含可重用的代码,构建系统会将其生成一个JAR包。
Android Studio3.3.2 中的Android项目视图如下所示。
所有构建文件在 Gradle Scripts 层级下显示,大概介绍下这些文件的用处。项目build.gradle:配置项目的整体属性,比如指定使用的代码仓库、依赖的Gradle插件版本等等。
模块build.gradle:配置当前Module的编译参数。
gradle-wrapper.properites:配置Gradle Wrapper,可以查看Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper这篇文章。
gradle.properties:配置Gradle的编译参数。具体配置见Gradle官方文档
settings.gradle:配置Gradle的多项目管理。
local.properties:一般用来存放该Android项目的私有属性配置,比如Android项目的SDK路径。
这篇文章主要介绍项目build.gradle和模块build.gradle。
3.项目build.gradle
我们新建一个Android项目,它的项目build.gradle的内容如下:buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2' //1
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
注释1处配置依赖的Gradle插件版本,Gradle插件属于第三方插件,因此这里在buildscrip块中配置谷歌的Maven库和JCenter库,这样Gradle系统才能找到对应的Gradle插件。
如果使用google()报not found: 'google()'错误,可以用如下代码替代:maven { url 'https://maven.google.com' }
如果你还不理解Gradle插件,私信我进圈
4.模块build.gradle
新建一个Android项目,它的模块build.gradle的内容如下:apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
}
4.1 Gradle的Android插件类型
apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:应用程序插件,插件id为com.android.application,会生成一个APK。
库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。
测试插件,插件id为com.android.test,用于测试其他的模块。
feature插件,插件id为com.android.feature,创建Android Instant App时需要用到的插件。
Instant App插件,插件id为com.android.instantapp,是Android Instant App的入口。
4.2 Android块
Android块用于描述该Module构建过程中所用到的所有参数。compileSdkVersion:配置编译该模块的SDK版本
buildToolsVersion:Android构建工具的版本
4.2.1 defaultConfig块
Android块中的defaultConfig块用于默认配置,常用的配置如下所示。
buildTypes块用于配置构建不同类型的APK。4.2.2 buildTypes块
当我们新建一个项目时,在Android块已经默认配置了 buildTypes块:buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
在AS的Terminal中执行gradlew.bat build命令,会在该模块的build/outputs/apk目录中生成release和debug的APK,虽然只配置了release ,但release和debug是默认配置,即使我们不配置也会生成。也可以修改默认的release和debug,甚至可以自定义构建类型,比如:buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
privitedebug{
applicationIdSuffix ""
}
}
这时会在build/outputs/apk目录中生成release、debug、privitedebug的APK。
buildTypes块还可以配置很多属性,常用的配置如下所示。
4.2.3 signingConfigs块
用于配置签名设置,一般用来配置release模式。
signingConfigs {
release {
storeFile file('C:/Users/liuwangshu/.android/release.keystore')
storePassword 'android'
keyAlias 'androidreleasekey'
keyPassword 'android'
}
4.2.4 其他配置块
android块中除了前面讲的defaultConfig块、buildTypes块、signingConfigs块还有其他的配置块,这里列举一些。
更多的配置块请参考官方文档。
4.2.4 全局配置
如果有多个module的配置是一样的,可以将这些配置提取出来,也就是使用全局配置。全局配置有多种方式,这里介绍其中的两种。1. 使用ext块配置
在项目build.gradle中使用ext块,如下所示。ext{
compileSdkVersion =28
buildToolsVersion ="28.0.3"
minSdkVersion =15
targetSdkVersion =28
}
在某个module的build.gradle中使用配置:apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.liuwangshu.hookinstrumentation"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
}
...
2. 使用config.gradle配置首先在根目录下创建config.gradle文件来进行配置。config.gradleext{
android=[
applicationId:"com.example.liuwangshu.hookinstrumentation",
compileSdkVersion :28,
buildToolsVersion :"28.0.3",
minSdkVersion : 15,
targetSdkVersion : 28,
]
dependencies =[
"appcompat-v7" : "com.android.support:appcompat-v7:28.0.0",
"constraint" : "com.android.support.constraint:constraint-layout:1.1.3",
]
}
接着在项目build.gradle中添加apply from: "config.gradle",这样项目的所有module都能用config.gradle中定义的参数。
最后在module的build.gradle中使用配置:apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
dependencies {
implementation rootProject.ext.dependencies["constraint"]
implementation rootProject.ext.dependencies["appcompat-v7"]
...
}
4.2 dependencies 块
dependencies 块用于配置该module构建过程中所依赖的所有库。Gradle插件3.4版本新增了 api 和 implementation 来代替 compile 配置依赖,其中 api 和此前的 compile是一样的。dependencies和api主要以下的区别:implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。
如果使用api,一个module发生变化,这条依赖链上所有的module都需要重新编译,而使用implemention,只有直接依赖这个module需要重新编译
有其他高见的欢迎评论。疑问欢迎留言讨论;进圈方式:点赞+关注,私信回复我‘资料’即可进圈。