记录Android应用开发中涉及到的琐碎知识。
JVM&Dalvik&Art
Java虚拟机。JVM(Java Virtual Machine)是一种软件实现,执行像物理程序的机器。JVM并是不专为Java所实现运行的,只要其他编程语言的编译器能生成Java字节码,那这个语言也能实现在JVM上运行。因此,JVM通过执行Java bytecode可以使java代码在不改变的情况下在各种硬件之上。
Dalvik虚拟机:与Java虚拟机不一样的虚拟机,适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。
Art虚拟机:ART代表AndroidRuntime,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码,运行时编译后的应用代码都需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。
ART则完全改变了这种做法,在应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)预编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。兼容Dalvik。
Dalvik与Java虚拟机的比较
- Java虚拟机基于栈,而Dalvik虚拟机基于寄存器。基于栈的机器必须使用指令来载入和操作栈上数据。
- Java虚拟机运行的是.class文件,而Dalvik运行的是自己专属的.dex字节码格式。
- Java虚拟机在运行的时候为每一个类装载字节码,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。
- 一个应用对应一个Diavik虚拟机实例,独立运行。
Dalvik与Art的比较
- Art只会首次启动编译,而Dalvik每次都要编译再运行;
- Art占用空间比Dalvik大,是用“空间换时间”;
- Art减少编译,减少了CPU使用频率,明显改善电池续航;
- Art应用启动更快、运行更快、体验更流畅、触感反馈更及时。
主线程 Looper.loop()卡死问题
- 需要使用死循环阻止线程结束。
- 没消息时会阻塞,但阻塞是程序处于等待状态,不会无限消耗CPU资源。
- 有消息时,程序被唤醒去处理消息。
Binder通信数据大小限制
在文件frameworks/native/libs/binder/ProcessState.cpp
中限制:1M - 8k
1 | #define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2) |
超出限制报异常。
参考:https://www.jianshu.com/p/ea4fc6aefaa8
三种软件架构模式
三种主流模式为MVC、MVP、MVVM,核心都是代码实现分为视图、数据、逻辑处理三层,区别在于各层间通信有所差异。
- MVC:V–>C–>M–>V,通信都是单向的。
- MVP:V<==>P<==>M,通信都是双向的,但V和M之间没有联系。
- MVVM:V<–>VM<==>M,基于MVP,但V和VM是直接双向绑定的,View的变动,自动反映在 ViewModel,反之亦然。
各层说明:
- V,View,视图:用户界面
- M,Model,模型:数据保存
- C,Controller,控制器:业务逻辑
- P,Presenter,呈现者:业务逻辑
- VM,ViewModel:业务逻辑
说明
- 双向通信并不表示双向依赖。比如MVP中,P与M双向通信,但一般P依赖M,而M不需要依赖P,在Java里的表现即是P持有M的引用,而M不会持有P的引用。
参考:
- https://zh.wikipedia.org/wiki/MVC
- https://zh.wikipedia.org/wiki/Model-view-presenter
- https://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html