构建流程
构建流程即:将项目转换成APK或AAB文件的过程,具体参考下图。
Android 官方文档对该流程的描述如下:
- 编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源。
- 打包器将 DEX 文件和编译后的资源组合成 APK 或 AAB(具体取决于所选的 build 目标)。 必须先为 APK 或 AAB 签名,然后才能将应用安装到 Android 设备或分发到 Google Play 等商店。
- 打包器使用调试或发布密钥库为 APK 或 AAB 签名:
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,以减少其在设备上运行时所占用的内存。
- 构建流程结束时,您将获得应用的调试版或发布版 APK/AAB,以用于部署、测试或向外部用户发布。
AAB文件
AAB 文件是一个Android应用程序包,开发人员使用它将应用程序上载到Google Play。上传后,Google Play使用一个名为Dynamic Delivery
的过程将应用程序包(.APK 文件)的优化版本传递给用户设备,以便它们只包含每个设备需要运行的应用程序的特定部分(如根据设备屏幕大小)。通过动态交付,用户设备上的应用程序安装大小可以显著减少。
Debug or Release KeyStore
安卓的构建有两种模式,一个是debug模式——生成供开发测试用的安装包,一个是release模式——生成供发布到应用商店的正式包。前者构建时需要使用的密钥叫做Debug Keystore
,而后者需要用到的则是Release Keystore
。
Debug包和Release包的区别
-
Debug
是调试版本,包括的程序信息更多。只有Debug版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。 -
Release
不包含任何调试信息,所以体积小、运行速度快。Debug 版本的存在是为了方便程序员开发和调试,性能和体积不是它的重点;Release 版本是最终交给用户的程序,性能和体积是需要重点优化的两个方面。
build 配置文件
创建自定义 build 配置需要您对一个或多个 build 配置文件(即 build.gradle 文件)做出更改。而若要对其作出更改,需要我们首先对配置文件的内容有一个大概的了解。
一个新建的Android项目的文件结构如下图:
setting.gradle
settings.gradle 文件位于项目的根目录下,用于指示 Gradle 在构建应用时应将哪些模块包含在内。对大多数项目而言,该文件很简单,一般只包含以下代码:
include ':app'
build.gradle
该文件有两种,一种是位于顶层的项目级文件,一种是位于各模块内的模块级文件。
用途
- 项目级 build.gradle 用于定义适用于项目中所有模块的构建配置。
- 模块级 build.gradle 则用于为其所在的特定模块配置构建设置。您可以通过配置这些构建设置提供自定义打包选项(如额外的构建类型和产品变种),以及替换 main/ 应用清单或顶层 build.gradle 文件中的设置。
内容
项目级build.gradle包含apply/buildscript/allprojects三大内容。
- apply代码声明了是项目用到的应用插件,包括二进制插件和脚本插件两种,分别使用apply plugin和apply from。
- buildscript代码里是gradle脚本执行所需依赖,分别是对应的maven库和插件
- allprojects里是项目本身需要的依赖,比如我现在要依赖我自己maven库的toastutils库,那么我应该将maven {url ‘https://dl.bintray.com/calvinning/maven’}写在这里,而不是buildscript中,不然找不到
- 此外,还可以在这里定义一些全项目公用的属性
而模块级build.gradle的内容则比较丰富如下代码所示:
//这里与前者类似
apply plugin: 'com.android.application'
//android块是配置所有特定于android的构建选项的地方
android {
//CompileSDK版本指定Gradle编译应用程序时应使用的Android API级别。
//这意味着您的应用程序可以使用此API级别及更低级别中包含的API功能。
compileSdkVersion 28
//buildToolsVersion指定Gradle用于构建应用程序的SDK构建工具、命令行实用程
//序和编译器的版本。您需要使用SDK管理器下载构建工具。
//此属性是可选的,因为插件默认使用推荐版本的生成工具。
buildToolsVersion "30.0.2"
//defaultConfig块封装了所有应用程序的默认设置和条目
//生成变体,并可以覆盖main/AndroidManifest.xml中的某些属性
defaultConfig {
/**
* applicationId uniquely identifies the package for publishing.
* However, your source code should still reference the package name
* defined by the package attribute in the main/AndroidManifest.xml file.
*/
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 15
// Specifies the API level used to test the app.
targetSdkVersion 28
// Defines the version number of your app.
versionCode 1
// Defines a user-friendly version name for your app.
versionName "1.0"
}
//buildTypes块是您可以配置多个生成类型的地方。
//默认情况下,生成系统定义两种生成类型:debug 和 release
buildTypes {
/**
* By default, Android Studio configures the release build type to enable code
* shrinking, using minifyEnabled, and specifies the default Proguard rules file.
*/
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// productFlavors块用于配置多个产品口味。
//这允许您创建不同版本的应用程序,可以
//使用其自己的设置覆盖defaultConfig块。产品风味
//是可选的,默认情况下生成系统不会创建它们。
flavorDimensions "tier"
productFlavors {
free {
dimension "tier"
applicationId 'com.example.myapp.free'
}
paid {
dimension "tier"
applicationId 'com.example.myapp.paid'
}
}
}
// 模块级生成配置文件中的依赖项块指定仅生成模块本身所需的依赖项。
dependencies {
implementation project(":lib")
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
除此之外,模块级build.gradle文件中还可能有以下几种配置:
dexOption/compileOption/lintOption/packagingOption等,分别负责有关dex文件的配置,编译版本的配置,代码扫描的配置,以及打包配置。
属性文件
除此之外,包含两个属性文件,它们位于项目的根目录下,可用于指定 Gradle 构建工具包本身的设置:
gradle.properties
您可以在其中配置项目全局 Gradle 设置,如 Gradle 守护程序的最大堆大小。
local.properties
为构建系统配置本地环境属性。
参考资料:
https://developer.android.com/studio/build#groovy
https://www.jianshu.com/p/e681314f0d07
http://c.biancheng.net/view/4124.html
https://the-x.cn/file/Extension/AAB.aspx