文章目录

  • 一、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 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )相关推荐

  1. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

  2. 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )

    文章目录 一.AAPT2 资源编译工具 二.resources.arsc 资源映射表 工作机制 三.参考资料 一.AAPT2 资源编译工具 资源的编译 , 生成 R.java 文件 , 都是通过 AA ...

  3. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )

    文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...

  4. 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.a 静态库 四.Android Studio 导入 ...

  5. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )

    文章目录 一.拷贝 lib7zr.so 动态库到 Android Studio 工程 二.配置 Module 下的 build.gradle 构建脚本 三.参考资料 一.拷贝 lib7zr.so 动态 ...

  6. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 )

    文章目录 一.修改 7zr 交叉编译脚本 Android.mk 二.完整的 7zr 交叉编译脚本 Android.mk 三.交叉编译 lib7zr.so 动态库 四.参考资料 一.修改 7zr 交叉编 ...

  7. 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )

    文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...

  8. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

    文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...

  9. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

  10. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )

    文章目录 一.JNI 中 main 函数声明 二.命令字符串切割并传入 main 函数 三.完整代码示例 1.完整 jni 代码 2.完整 java 代码 3.执行结果 四.参考资料 前置博客 : [ ...

最新文章

  1. 『Go 语言底层原理剖析』文末送书
  2. PLSQL 之类型、变量和结构
  3. 1059 Prime Factors(25 分)
  4. VS2008建立webserver(转)
  5. 图解HTTP笔记(一)
  6. bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)
  7. STM32+uCOS-II+uc/GUI移植 (uC/GUI API函数学习一)
  8. 【转载】李开复宣布与金山合作 谷歌迈出中国第三步
  9. 简单的三层框架以及使用dbutils进行数据库操作(入门)
  10. mapgis新手教程(非常适合新手参考)
  11. m3 pcb开孔 螺丝_螺丝过孔及工艺孔尺寸参照表
  12. 空间想象力差学计算机,空间思维想象力差怎么办
  13. C# 扫描枪扫描条形码与二维码
  14. 2016年9月下旬校园招聘面经(美团、百度、58同城、华为、微店 11月10号更新)
  15. 《大话数据结构》看书笔记--算法
  16. 什么是空指针?如何从根源避免空指针
  17. 鸿蒙如何用JS开发智能手表App
  18. babylonjs创建坐标轴
  19. (分治法)查找最大和次大元素
  20. 仿抖音短视频系统源码,android 时间戳转换

热门文章

  1. 浅谈ThreadPool 线程池(引用)
  2. myeclipse2014新感悟
  3. Android之Handler有感(二)
  4. TCP和UDP和IP和HTTP和socket
  5. 廖雪峰Java1-2Java程序基础-3整数运算
  6. c#一种存储结构解决动态平衡问题
  7. github上手实践教程
  8. Kncok之绑定事件
  9. 8.Layout布局应用
  10. caffe命令及其参数解析