开发android应用程序涉及以顺序方式发生的几个过程。编写源代码文件后,当开发人员单击Android Studio上的“运行”按钮时,大量的操作和过程将从后端开始。在后台进行的每个操作都是至关重要的步骤,并且是相互依赖的。 IDE会构建所有应用程序文件,使它们与设备兼容以便进行部署,并确保应用程序在设备上成功运行。本文广泛地解释了Android应用程序从IDE文件到工作设备应用程序的过程中涉及的每个关键步骤。
步骤1:建立APK档案
1.代码编译
android应用程序源文件使用Java (*。 Java文件)或Kotlin (*。kt文件)编程语言编写。用这两种语言编写代码的语法不同,但是它们的编译过程几乎相同。两种编程语言都会生成可编译为Java字节码的代码,该Java字节码可在JVM(Java虚拟机)上执行。在android环境中,该过程从将Java/ Kotlin源代码编译为Java类文件开始。类文件的扩展名为* .class ,并且包含Java字节码(表示Java程序集)。此编译任务分别由Javac和kotlinc编译器针对Java和Kotlin语言代码执行。
2.转换为Dalvik字节码
上一步中生成的Java class(*。class)文件可在Java虚拟机(JVM)上执行,因为它包含标准的Oracle JVM Java字节码。但是,此代码格式不适合Android设备,因此Android有自己的唯一字节代码格式,称为Dalvik字节代码。 Dex编译器翻译Java字节码 放入Dalvik字节码中,这些字节码是理论处理器的机器代码指令。在编译过程中, dx命令将所有.class文件和.jar文件绑定在一起,并创建一个单独的classes.dex文件,该文件 以Dalvik字节码格式编写。该文件现在可以在称为Android Runtime (或Dalvik虚拟机(DVM))的Android操作系统中的虚拟机上执行。 适用于低于Kitkat(4.4)的android版本)。
Java regular code:
public int addTwoNumbers(int a, int b) {
return a+ b;
}
Equivalent Java byte-code:
public int addTwoNumbers(int, int);
Code:
0: iload_1
1: iload_2
2: iadd
3: ireturn
Equivalent Dalvik byte-code:
.method public addTwoNumbers(II)I
.registers 4
.param p1, “a” # I
.param p2, “b” # I
.line 6
add-int v0, p1, p2
return v0
.end method
3.生成.apk文件
android应用程序的资源文件(例如图像,字体,XML布局等)通过Android Asset Packaging Tool(aapt)转换为单个已编译资源单元。该AAPT工具还负责建立一个Android应用程序的R. Java文件。此外, apkbuilder工具将已编译的资源单元与classes.dex文件一起压缩,并创建了一个类似zip的文件,该文件被称为Android Package(.apk文件) 。生成的.apk文件包含运行Android应用程序所需的所有必要数据。
4.应用分发
上一步中生成的.apk文件是现成的应用程序包,开发人员可以使用此文件来分发应用程序。但是,要通过Google Play商店分发和发布该应用程序,开发人员需要对其进行签名。 Android应用程序需要使用证书进行数字签名,以便用户可以安装。证书是自签名的,Android使用它来标识应用程序的作者。应用开发者/作者持有证书的私钥,并且所有这些详细信息都作为附加文件存储在android程序包(.apk文件)中。
Oracle Java开发工具包(JDK)提供了jarsigner工具来对.jar文件和.apk文件进行签名。此外,要求签名的.apk文件的压缩部分以这种方式在字节边界上对齐,以便Android OS可以读取它们而无需解压缩文件。通过zipalign工具运行已签名的.apk文件,可以确保文件的字节对齐。
步骤2:部署应用程序
1.建立ADB服务器
Android调试桥(ADB)将应用程序部署到Android设备。它是一个命令行工具,可充当界面并方便开发人员与android设备进行通信。要开始部署, ADB客户端将首先检查设备上是否已在运行ADB服务器进程。如果没有,则服务器进程从ADB命令开始。 ADB服务器启动并与本地TCP端口5037绑定。使用端口5037将所有通信和命令从ADB服务器传输到ADB客户端。此外,服务器与所有正在运行的设备建立连接。它扫描所有端口,并且当服务器检测到ADB守护程序(adbd:仿真器或设备实例上的后台进程)时,它将建立与该端口的连接。在android设备上匹配的adbd进程可以与应用程序通信,调试它们并收集其日志输出。
2.将.apk文件传输到设备
ADB命令将.apk文件传输到目标Android设备的本地文件系统中。设备文件系统中应用程序的位置由其程序包名称定义。例如,如果应用程序包是com.example.sampleapp ,则其.apk文件将位于路径/data/app/com.example.sampleapp中。
步骤3:运行应用程序
1.应用启动请求
Zygote进程是所有Android应用程序的父级,它在用户发出请求时启动应用程序。合子是一种特殊的Android OS进程,可在运行于Android虚拟设备(Dalvik / Android Runtime)上的不同实例之间共享代码。所有应用程序在运行时可能需要的那些资源,类和代码库都已预加载到合子进程的内存空间中。每当进程收到启动新应用程序的请求时,它都会使用fork系统调用(android是Linux系统)进行fork(创建副本)并启动新应用。预加载的库和资源是在Android中高效,快速启动应用的原因。
2.将.dex代码转换为本地OAT格式
安装新应用程序后,Android会优化应用程序数据并生成相应的OAT文件。该文件由Android OS创建,以加快应用程序的加载时间。生成OAT文件的过程始于提取应用程序.apk文件内存在的classes.dex文件。 classes.dex文件放置在一个单独的目录中,Android会将Dalvik字节码通过提前编译(AOT,也缩写为OAT)编译为本机代码。 Android系统使用此本地OAT文件通过快速,流畅地加载应用程序来增强用户体验。
在AOT出现之前,使用dexopt工具将.dex文件转换为保存优化字节码的.odex文件(优化DEX)。随着Android中AOT的引入, dex2oat工具将.dex文件转换并优化为OAT文件格式,该格式包含以ELF格式(可执行和可链接格式)编写的机器代码。然后,将本机库映射到应用程序进程的内存中。 OAT文件通常保存在Android设备的以下目录中: / data / dalvik-cache /
完成所有这些步骤和步骤之后,该应用程序将最终启动,并且该应用程序的初始活动将出现在设备屏幕上。