百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

熟悉Android打包编译的流程

bigegpt 2024-08-07 17:51 10 浏览

从事Android高级研发,怎能不知道Android的打包流程呢?

今天就为大家讲解Android打包的流程:

Android 构建系统编译应用资源和源代码,然后将它们打包成可测试、部署、签署和分发的 APK。

一般使用 Android Studio开发的时候使用Gradle构建工具包来自动执行和管理构建流程,同时也可以灵活地自定义构建配置。

Gradle 和 Android 插件独立于 Android Studio 运行。所以我们可以在 Android Studio上或者计算机上的命令行构建 Android 应用。 如果您不使用 Android Studio,可以学习如何从命令行构建和运行您的应用,最终构建的输出都相同。

在了解Android打包流程之前,我建议您可以先查看一个apk包内容,可以知道它里面都有哪些文件组成:

  • AndroidManifest.xml 程序全局配置文件
  • classes.dex Dalvik字节码
  • resources.arsc 资源索引表, 解压缩resources.ap_就能看到
  • res\ 该目录存放资源文件(图片,文本,xml布局)
  • assets\ 该目录可以存放一些配置文件
  • src\ java源码文件
  • libs\ 存放应用程序所依赖的库
  • gen\ 编译器根据资源文件生成的java文件
  • bin\ 由编译器生成的apk文件和各种依赖的资源
  • META-INF\ 该目录下存放的是签名信息

知道了apk包体的内容,我们应该会更好的理解Android打包流程:



以上流程中我们可以看到:

  • 编译器将源代码转换成 DEX(Dalvik Executable) 文件(其中包括 Android 设备上运行的字节码),将所有其他内容转换成已编译资源。
  • APK 打包器将 DEX 文件和已编译资源合并成单个 APK。 不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上
  • APK 打包器使用调试或发布密钥库签署APK。

注意:

1、如果我们构建的是debug版本的应用,打包器会使用调试密钥库签署应用。 Android Studio 自动使用调试密钥库配置新项目。

2、如果构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署应用。

3、在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时占用的内存。

重点:

如上面的流程所示,是典型 Android 应用模块的构建流程,但如果看的更细致一点它的流程应该如下:

  • AAPT(Android Asset Packaging Tool)工具,Android资源打包工具。会打包资源文件(res文件夹下的文件),并生成R.java和resources.arsc文件。
  • AIDL工具会将所有的.aidl文件编译成.java文件。
  • JAVAC工具将R.java、AIDL接口生成的java文件、应用代码java文件编译成.class文件。
  • dex脚本将很多.class文件转换打包成一个.dex文件。
  • apkbuilder脚本将资源文件和.dex文件生成未签名的.apk文件。
  • jarsigner对apk进行签名。

这些构建中使用的工具或者脚本,在SDK的build-tools或者tools下可以找到

详细的流程图如下:



这样就Android打包的流程就明明白白了。

gradle的配置含义

Androidstudio 会与Android Plugin for Gradle 这个构建工具包协作,当我们在Androidstudio创建一个应用的时候,它会帮助我们创建自定义构建配置 build.gradle 文件,这个文件里的内容需要我们自己进行一些简单的更改。 这些纯文本文件使用域特定语言 (DSL) 以 Groovy 语言描述和操作构建逻辑,其中 Groovy 是一种适用于 Java 虚拟机 (JVM) 的动态语言。 无需了解 Groovy 便可开始配置构建,因为 Android Plugin for Gradle 引入我们开发需要的大多数 DSL 元素



如图,是我们工程中文件层级,现在我们来讲讲每个层级gradle的文件含义:

  • settings.gradle 工程设置Gradle,文件位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内。 对大多数项目而言,该文件很简单,只包括以下内容:
  • include ‘:app’
  • 不过,多模块项目需要指定应包括在最终构建之中的每个模块
  • project build.gradle 是顶级构建文件, 位于项目根目录,用于定义适用于项目中所有模块的构建配置。 默认情况下,此顶级构建文件使用 buildscript 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项。 以下代码示例描述的默认设置和 DSL 元素可在新建项目后的顶级 build.gradle 文件中找到。
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}"
 ...
}
  • module build.gradle是模块级构建文件
  • 模块级 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 属性文件,Gradle 还包括两个属性文件,均位于项目根目录中,可用于指定适用于 Gradle 构建工具包本身的设置:

gradle.properties

您可以在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小。如需了解详细信息,请参阅构建环境。

local.properties

为构建系统配置本地环境属性,例如 SDK 安装路径。 由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,所以不应手动修改该文件,或将其纳入您的版本控制系统。

