Android 安装包优化APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 文件进行优化生成的 ;

以上是关于Android 安装包优化APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )的主要内容,如果未能解决你的问题,请参考以下文章

Android笔记 - APK打包流程

朝花夕拾Android性能优化篇之Apk打包

Android 安装包优化动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )(代

apk的打包和优化

apk的打包和优化

Android APK打包流程备忘