打个比方,如果把找工作理解成考大学,面试就是高考,市面上的“真题”就是模拟试卷。我们会很容易倾向于在面试前寻找对应公司的面试“真题”,重点准备,期待“押题”成功。但实际上,即使面试同一家公司,它会有不同部门,不同业务线,不同面试官,即使遇到同一面试官,他也不一定就每次考察完全一样的内容。想想高考中那些考的好的同学,他们肯定不是靠“押题”才能取得好成绩吧,他们大多靠的是平常积累及对知识点灵活掌握,那面试也一样啊。执着于搜题,把面试题当做重点进行“复习”,还不如自己划出“考纲”,各个知识点逐一检查掌握情况,复习的更全面呢。
我对于面试题的看法一直是相对保守的,这类文章一般只是内容搬运,它会存在一些偏差和误读,最重要的那就是几道题往那一扔,并没有产出有价值的东西。这也是为什么我上篇面试总结,会加了一些面试技巧,整理面试题时,也没提他们是出自哪家公司,就是不希望大家把题目区别看待。
说了这些并不是说面试题没用啊,而是希望大家不要迷信面试题,更多地去关注那些有质量有深度的技术文章。面试考核的是知识点而不是具体的某些题目,面试题的作用在于,衡量我们的知识掌握情况,便于我们查漏补缺,越说越像是针对一次“考试”了。
ANR面试题1、什么是ANR
Application Not Responding,页面无响应的对话框
2、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会d出ANR的对话框
Activity超过5秒无响应broadcastReceiver超过10秒无响应Service超过20秒无响应3、造成ANR的主要原因
主线程被IO *** 作阻塞
Activity的所有生命周期回调都是执行在主线程的Service默认执行在主线程中BoardcastReceiver的回调onReceive()执行在主线程中AsyncTask的回调除了doInBackground,其他都是在主线程中没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中4、如何解决ANR
使用AsyncTask处理耗时IO *** 作使用Thread或HandlerThread提供优先级使用Handler处理工作线程的耗时 *** 作Activity的onCreate和onResume回调尽量避免耗时 *** 作OOM面试题1、什么是OOM
OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
2、OOM相关概念
内存溢出:指程序在申请内存时,没有足够的空间供其使用内存泄漏:指程序分配出去的内存不再使用,无法进行回收内存抖动:指程序短时间内大量创建对象,然后回收的现象3、解决OOM
Bitmap相关
图片压缩加载缩略图在滚动时不加载图片回收Bitmap使用inBitmap属性捕获异常其他相关
ListvIEw重用convertVIEw、使用lru避免onDraw方法执行对象的创建谨慎使用多进程Bitmap面试题1、recycle
在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可
在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存
官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收
recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态
recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果
2、LruCache原理
LruCache是个泛型类,内部采用linkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中
UI卡顿面试题1、UI卡顿原理
VIEw的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象
2、UI卡顿的原因分析
在UI线程中做轻微的耗时 *** 作,导致UI线程卡顿布局Layout过于复杂,无法在16ms内完成渲染同一时间动画执行的次数过多,导致cpu和GPU负载过重overDraw,导致像素在同一帧的时间内被绘制多次,使cpu和GPU负载过重VIEw频繁的触发measure、layout,导致measure、layout累计耗时过多和整个VIEw频繁的重新渲染频繁的触发GC *** 作导致线程暂停,会使得安卓系统在16ms内无法完成绘制冗余资源及逻辑等导致加载和执行缓慢ANR3、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和实现JavaPsiScannerKotlin面试题1、什么是Kotlin
Kotlin是一种基于JVM的编程语言对Java的一种拓展,比Java更简洁Kotlin支持函数式编程Kotlin类和java类可以相互调用2、Kotlin环境搭建
直接在Plugin中下载Kotlin插件即可系统会自动配置到Kotlin环境最后今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套**腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和pdf(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节**,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、AndroID开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸AndroID必备知识点】
【AndroID部分高级架构视频学习资源】
*,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-yYg77s0l-1620831455513)]
【算法合集】
[外链图片转存中…(img-pu3RQ44F-1620831455515)]
【延伸AndroID必备知识点】
[外链图片转存中…(img-M6efcU0M-1620831455516)]
【AndroID部分高级架构视频学习资源】
**AndroID精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对AndroID开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶AndroID中高级、架构师对你更是如鱼得水,赶快领取吧!
总结以上是内存溢出为你收集整理的这份字节跳动历年校招Android面试真题解析,一线互联网公司面经总结全部内容,希望文章能够帮你解决这份字节跳动历年校招Android面试真题解析,一线互联网公司面经总结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)