Andorid&Kotlin编译速度原理剖析(上)

本文介绍了Android应用打包过程中,从AIDL到生成APK的详细步骤,包括AIDL文件处理、Java编译、DEX转换、APK构建和签名,以及使用Gradle进行自动化构建和性能检测。同时,还讨论了编译速度优化的常见方案,如使用最新工具、调整资源编译、图片格式转换等。
摘要由CSDN通过智能技术生成

这一过程中使用到的工具是aidl.exe,位于android-sdk/tools目录下。 Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。

这个阶段处理.aidl文件,生成对应的.java文件。如果在项目没有使用到aidl文件。

3、javac:生成.class文件

通过Java Compiler 编译项目中所有的Java代码,包括R.java、.aidl文件生成的.java文件、Java源文件,生成.class文件。在对应的build下可以找到相关的代码。

4、dex:转化.class成dex文件

dx工具位于android-sdk/tools 目录下,通过它生成可供Android系统虚拟机执行的classes.dex文件。在build下可以找到相应的代码,直接使用dex命令来进行转化。这个阶段任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。

//D:\test.dex 是dex文件输出目录

//D:\test是存放class文件目录dx --dex --output=D:\test.dex D:\test

复制代码

5、apkbuilder:生成apk包

打包的工具apkbuilder位于 android-sdk/tools目录下。apkbuilder为一个脚本文件,实际调用的是android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain类。所有没有编译的资源(如 res/raw、images等)、Other Resources(assets文件)、编译过的资源 、.dex文件 、resources.arsc 和 AndroidManifest.xml 都会被apkbuilder工具打包到最终的.apk文件中。

6、jarsigner:对APK进行签名

一旦apk文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试。另一种就是用于发布正式版本的keystore。

7、zipalign:签名对齐

如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign,它位于android-sdk/tools目录下。

Zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。

GradleTask

我们点击Run‘app’时gradle是如何工作的,在Build窗口可以看到详细的Task日志,主要的作用也是处理上述的7个打包流程中的每一步。在窗口的日志中我们可以看到熟悉的关键字比如第二行的compileDevDebugAidl从名字上我们可以知道是处理Aidl。还有generateDevDeubgBuildConfig是生成BuildConfig文件。我们常用的BuildConfig.isDebug就是这个Task中处理生成的。当然每个Gradle Task都是上述7个打包步骤流程的细化处理。我把整个系统中用到的Task和实现类列了出来感兴趣的小伙伴可以研究下源码。我们先简单分析下GenerateBuildConfig Task的源码,源码基于com.android.tools.build:gradle:4.1.0Kotlin版本。

abstract class GenerateBuildConfig : NonIncrementalTask(){

//版本名称

@get:Input

@get:Optional

abstract val versionName: Property<String?>

//版本号

@get:Input

@get:Optionalabstract

abstract val versionCode: Property<Int?>

//父类NonIncrementalTask的唯一抽象方法,也就是BuildConfig的主要逻辑处理方法

override fun doTaskAction() {

//获取类里面的属性包括一些自定义的属性

val buildConfigData = BuildConfigData.Builder()<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值