Android 面试总结(一)
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。