Android 面试总结(一)
上周开始面试,突然决定的,结果很仓促。没想到还剩三周过年的情况下,面试机会很多,就一天接到了 3 个电话面试和一个视频面试。结果都不理想,乘着周末,先好好总结下。把这几天答得不好的问题好好总结下。
apk 签名流程是怎样的?
1、计算摘要(hash 算法提取出原始数据的摘要);
2、密钥加密(密钥对摘要加密,生成签名信息);
3、签名信息写入原始数据的签名区域块里面,带上数字证书;
apk 校验过程是怎样的?
1、计算摘要(hash 算法计算出原始数据的摘要);
2、解密签名(发送过来的公钥对签名信息解密,得出摘要);
3、比较 2 个摘要,相同校验通过;
这里注意的是 keystore 文件存储了证书、密钥、公要等;
为肾膜要打成 dex 文件,有什么好处吗?
遵从 dex 文件格式,dex 各个类能共享数据,降低了冗余,而且 dex 文件是传统 jar 文件的 50%左右。
内存泄漏具体场景有哪些?
1、handler:非静态内部类默认持有外部引用。Activity 销毁了,但是 Handler 的 message 没有执行完毕,handle 没有被回收。由于非静态内部类默认持有外部引用,因为 handler 可达,所以当前 activity 也是可达,jvm 就不会回收。
解决办法:handler.removeMessage,或者使用弱应用。
2、单例导致内存泄漏:由于单例使用的 context,activity 里面传入的是 activity.this,static 生命周期是整个应用的周期,导致 activity 实例被 static 持有不能释放,导致内存泄漏。
解决方法:使用 getapplicationContext,或者在 application 初始化。
3、匿名内部类也会导致内存泄漏。原理是非静态内部类默认持有外部类应用,导致外部类引用无法被释放;
4、静态变量使用内部类。非静态内部类默认持有外部类引用,持有的 activity 无法被释放,所以内存泄漏,解决方法是 ondestory 置空 static 变量;
5、网络请求回调接口。异步请求需要时间回调,如果当前持有 activity 引用的话。activity 没法被 gc 回收。static 和弱引用可以解决,或者使用 onDestory 在网络请求 cancel 掉。
6、Rxjava 异步没有完成,activity 会存在泄漏,可以 rxjava 可以 dispose。
7、toast 异步任务。穿进去的 context 是当前 activity 的话,当前 activity 销毁但是 toast 持有引用,无法销毁。解决使用 applicationcontext。
总结:异步调用,持有引用无法释放;内部类内存泄漏,内部类默认持有外部引用,外部引用无法被释放;static 变量,静态变量使用内部类和单例,static 是整个生命周期,activity 生命周期短于 static。handler 也是这样的。
glide 相关问题
1、glide 会造成内存泄漏吗?
glide 加载图片的时候,突然关闭界面,会内存泄漏吗?glide 又一个判断生命周期的方法 requestFragmentManager 加入到 fragmentManager 中,activity 销毁或者 fragment 不可见的时候,会停止加载 glide。
mvvm 使用过吗?和 mvp 区别在哪里?
使用 databinding 作为工具实现 view model 双向绑定,数据发生变化可以通知 ui 更新。和 mvp 接口在 view 和 presenter 之前通信区别,接口多某个参数可能要修改多个文件。
说几个常用的框架和他们的设计模式
1、rxjava
异步观察者模式,observable 发生变化时,observer 响应事件;
2、okhttp3
责任链模式,将网络请求的各个阶段封装到了各个链条中,实现了解偶。getResponseWithInterceptorChain()将拦截器构成拦截链,然后链式执行 process()方式完成请求;
Gc 方式
1、可达性分析算法
节点搜寻,从 GC ROOTS 的对象作为起始点,开始搜寻,当某个对象没有被引用链连接时,这个对象就是不可用的。
2、计数器(没用)
给对象添加引用计数器,有地方引用他时就加一,引用失效就减一,计数器为 0 就说明当前对象没有被引用。但是会存在对象相互引用的问题,所以 java 虚拟机没有使用这个方法。
Android 模块化使用过吗?怎么使用的?
用过 arouter
看过源码吗?
1、init();
先找到 routers 包下所有的 class 文件类名,如果本地缓存有效从本地获取,无效就去 dex 获取;
根据类名把实例加载到 warehouse 中。
2、navigation();
根据 path 的 postcard 去查找路由信息,完成数据填充。拦截然后导航。
3、数据填充到 intent 中之后,调用 ActivityCompat 的 startActivity 或者 startActivityForResult 方法启动 activity。
说下事件分发机制吧
阿巴阿吧
线程间通信方式了解吗?
1、共享内存机制
同步,synchronized,while 轮询
共享内存式,多个线程需要访问某个方法,给方法加锁。
2、消息通信机制
wait,notify。管道通信。
评论