想了很久怎么样可以让文章的标题不那么悲观,但是各种文案都在我脑海里面不断的被否定,要么是不那么抓眼球,要么是立意不匹配。最后想了想,这个标题是真的符合我最近的感悟。
希望看过文章,能有同感的朋友也能多思考一下。
最近因为疫情的关系,相信很多国内的小伙伴都逐渐开始了解到在家上班的体验。在美国基本上work from home在IT公司里面算是比较常见的现象了。一般大厂每个周都会有一天被划为No Meeting Day,说只是不开会日,但通常都会被大家当成在家办公日。不开会嘛,那我在家和在办公室也没区别不是。
也正是因为闲的时间多了,看文章的时间也多了。我是个不喜欢看书,更倾向于看碎片化文章的人,没事翻翻掘金,翻翻AndroID Weekly,是我上厕所蹲坑时候的首选项。
但是让我感到悲伤的是,好多安卓技术博主,就在这么一个月两个月之间消失了。点击他们的个人主页,你会发现上次更新可能都是好几个月,甚至是一年前的事情了。粗糙的以为是因为疫情,其实想一下,这个事情符合技术这行的发展规律。
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环境最后说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。
最后为了帮助大家深刻理解AndroID相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和pdf(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、AndroID开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
点击:
《Android架构视频+BAT面试专题PDF+学习笔记》
即可免费获取~
了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、AndroID开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
[外链图片转存中…(img-wKXxAMxO-1621230311560)]
[外链图片转存中…(img-jvgKLYYr-1621230311562)]
[外链图片转存中…(img-gSBIIEMu-1621230311564)]
点击:
《Android架构视频+BAT面试专题PDF+学习笔记》
即可免费获取~
网上学习 AndroID的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
总结以上是内存溢出为你收集整理的Android面试知识点总结宝典助你通关!搞懂这些直接来阿里入职全部内容,希望文章能够帮你解决Android面试知识点总结宝典助你通关!搞懂这些直接来阿里入职所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)