【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
文章目录
- 一、APK 文件结构
- 二、APK 打包流程
- 三、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 444 种安装方式 :
① 系统程序安装 ;
② 使用应用市场安装 ;
③ 手机自带安装 ;
④ 使用 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.05.05.0 以下使用的虚拟机是 Dalvik 虚拟机 , 该虚拟机的可执行文件是 dex 文件 , 该文件比 class 字节码文件更小 ;
JIT ( Just In Time ) 即时编译技术 , 对应 Dalvik 虚拟机 ;
基于寄存器架构 , 通过寄存器间接访问数据 , 该方式比基于栈架构速度更快 ;
ART 虚拟机 :
Android 5.05.05.0 以上使用的虚拟机是 ART 虚拟机 ;
AOT ( Ahhead Of Time ) 预编译技术 , 对应 ART 虚拟机 ;
Java 虚拟机 / Dalvik 虚拟机 / ART 虚拟机 都向上层提供了 333 个接口 ,
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 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...
- 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
文章目录 一.AAPT2 资源编译工具 二.resources.arsc 资源映射表 工作机制 三.参考资料 一.AAPT2 资源编译工具 资源的编译 , 生成 R.java 文件 , 都是通过 AA ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )
文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )
文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.so 动态库 四.参考资料 一.修改 7zr 交叉编 ...
- 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...
- 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )
文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )
文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...
最新文章
- 『Go 语言底层原理剖析』文末送书
- PLSQL 之类型、变量和结构
- 1059 Prime Factors(25 分)
- VS2008建立webserver(转)
- 图解HTTP笔记(一)
- bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)
- STM32+uCOS-II+uc/GUI移植 (uC/GUI API函数学习一)
- 【转载】李开复宣布与金山合作 谷歌迈出中国第三步
- 简单的三层框架以及使用dbutils进行数据库操作(入门)
- mapgis新手教程(非常适合新手参考)
- m3 pcb开孔 螺丝_螺丝过孔及工艺孔尺寸参照表
- 空间想象力差学计算机,空间思维想象力差怎么办
- C# 扫描枪扫描条形码与二维码
- 2016年9月下旬校园招聘面经(美团、百度、58同城、华为、微店 11月10号更新)
- 《大话数据结构》看书笔记--算法
- 什么是空指针?如何从根源避免空指针
- 鸿蒙如何用JS开发智能手表App
- babylonjs创建坐标轴
- (分治法)查找最大和次大元素
- 仿抖音短视频系统源码,android 时间戳转换