从事Android高级研发,怎能不知道Android的打包流程呢?
今天就为你们讲解Android打包的流程:
Android 构建系统编译应用资源和源代码,而后将它们打包成可测试、部署、签署和分发的 APK。
通常使用 Android Studio开发的时候使用Gradle构建工具包来自动执行和管理构建流程,同时也能够灵活地自定义构建配置。java
Gradle 和 Android 插件独立于 Android Studio 运行。因此咱们能够在 Android Studio上或者计算机上的命令行构建 Android 应用。 若是您不使用 Android Studio,能够学习如何从命令行构建和运行您的应用,最终构建的输出都相同。android
在了解Android打包流程以前,我建议您能够先查看一个apk包内容,能够知道它里面都有哪些文件组成:程序员
知道了apk包体的内容,咱们应该会更好的理解Android打包流程:
以上流程中咱们能够看到:面试
编译器将源代码转换成 DEX(Dalvik Executable) 文件(其中包括 Android 设备上运行的字节码),将全部其余内容转换成已编译资源。
APK 打包器将 DEX 文件和已编译资源合并成单个 APK。 不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
APK 打包器使用调试或发布密钥库签署APK。app
注意:
一、若是咱们构建的是debug版本的应用,打包器会使用调试密钥库签署应用。 Android Studio 自动使用调试密钥库配置新项目。
二、若是构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署应用。
三、在生成最终 APK 以前,打包器会使用 zipalign 工具对应用进行优化,减小其在设备上运行时占用的内存。工具
重点
如上面的流程所示,是典型 Android 应用模块的构建流程,但若是看的更细致一点它的流程应该以下:布局
这些构建中使用的工具或者脚本,在SDK的build-tools或者tools下能够找到学习
详细的流程图以下:
这样就Android打包的流程就明明白白了。测试
gradle的配置含义gradle
Androidstudio 会与Android Plugin for Gradle 这个构建工具包协做,当咱们在Androidstudio建立一个应用的时候,它会帮助咱们建立自定义构建配置 build.gradle 文件,这个文件里的内容须要咱们本身进行一些简单的更改。 这些纯文本文件使用域特定语言 (DSL) 以 Groovy 语言描述和操做构建逻辑,其中 Groovy 是一种适用于 Java 虚拟机 (JVM) 的动态语言。 无需了解 Groovy 即可开始配置构建,由于 Android Plugin for Gradle 引入咱们开发须要的大多数 DSL 元素
如图,是咱们工程中文件层级,如今咱们来说讲每一个层级gradle的文件含义:
include ‘:app’
不过,多模块项目须要指定应包括在最终构建之中的每一个模块
buildscript { buildscript块是Gradle自己配置存储库和依赖项的地方——也就是说,这里不该该包含模块的依赖项。例如,这个块包含了Gradle的Android插件做为一个依赖项,由于它提供了Gradle构建Android应用程序模块所需的额外指令。 repositories { google() jcenter() } dependencies 块配置Gradle须要使用的依赖项来构建项目。下面的代码行添加了Gradle的Android插件版本3.3.2做为类路径依赖项。 dependencies { classpath 'com.android.tools.build:gradle:3.3.2' } } allprojects块是配置项目中全部模块(如第三方插件或库)使用的存储库和依赖项的地方。可是,你应该在每一个模块级别的构建中配置特定于模块的依赖项。gradle文件。对于新项目,Android Studio默认包含JCenter和谷歌的Maven存储库,但它不配置任何依赖项(除非您选择了一个须要的模板) allprojects { repositories { google() jcenter() } }
对于包含多个模块的 Android 项目,在项目级别定义某些属性,并在全部模块间共享这些属性可能会很是有用。 为此,您能够将 额外属性添加到顶级 build.gradle 文件的 ext 代码块中。
buildscript {...} allprojects {...} // 这个块封装了自定义属性,使它们对项目中的全部模块均可用。 ext { //下面只是能够定义的属性类型的几个示例。 compileSdkVersion = 28 // You can also create properties to specify versions for dependencies. // Having consistent versions between modules can avoid conflicts with behavior. supportLibVersion = "28.0.0" ... } ...
要从相同项目中的模块访问这些属性,请在模块的 build.gradle 文件(您能够在如下部分了解有关此文件的详细信息)中使用如下语法。
android { // 使用如下语法访问在项目级别定义的属性: // rootProject.ext.property_name compileSdkVersion rootProject.ext.compileSdkVersion ... } ... dependencies { implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" ... }
模块级 build.gradle 文件位于各 project/module/ 目录中,用于配置适用于其所在模块的构建设置。 你能够经过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风格),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
此 Android 应用模块 build.gradle 文件示例归纳您应了解的某些基本 DSL 元素和设置。
//构建配置中的第一行将Gradle的Android插件应用于此构建,并使Android块可用来指定特定于Android的构建选项。 apply plugin: 'com.android.application' android块是配置全部android特定构建选项的地方。 android { compileSdkVersion指定了Gradle应该使用的Android API级别来编译你的应用程序。这意味着你的应用程序可使用这个API级别或更低的API特性。 compileSdkVersion 28 buildToolsVersion指定了用于构建应用程序的SDK构建工具、命令行实用程序和编译器的版本。须要使用SDK管理器下载构建工具。此属性是可选的,由于插件默认使用构建工具的推荐版本。 buildToolsVersion "28.0.3" defaultConfig块封装了全部构建变体的默认设置和条目,而且能够从构建系统动态地覆盖main/AndroidManifest.xml中的一些属性。你能够配置产品口味来覆盖应用程序不一样版本的这些值。 defaultConfig { applicationId唯一地标识要发布的包。可是,咱们的源代码仍然应该引用主/AndroidManifest.xml文件中的package属性定义的包名。 applicationId 'com.example.myapp' 定义运行应用程序所需的最低API级别。 minSdkVersion 15 指定用于测试应用程序的API级别。 targetSdkVersion 28 定义应用程序的版本号。 versionCode 1 为您的应用程序定义一个用户友好的版本名称。 versionName "1.0" } 您能够在buildTypes块中配置多个构建类型。根据efault,构建系统定义了两种构建类型:debug和release。调试构建类型在默认的构建配置中没有显式显示,可是它包含调试工具,并使用debug键进行签名。release构建类型应用Proguard设置,默认状况下不签名。 buildTypes { 默认状况下,Android Studio使用minifyEnabled配置release build类型来启用代码收缩,并指定Proguard设置文件。 release { minifyEnabled true // Enables code shrinking for the release build type. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 能够在productflavor块中配置多个产品口味。这容许您建立应用程序的不一样版本,这些版本能够用本身的设置覆盖defaultConfig块。产品风味是可选的,默认状况下构建系统不会建立它们。这个例子建立了一个免费且付费的产品风格。而后,每种产品都指定了本身的应用程序ID,这样它们就能够同时存在于谷歌Play Store或Android设备上。若是您声明产品的风味,您还必须声明风味维度,并将每种风味分配给风味维度。 flavorDimensions "tier" productFlavors { free { dimension "tier" applicationId 'com.example.myapp.free' } paid { dimension "tier" applicationId 'com.example.myapp.paid' } } 在split块中,您能够配置不一样的APK构建,每一个构建只包含支持屏幕密度或的代码和资源versionCode不一样。 splits { 根据屏幕密度设置构建多个apk。 density { 启用或禁用构建多个apk exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi" } } } 模块级构建配置文件中的dependencies块指定仅构建模块自己所需的依赖项。要了解更多信息,请添加构建依赖项。 dependencies { implementation project(":lib") implementation 'com.android.support:appcompat-v7:28.0.0' implementation fileTree(dir: 'libs', include: ['*.jar']) }
gradle.properties
您能够在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小。如需了解详细信息,请参阅构建环境。
local.properties
为构建系统配置本地环境属性,例如 SDK 安装路径。 因为该文件的内容由 Android Studio 自动生成而且专用于本地开发者环境,因此不该手动修改该文件,或将其归入您的版本控制系统。
以上即是Android打包流程中须要了解的知识。这些知识对咱们理解一些比较深刻的功能仍是颇有好处的,好比热更新,好比插件化,好比多渠道打包,同时在平时的开发过程当中对打包编译的配置文件gradle很熟悉,能够大大提升开发的效率,甚至能够本身开发一些小的脚本帮助本身提升工做效率。
更多信息能够点击关于我 , 很是但愿和你们一块儿交流 , 共同进步
也能够扫一扫, 目前是一名程序员,不只分享 Android开发相关知识,同时还分享技术人成长历程,包括我的总结,职场经验,面试经验等,但愿能让你少走一点弯路。