前言博主认为,关于安卓面试和高级学习方法,应该是刷题+博客+书籍+总结。 前三位博雅的猫在这篇博客文章中,对于总结在个人,其实面试并不像后来那么难。 其次,在磨炼问题的过程中是否考虑了,磨炼问题如下。 这又是另一个水平。 在这里暂时不做
博主总结了大厂商面试中经常听到的一系列面试技术点、深度解析和答案,为最近准备面试的各开发商提供大厂商护航。
何谓面试?博主理解的面试。 这是一个过程,一个不断沉淀、不断总结,善于传达自己专业领域技术和解决问题能力的过程。 以下是博主总结的几个问题,如果文章有错误,请批评和指正!
ANR面试题1、什么是ANR
应用程序不响应,页面没有响应的对话框
2、发生ANR的条件
APP应用程序的响应速度由ActivityManager和WindowManager系统服务进行监视,满足ANR发生条件时出现ANR对话框
活动不响应5秒以上BroadcastReceiver不响应10秒以上服务不响应20秒以上3、造成ANR的主要原因
主线程被IO操作阻止
Activity的所有生命周期回调都是BoardcastReceiver回调onReceive ()在主线程上运行的Service默认运行的主线程上运行的同步TTP
使用AsyncTask处理耗时的IO操作使用Thread或HandlerThread优先提供使用Handler的工作线程耗时操作活动的onCreate和onResume回调,以及耗时的操作
内存输出是指内存输出,在超过当前使用的内存和Dalvik虚拟机的最大内存限制时抛出内存输出异常
4、如何解决ANR
内存溢出是指程序在申请内存时没有足够的空间使用内存泄漏。 不再使用程序分配的内存,无法回收内存抖动。 是指程序在短时间内大量创建和回收对象的现象。1、什么是OOM
位图相关
图像压缩加载缩略图在滚动时重用Bitmap而不加载图像,并使用inBitmap属性捕获异常的其他关联
listview重用convertView并避免使用lru创建onDraw方法执行对象的多进程Bitmap问题2、OOM相关概念
安卓3.0以前Bitmap存储在堆中,所以回收堆内存即可
从Android3.0开始,Bitmap存储在内存中,必须回收朴素层和Java层的内存
官方建议使用recycle方法回收3.0或更高版本。 另外,垃圾收集器可以不主动调用,因为它会自动收集和回收不可用的Bitmap对象
如果recycle方法确定Bitmap不可用,则在向垃圾收集器发送命令以回收native层和Java层的内存时,Bitmap将处于dead状态
recycle方法是不可逆的,再次调用getPixels (等方法将不会产生预期的结果
3、解决OOM
LruCache是一个在内部使用LinkedHashMap实现缓存机制的通用类,它提供get和put方法来获取和添加缓存。 最重要的方法trimToSize会删除最不常用和最常用的缓存,并将最新的缓存添加到队列中
UI卡顿问题1、recycle
View的绘制帧数最好保持60fps,并且每帧的绘制时间不得超过16ms(1000/60 )。 如果Android无法在16ms内完成界面渲染,则会发生纸箱现象
2、LruCache原理
在UI线程上花费很少时间的操作导致UI线程的纸箱布局Layout过于复杂,导致在16ms内无法完成渲染的同一时间运行动画的次数过多,从而重载到CPU和GPU 在同一帧的时间多次绘制像素,导致CPU和GPU经常重载View的触发器measure、Layout,measure、Layout累计时间过长,导致整个View频繁重新渲染加载和运行缓慢,例如Android系统无法在16ms内完成冗馀资源和逻辑的绘制。 ANR 1、UI卡顿原理
布局
优化使用include、ViewStub、merge不要出现过于嵌套和冗余的布局使用自定义View取代复杂的ViewListView优化复用convertView滑动不加载背景和图片优化缩略图图片压缩避免ANR不要在UI线程中做耗时操作 内存泄漏面试题1、Java内存泄漏引起的主要原因
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏
2、Java内存分配策略
静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在
栈区:方法体的局部变量会在栈区创建空间,并在方法执行结束后会自动释放变量的空间和内存
堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收
3、Android解决内存泄漏的例子
单例造成的内存泄漏:在单例中,使用context.getApplicationContext()作为单例的context
匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static
Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用
避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后台被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期
资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭
AsyncTask造成的内存泄漏:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复
内存管理面试题1、Android内存管理机制
分配机制管理机制2、内存管理机制的特点
更少的占用内存在合适的时候,合理的释放系统资源在系统内存紧张的时候,能释放掉大部分不重要的资源能合理的在特殊生命周期中,保存或还原重要数据3、内存优化方法
Service完成任务后应停止它,或用IntentService(因为可以自动停止服务)代替Service在UI不可见的时候,释放其UI资源在系统内存紧张的时候,尽可能多的释放非重要资源避免滥用Bitmap导致内存浪费避免使用依赖注入框架使用针对内存优化过的数据容器使用ZIP对齐的APK使用多进程 冷启动和热启动面试题1、什么是冷启动和热启动
冷启动:在启动应用前,系统中没有该应用的任何进程信息热启动:在启动应用时,在已有的进程上启动应用(用户使用返回键退出应用,然后马上又重新启动应用)2、冷启动和热启动的区别
冷启动:创建Application后再创建和初始化MainActivity热启动:创建和初始化MainActivity即可3、冷启动时间的计算
这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制为止
4、冷启动流程
Zygote进程中fork创建出一个新的进程创建和初始化Application类、创建MainActivityinflate布局、当onCreate/onStart/onResume方法都走完contentView的measure/layout/draw显示在界面上总结:Application构造方法->attachBaseContext()->onCreate()->Activity构造方法->onCreate()->配置主题中背景等属性->onStart()->onResume()->测量布局绘制显示在界面上
5、冷启动优化
减少第一个界面onCreate()方法的工作量不要让Application参与业务的操作不要在Application进行耗时操作不要以静态变量的方式在Application中保存数据减少布局的复杂性和深度不要在mainThread中加载资源通过懒加载方式初始化第三方SDK 其他优化面试题1、Android不用静态变量存储数据
静态变量等数据由于进程已经被杀死而被初始化使用其他数据传输方式:文件/sp/contentProvider2、SharePreference安全问题
不能跨进程同步文件不宜过大3、内存对象序列化
Serializeble:是java的序列化方式,Serializeble在序列化的时候会产生大量的临时对象,从而引起频繁的GC
Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要将数据存储在硬盘上的情况
4、避免在UI线程中做繁重的操作
架构模式面试题 插件化面试题1、插件化解决的问题
动态加载APK(反射、类加载器)资源加载(反射、AssetManager、独立资源、分段资源)代码加载(反射获取生命周期)2、类加载器(Java中字节码添加到虚拟机中)
DexClassLoader:能够加载未安装的jar/apk/dex,主要用于动态加载和代码热更新PathClassLoader:只能加载系统中已经安装过的apk 热更新面试题1、热更新主要流程
线上检查到Crash拉出Bugfix分支修复Crash问题jenkins构建和补丁生成app通过推送或主动拉取补丁文件将Bugfix代码合到master上2、热更新主流框架
DexposedAndFixNuwaTinker3、热更新的原理
在ClassLoader创建一个dexElements数组将修复好的dex文件存放在dexElements数组的最前面ClassLoader会遍历dexElements数组,找到最前面的dex文件优先加载 进程保活面试题1、进程的优先级
空进程后台进程服务进程可见进程前台进程2、Android进程回收策略
Low memory Killer(定时执行):通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存
OOM_ODJ:判别进程的优先级
3、Android保活方案
利用系统广播拉活利用系统Service机制拉活利用Native进程拉活利用JobScheduler机制拉活利用账号同步机制拉活 Lint面试题1、什么是Android Lint
Android Lint是一个静态代码分析工具,它能够对你的Android项目中潜在的Bug、可优化的代码、安全性、性能、可用性、可访问性、国际化等进行检查
2、Lint工作流程
3、配置Lint
创建Lint.xml到根目录下,自定义Lint安全等级等在Java文件中可以使用@suppressLint(“NewApi”)来忽视Lint的报错在xml文件中可以使用tool:ignore(“UnusedResources”)来忽视Lint的报错自定义Lint检查,可以创建类,继承Detector和实现JavaPsiScanner Kotlin面试题1、什么是Kotlin
Kotlin是一种基于JVM的编程语言对Java的一种拓展,比Java更简洁Kotlin支持函数式编程Kotlin类和Java类可以相互调用2、Kotlin环境搭建
直接在Plugin中下载Kotlin插件即可系统会自动配置到Kotlin环境 总结写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的腾讯文档免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术mndy一起讨论交流解决问题。
小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的腾讯文档免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术mndy一起讨论交流解决问题。**