熟悉Android打包编译的流程(1)

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设置文件。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值