Android面试题系统原理篇
Android面试题系统原理篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐。
Dalvik虚拟机与JVM有什么区别
Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码。
Dalvik基于JVM的改进
几个class变为一个dex,constant pool,省内存 Zygote,copy-on-write shared,省内存,省cpu,省电 基于寄存器的bytecode,省指令,省cpu,省电 Trace-based JIT,省cpu,省电,省内存
apk安装卸载的原理
安装过程:复制apk安装包到data/app目录下,解压并扫描安装包,把dex文件(dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
APK打包流程和其内容
1.流程
1.aapt生成R文件
2.aidl生成java文件
3.将全部java文件编译成class文件
4.将全部class文件和第三方包合并成dex文件
5.将资源、so文件、dex文件整合成apk
6.apk签名
7.apk字节对齐
2.内容:so、dex、asset、资源文件
class和dex
1.dvm执行的是dex格式文件,jvm执行的是class文件,android程序编译完之后生产class文件。然后dex工具会把class文件处理成dex文件,然后把资源文件和.dex文件等打包成apk文件。
2.dvm是基于寄存器的虚拟机,而jvm执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,dvm可以根据硬件实现*大的优化,比较适合移动设备。
3.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的class文件整合到dex文件中。减少了I/O操作,提高了类的查找速度
Android采用什么软件架构?整个系统包括哪几个层次?
Android采用堆栈式软件架构,系统分为四个层,从高层到低层分别是:应用程序层、应用程序框架层、系统运行库层和linux核心层。
APP从启动到主页显示经历了哪些过程
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
②system_server进程接收到请求后,向zygote进程发送创建进程的请求;
③Zygote进程fork出新的子进程,即App进程;
④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
操作系统如何管理内存的:
1.使用寄存器进行将进程地址和物理内存进行映射
2.虚拟内存进行内存映射到硬盘上增大内存
3.虚拟内存是进行内存分页管理
4.页表实现分页,就是 页+地址偏移。
5.如果程序的内存在硬盘上,那么就需要用页置换算法来将其调入内存中:先进先出、*近未使用*少等等
apk瘦身:
1.classes.dex:通过代码混淆,删掉不必要的jar包和代码实现该文件的优化
2.资源文件:通过Lint工具扫描代码中没有使用到的静态资源
3.图片资源:使用tinypng和webP,下面详细介绍图片资源优化的方案,矢量图
4.SO文件将不用的去掉,目前主流app一般只放一个arm的so包
GC原理
1.搜索算法:
1.引用计数
2.图搜索,可达性分析
2.回收算法:
1.标记清除复制:用于青年代
2.标记整理:用于老年代
3.堆分区:
1.青年区eden 80%、survivor1 10%、survivor2 10%
2.老年区
4.虚拟机栈分区:
1.局部变量表
2.操作数栈
3.动态链接
4.方法返回地址
5.GC Roots:
1.虚拟机栈(栈桢中的本地变量表)中的引用的对象
2.方法区中的类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中JNI的引用的对象
本文完~