2024 Android开发工程师面经,三年老Android经验面经

扩展资料: https://blog.csdn.net/justloveyou_/article/details/62893086

http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml

1.4 jvm内存分配

Java虚拟机书中第二章

  • 程序计数器

  • Java虚拟机栈

  • 本地方法栈

  • Java堆

  • 方法区

  • 运行时常量池

  • 直接内存

1.5 String,StringBuffer,StringBuilder 区别

  • String,StringBuffer,StringBuilder最终底层存储与操作的都是char数组.但是String里面的char数组是final的,而StringBuffer,StringBuilder不是,也就是说,String是不可变的,想要新的字符串只能重新生成String.而StringBuffer和StringBuilder只需要修改底层的char数组就行.相对来说,开销要小很多.

  • String的大多数方法都是重新new一个新String对象返回,频繁重新生成容易生成很多垃圾.

  • StringBuffer是线程安全的,StringBuilder是线程不安全的.因为StringBuffer的方法是加了synchronized锁起来了的,而StringBuilder没有.

  • 增删比较多时用StringBuffer或StringBuilder(注意单线程与多线程)。实际情况按需而取吧,既然已经知道了里面的原理。

2. 安卓基础


2.1 安卓各版本大变化(Android 6.0到10.0有哪些大点变化),兼容适配

Android 5.0

  • Material Design

  • ART虚拟机

Android 6.0

  • 应用权限管理

  • 官方指纹支持

  • Doze电量管理

  • 运行时权限机制->需要动态申请权限

Android 7.0

  • 多窗口模式

  • 支持Java 8语言平台

  • 需要使用FileProvider访问照片

  • 安装apk需要兼容

Android 8.0

  • 通知,渠道->适配

  • 画中画

  • 自动填充

  • 后台限制

  • 自适应桌面图标->适配

  • 隐式广播限制

  • 开启后台Service限制

Android 9.0

  • 利用 Wi-Fi RTT 进行室内定位

  • 刘海屏 API 支持

  • 多摄像头支持和摄像头更新

  • 不允许调用hide api

  • 限制明文流量的网络请求 http

Android 10

  • 暗黑模式

  • 隐私增强(后台能否访问定位)

  • 限制程序访问剪贴板

  • 应用黑盒

  • 权限细分需兼容

  • 后台定位单独权限需兼容

  • 设备唯一标示符需兼容

  • 后台打开Activity 需兼容

  • 非 SDK 接口限制 需兼容

2.2 热修复原理

原理

  1. 安卓在加载class时会通过双亲委托机制去加载一个类,先让父类去加载,如果找不到再让子类去加载某个类.

  2. 通过查看ClassLoader源码发现findClass方法是由每个子类自己实现的,比如BootClassLoader或者BaseDexClassLoader.而PathClassLoader是继承自BaseDexClassLoader的,它的findClass也是在BaseDexClassLoader里面实现的.

  3. BaseDexClassLoader的findClass里面使用了另一个对象DexPathList去查找对应的class,这是安卓里面特有的实现.在DexPathList对象里面有一个属性dexElements,dexElements是用于存放加载好了的dex数组的,查找class是从这个dexElements数组里面去找的.

  4. dexElements里面存放的是Element对象,findClass最终会交给Element去实现,Element又会交给Element里面的一个属性DexFile去实现.我看了下,最终是用native实现的.

  5. 回到上面的第3步中的DexPathList对象从dexElements数组里面查找class,从数组的前面往后找,找到了就返回结果,不再继续查找.

  6. 所以当我们把修复好bug了的class,搞成dex,然后通过反射等技术放到dexElements的最前面,这样系统在通过PathClassLoader找到class时,就能先找到我们放置的修复好bug的class,然后就不会再往后找了,相当于实现了热修复.这样有bug的class就不会被用了.应了一句古话,近水楼台先得月.

  7. 第6点中的反射,流程是:获取到PathClassLoader,然后反射获取到父类中的DexPathList对象,然后再反射到DexPathList对象中的dexElements数组.然后将补丁(dex)转为Element对象,插入到dexElements数组的前面(先复制出来,再合并,再通过反射放回去).

一句话总结

将修复好的类放在dexElements的最前面,这样在加载类的时候就会被优先加载到而达到修复的目的.

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值