以上便是Android打包流程中需要了解的知识。这些知识对我们理解一些比较深入的功能还是很有好处的,比如热更新,比如插件化,比如多渠道打包,同时在平时的开发过程中对打包编译的配置文件gradle很熟悉,可以大大提高开发的效率,甚至可以自己开发一些小的脚本帮助自己提高工作效率。

相关推荐

方差分析简介(方差分析通俗理解)

介绍方差分析(ANOVA,AnalysisofVariance)是一种广泛使用的统计方法,用于比较两个或多个组之间的均值。单因素方差分析是方差分析的一种变体,旨在检测三个或更多分类组的均值是否存在...

正如404页面所预示,猴子正成为断网元凶--吧嗒吧嗒真好吃

吧嗒吧嗒,绘图:MakiNaro你可以通过加热、冰冻、水淹、模塑、甚至压溃压力来使网络光缆硬化。但用猴子显然是不行的。光缆那新挤压成型的塑料外皮太尼玛诱人了,无法阻挡一场试吃盛宴的举行。印度政府正...

Python数据可视化:箱线图多种库画法

概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)...

多组独立(完全随机设计)样本秩和检验的SPSS操作教程及结果解读

作者/风仕在上一期,我们已经讲完了两组独立样本秩和检验的SPSS操作教程及结果解读,这期开始讲多组独立样本秩和检验,我们主要从多组独立样本秩和检验介绍、两组独立样本秩和检验使用条件及案例的SPSS操作...

方差分析 in R语言 and Excel(方差分析r语言例题)

今天来写一篇实际中比较实用的分析方法,方差分析。通过方差分析,我们可以确定组别之间的差异是否超出了由于随机因素引起的差异范围。方差分析分为单因素方差分析和多因素方差分析,这一篇先介绍一下单因素方差分析...

可视化:前端数据可视化插件大盘点 图表/图谱/地图/关系图

前端数据可视化插件大盘点图表/图谱/地图/关系图全有在大数据时代,很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,开发人员很多时候需要使用图表来表现一些数据。随着Web技术的...

matplotlib 必知的 15 个图(matplotlib各种图)

施工专题,我已完成20篇,施工系列几乎覆盖Python完整技术栈,目标只总结实践中最实用的东西,直击问题本质,快速帮助读者们入门和进阶:1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编...

R ggplot2常用图表绘制指南(ggplot2绘制折线图)

ggplot2是R语言中强大的数据可视化包,基于“图形语法”(GrammarofGraphics),通过分层方式构建图表。以下是常用图表命令的详细指南,涵盖基本语法、常见图表类型及示例,适合...

Python数据可视化:从Pandas基础到Seaborn高级应用

数据可视化是数据分析中不可或缺的一环,它能帮助我们直观理解数据模式和趋势。本文将全面介绍Python中最常用的三种可视化方法。Pandas内置绘图功能Pandas基于Matplotlib提供了简洁的绘...

Python 数据可视化常用命令备忘录

本文提供了一个全面的Python数据可视化备忘单,适用于探索性数据分析(EDA)。该备忘单涵盖了单变量分析、双变量分析、多变量分析、时间序列分析、文本数据分析、可视化定制以及保存与显示等内容。所...

统计图的种类(统计图的种类及特点图片)

统计图是利用几何图形或具体事物的形象和地图等形式来表现社会经济现象数量特征和数量关系的图形。以下是几种常见的统计图类型及其适用场景:1.条形图(BarChart)条形图是用矩形条的高度或长度来表示...

实测,大模型谁更懂数据可视化?(数据可视化和可视化分析的主要模型)

大家好,我是Ai学习的老章看论文时,经常看到漂亮的图表,很多不知道是用什么工具绘制的,或者很想复刻类似图表。实测,大模型LaTeX公式识别,出乎预料前文,我用Kimi、Qwen-3-235B...

通过AI提示词让Deepseek快速生成各种类型的图表制作

在数据分析和可视化领域,图表是传达信息的重要工具。然而,传统图表制作往往需要专业的软件和一定的技术知识。本文将介绍如何通过AI提示词,利用Deepseek快速生成各种类型的图表,包括柱状图、折线图、饼...

数据可视化:解析箱线图(box plot)

箱线图/盒须图(boxplot)是数据分布的图形表示,由五个摘要组成:最小值、第一四分位数(25th百分位数)、中位数、第三四分位数(75th百分位数)和最大值。箱子代表四分位距(IQR)。IQR是...

[seaborn] seaborn学习笔记1-箱形图Boxplot

1箱形图Boxplot(代码下载)Boxplot可能是最常见的图形类型之一。它能够很好表示数据中的分布规律。箱型图方框的末尾显示了上下四分位数。极线显示最高和最低值,不包括异常值。seaborn中...