安卓app如何在安卓系统上运行的?
安卓 App 在安卓系统上运行的过程是一个极其精密的“从代码翻译到硬件执行”的工程。为了让你通俗易懂地了解这个全貌我们可以把这个过程拆解为四个主要阶段打包、安装、启动、运行。同时我们需要认识两位“幕后大佬”ART 虚拟机和Zygote受精卵进程。以下是完整的运行揭秘第一阶段开发者写好的代码是如何变成安装包APK的你的手机并不认识 Java 或 Kotlin 代码它只认识“0”和“1”组成的机器码。所以在代码变成 App 之前需要经过层层翻译第一次翻译变成 .class开发者写的 Kotlin 或 Java 代码首先会被编译器翻译成统一的Java 字节码.class 文件。第二次翻译变成 .dex安卓的打包工具D8/R8会把所有的 .class 文件整合、压缩转化为安卓专属的Dalvik 字节码.dex 文件。因为手机的内存和存储有限.dex格式比.class占用空间更小运行效率更高。打包变成 APK系统把这些.dex代码文件连同 App 的图片、音频、界面布局XML等资源打包在一起加上数字签名就成了我们常见的APK或 AAB安装包。第二阶段安装时的秘密武器 —— ART 引擎当你下载了一个 APK 并点击安装时安卓系统的底层运行引擎ART (Android Runtime)就开始工作了。在早期的安卓系统安卓 4.4 之前使用的是Dalvik 引擎它采用的是JIT即时编译技术。也就是说App 每次运行的时候Dalvik 都要一边把.dex代码翻译成机器码一边交给 CPU 运行。这就导致早期的安卓手机用起来比较卡顿、耗电。现在的安卓系统使用的是ART 引擎。现代的 ART 引擎非常聪明它采用了AOT提前编译 JIT即时编译 配置文件引导的混合模式安装时它先不着急全部编译让你秒装 App。运行时它先用 JIT 模式运行同时默默记录你最常点击和使用的功能比如打开淘宝总要先看首页。手机闲置充电时ART 会在后台根据记录把那些最常用的代码提前编译AOT成底层的机器码。下次你再打开 App 时CPU 就可以直接运行这些机器码速度飞快。第三阶段点击图标App 是如何启动的—— 核心Zygote 进程这是安卓系统设计中最精妙的一环。如果你每次点开 App系统都要从头为它分配内存、加载基础库那打开 App 会极其缓慢。安卓为了解决这个问题设计了一个叫Zygote中文意思是“受精卵”或“受精细胞”的系统进程。预热的“母体”每次手机开机时安卓系统会启动 Zygote 进程。Zygote 会提前把安卓系统最核心的系统代码、常用的资源库全都加载进内存里然后处于“休眠待命”状态。细胞分裂Fork当你在桌面上点击某个 App 图标时桌面会向系统发出启动请求。系统会唤醒 Zygote让它“分裂Fork”出一个自己的复制品。鹊巢鸠占这个复制品继承了母体所有的基础环境不需要重新加载系统库然后它立刻加载你刚刚点击的那个 App 的.dex代码。瞬间一个属于该 App 的全新进程就诞生了App 界面也就呈现在了你眼前。第四阶段安全运行与沙盒机制App 跑起来之后安卓系统是如何管理它们的为什么一个 App 崩溃了闪退通常不会导致整台手机死机Linux 内核与沙盒Sandbox安卓系统的最底层其实是 Linux 操作系统。安卓给每一个安装的 App 都分配了一个独一无二的Linux 用户 IDUID。绝对隔离在 Linux 系统中不同用户之间是互相隔离的。因此每一个 App 都在属于自己的“沙盒”和独立的内存空间里运行。A 应用比如微信无法直接去读取 B 应用比如支付宝沙盒里的数据。系统调用硬件交互如果 App 想调用相机、震动或者网络它不能自己直接去操控硬件。它必须通过安卓的 Framework 层框架层向底层发出请求经过系统权限审核也就是经常弹出的“是否允许该应用使用相机权限”最终由 Linux 内核驱动硬件去完成操作。总结整个流程就好比开一家连锁餐厅打包厨师长写好了一本“标准菜谱.dex”。安装你把菜谱买回店里并让店长ART 引擎熟悉菜谱。启动有客人进门点菜点击图标总部Zygote立刻派出一个带着标准厨具的“克隆厨房”Fork 新进程来专门服务这一桌客人。运行厨房在独立封闭的包间沙盒里做菜既高效安全又不会影响旁边桌的客人。