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的引用的对象

如果喜欢本文章,请关注Android高级编程微信公众号:android-tech

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值