【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
一、APK 文件结构
Android 应用的安装包时 以 " .apk " 为后缀的 APK 文件 ;
APK 是 " Android Package " 的缩写 ;
将打包好的 APK 文件安装到 Android 手机中 , 就是可运行的应用程序 ;
APK 文件结构 :
① assets : 资源文件 , 该目录下的资源文件不经过 aapt 工具编译 ;
② lib : 存放 动态库 “.so” 文件 , NDK 中 C / C++ 调用的函数库 ;
③ META-INF : 该目录中存放 apk 的签名文件 ;
- CERT.SF : 摘要加密 , 使用私钥 对 摘要明文 加密后的 密文信息 , 是加密文件 , 如果要解密该文件 , 必须使用与私钥配对的公钥进行解密 ;
- CERT.RSA : 文件是签名证书文件 , 存放的是公钥和加密算法的描述 ;
- MANIFEST.MF : 文件摘要 , 存放程序清单文件 , 包含了 APK 安装包 中所有文件的 摘要明文 ;
- 剩余文件 : 都是可忽略的资源文件 ;
④ res : 资源文件 , 经过了 aapt 工具编译后的文件 ; 这个目录下的文件不再介绍 , 太熟悉了 ;
⑤ AndroidManifest.xml : 清单文件 , 声明了 Application , 组件 , 权限 , 元数据 等信息 ;
⑥ classes.dex : Dalvik 字节码文件 , Android 中的可执行文件 , 可以在 Android 系统中运行 ;
⑦ resources.arsc : 资源文件映射表 , 使用 aapt 编译 res 目录下的资源文件形成的文件 , 用于根据 id 查找资源路径 ;
二、APK 打包流程
APK 打包流程 :
① 使用 AAPT 工具打包资源文件 , 生成 R.java , resources.ap 文件 ;
② 使用 AIDL tool 工具 , 处理 AIDL 文件 , 生成对应的 Java 文件 ;
③ 使用 javac 工具编译 Java 源码为 class 字节码文件 ;
④ 使用 dx 工具将 class 字节码文件打包成 dex 字节码文件 , 这是 Dalvik 虚拟机字节码文件 ;
⑤ 使用 apkbuilder 工具生成未签名的 apk 文件 ;
⑥ 使用 jarsigner 工具对 apk 文件进行签名 , 生成签名后的文件 ;
⑦ 使用 zipalign 工具对签名后的 apk 文件进行对齐操作 ;
三、APK 安装流程
APK 4 4 4 种安装方式 :
① 系统程序安装 ;
② 使用应用市场安装 ;
③ 手机自带安装 ;
④ 使用 ADB 调试工具安装 ;
APK 安装流程 :
① 将 APK 安装包复制到 /data/app 目录下解压 , 扫描安装包 ;
② 将 dex 文件保存 /data/dalvik-cache 目录中 ;
③ 在 /data/data/包名 下创建对应 apk 包名的应用数据目录 ;
系统自带程序在 /system/app 目录下 , 获得 adb root 权限后才能删除 ;
应用卸载 , 就是将 /data/app/ , /data/dalvik-cache/ , /data/data/ 等目录下的相关文件删除 ;
四、安卓虚拟机
虚拟机是一个可以运行 class , odex , oat 可执行文件的运行环境 ;
常见的虚拟机有 Java 虚拟机 , Dalvik 虚拟机 , ART 虚拟机 ;
Java 虚拟机 :
运行的 class 字节码文件 , 运行程序时解码 class 文件中的内容 ;
基于栈架构 , 需要频繁在栈上读写数据 , 造成较多的指令分派 , 更多的内存访问次数 , 比较耗费 CPU 时间 ;
编译时 : Java 源码 , 使用 javac 编译器 , 编译成 class 字节码文件 ;
运行时 : 类加载器通过 Java 类库验证字节码 , 验证通过会后进入 Java 虚拟机 , 进入 Java 解释器 或 即时编译器 , 然后进入运行时系统 , 之后进入操作系统 , 然后调用硬件 ;
Dalvik 虚拟机 :
基于 JIT 机制 ( 即时编译技术 ) , Android 5.0 5.0 5.0 以下使用的虚拟机是 Dalvik 虚拟机 , 该虚拟机的可执行文件是 dex 文件 , 该文件比 class 字节码文件更小 ;
JIT ( Just In Time ) 即时编译技术 , 对应 Dalvik 虚拟机 ;
基于寄存器架构 , 通过寄存器间接访问数据 , 该方式比基于栈架构速度更快 ;
ART 虚拟机 :
Android 5.0 5.0 5.0 以上使用的虚拟机是 ART 虚拟机 ;
AOT ( Ahhead Of Time ) 预编译技术 , 对应 ART 虚拟机 ;
Java 虚拟机 / Dalvik 虚拟机 / ART 虚拟机 都向上层提供了 3 3 3 个接口 ,
JNI_GetDefaultJavaVMInitArgs
JNI_CreateJavaVM
JNI_GetCreatedJavaVMS ;
虚拟机之间可实现无缝衔接 ;
Dalvik 虚拟机 与 ART 虚拟机区别 : 虚拟机中有个 persist.sys.dvlvik.vm.lib 字段 ,
如果该字段存储的是 libdvm.so , 该虚拟机是 Dalvik 虚拟机 ;
如果该字段存储的是 ;ibart.so , 该虚拟机是 ART 虚拟机 ;
Dalvik 虚拟机 与 ART 虚拟机可执行文件 :
Dalvik 虚拟机加载 dex 文件加载时不是直接加载 dex 文件 , 加载执行的是 odex 文件 , odex 文件是通过 dexopt 工具对 dex 进行优化生成的 ;
ART 虚拟机加载 dex 文件时加载的是 oat 文件 , oat 文件时通过 dex2oat 工具对 dex 文件进行优化生成的 ;
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/117714855
- 点赞
- 收藏
- 关注作者
评论(0)