本文的意义:理解 Gradle,并了解Gradle 在 Android 的构建过程中的作用。
一:Gradle简介
Gradle是一个自动化项目构建工具,它使用基于Groovy的语言来声明项目配置,不是传统的XML。
Android项目中包含以下gradle文件
build.gradle:build.gradle文件有两种类型。一种是project;一种是module,module可能有多个。
在project的build文件中,我们可以添加一些子module所共有的一些配置,就不需要单独在每一个子module中进行配置了。
在module的build文件中,是生成对module自身构建时候的一些配置选项。
config.gradle:config.gradle是我们自定义的gradle文件,可以定义常量,比如我们引用的第三方库、版本号、name等。
gradle-wrapper.properties:配置我们项目使用的gradle的版本号
gradle.properties:项目属性的配置文件。可以配置是否使用AndroidX,定义一些常量。
settings.gradle:settings.gradle用于指定Gradle在构建应用时将哪些模块包括在内。
local.properties:ndk和sdk的存储路径
二: Android中Gradle可以做什么
Android的build过程,是编译源代码和应用资源文件,然后把他们打包成可应用于测试、部署、签名和分发的apk文件。Android studio可以使用gradle这个高级构建工具来自动化执行和管理构建流程。我们可以自动化配置gradle文件,实现特定功能。
我们来介绍在build.gradle文件中一些常用的配置。
1.buildTypes构建类型
可以设置不同的构建类型,release、debug、自定义名称等。
2.productFlavors:产品风味
productFlavors可以构建不同的应用版本,可以设置不同的包名称。通过productFlavors的配置,我们可以进行多渠道打包。
productFlavors {
demo {
applicationId "com.example.myapp.demo"
versionName "1.0-demo"
}
full {
applicationId "com.example.myapp.full"
versionName "1.0-full"
}
}
3、dependencies依赖项
//依赖我们本地的module
compile project(":mylibrary")
//远程的二进制依赖项
compile 'com.android.support:appcompat-v7:25.1.0'
//本地二进制依赖方式,将检测我们的本地的libs中的jar文件
compile fileTree(dir: 'libs', include: ['*.jar'])
//javaTest依赖
testCompile 'junit:junit:4.12'
//AndroidTest依赖
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
当我们添加了一个依赖,该依赖依赖了其他的依赖,而我们想把其中的一个依赖去掉。compile方法可以接受一个闭包参数,我们可以利用这个闭包来将其中的部分剔除掉。
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
4、生成so
ndk{
moduleName "hello" //生成的so文件名字,调用C程序的代码中会用到该名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库
}
Gradle在执行的时候会自动的从lib目录下找相应的C/C++文件,生成相应的so文件。
5、ProGuard代码混淆
ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。混淆过的代码可令您的 APK 难以被逆向工程
//开启代码压缩
minifyEnabled true
每次执行完成ProGuard之后,都会产生如下文件
dump.txtAPK 中所有类文件的内部结构。
mapping.txt 提供原始与混淆过的类、方法和字段名称之间的转换。
seeds.txt 列出未进行混淆的类和成员。
usage.txt 列出从 APK 移除的代码。 这些文件保存在 /build/outputs/mapping/release/。
对于其中一些类,我们不想对其进行混淆的,需要我们在ProGuard 配置文件中添加一行 -keep 代码。例如:
-keep public class MyClass
三:Gradle可以生成插件
参考文章:https://juejin.im/post/5a6dbdf06fb9a01cbe65907e