- 热修复 : 支付宝、优酷、微信
- 刚发布的应用就发现了比较严重的bug
- 有一些小的功能想即时推送给用户去使用
- 插件化 : 美团、淘宝、酷狗
- 解决应用越来越大所带来的各种技术限制,方法数超过65535等
- 解决应用越来越大带来的合作开发问题
- 使用这些热门技术时踩的坑,代码及版本发布的管理
一、dex/class深入讲解
-
什么是class 文件
能够被JVM识别,加载并执行的文件格式 -
如何生成class文件
- 通过IDE自动帮我们build
- 手动通过javac(java compiler)去生成class文件
- 通过java命令去执行class文件
- 通过IDE自动帮我们build
-
class文件的作用
记录一个类文件的所有信息 -
class文件格式
- 一种8位字节的二进制流文件
- 各个数据按顺序紧密的排列,无间隙(减少class体积,加载更快)
- 每个类或接口都单独占据一个class文件
弊端 : - class内存占用大,不适合移动端
- 堆栈的加载模式,加载速度慢
- 文件IO操作多,类查找慢
-
什么是dex文件
能够被DVM识别,加载并执行的文件格式 -
如何生成一个dex文件
- 通过IDE自动帮我们build生成
- 手动通过dx命令去生成dex文件
- 手动运行dex文件在手机
- dx --dex --output Hello.class
- adb push Hello.dex /storage/emulated/0
- adb shell
- dalvikvm -cp /sdcard/Hello.dex Hello
-
dex文件的作用
记录整个工程中所有类文件的信息,记住是整个工程 -
dex文件格式详解
- 一种八位字节的二进制流文件
- 各个数据按顺序紧密的排列,无间隙
- 整个应用中所有Java源文件都放在一个dex中
-
两者异同
- 本质都是一样的,dex是从class文件演变过来的
- class文件存在许多冗余信息,dex会去除冗余,并整合
二、jvm/dvm/art深入了解
- JVM结构
- Loading 类的信息从文件获取并且载入到JVM的内存中
- Verifying 检查读入的结构是否符合JVM规范的描述
- Preparing 分配一个结构存储类的信息
- Resolving 把这个类的常量池中的所有符号引用改变成直接引用
- Initializing 执行静态初始化程序,把静态变量初始化成指定的值
- JVM内存管理
- java栈区
- 作用 :它存放的是Java方法执行时的所有数据
- 组成 : 由栈帧组成,一个栈帧代表一个方法的执行
- java 栈帧
- 每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
- 包含:局部变量表、栈操作数、动态链接、方法出口
- 本地方法栈
- 作用:本地方法栈是专门为native方法服务的
- 方法区
- 存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据
- 堆区
- 作用:所有通过new创建的对象内存都在堆中分配
- 特点:是虚拟机中最大的一块内存,是GC要回收的部分
- java栈区
- 垃圾回收
- 垃圾收集算法
- 引用记数算法 jdk 1.2之前使用
- 可达性算法 离散数学的图论引用
- 垃圾回收算法
- 标记-清除算法
- 不需要对象的移动并且仅对不存活的对象处理,在存活对象比较多的情况下比较高效,但是内存碎片严重
- 复制算法
- 存活对象少时比较高效,需要一块内存作为交换空间来进行对象的移动
- 标记-整理算法
- 标记-清除算法基础上进行对象的移动,成本高,解决了内存碎片
- 标记-清除算法
- 垃圾收集算法
- 触发回收
- Java虚拟机无法再为新的对象分配内存空间了
- 手动调用System.gc()方法,并不会立马执行,它会等到合适的时机执行,加大了虚拟机的压力
- 低优先级的GC线程,被运行时就会执行GC
- 总结
- Dalvik Vm 与 JVM 不同
- 执行的文件不同,一个是class一个是dex
- 类加载系统与JVM区别较大
- 可以同时存在多个DVM
- Dalvik是基于寄存器的,而JVM是基于栈的
- ART 与 Dalvik 不同
- DVM使用JIT来将字节码转换成机器码,效率低
- ART采用了AOT预编译技术,执行速度更快,在我们安装的时候,就将字节码转换成了本地机器码,存在我们的存储介质中
- ART会占用更多的应用安装时间和存储空间
- Dalvik Vm 与 JVM 不同
三、class loader深入了解
- Java ClassLoader
- Android ClassLoader
- BootClassLoader 加载Android Framework层的一些字节码文件
- PathClassLoader 加载我们已将安装到系统中的APK文件中的class文件
- DexClassLoader 加载指定目录中的class字节码文件
- BaseDexClassLoader 父类
- Android中的动态加载难点
- 有许多组件类需要注册才能使用
- 资源的动态加载很复杂
- Android程序运行需要一个上下文环境