Android原生开发如何深入进阶?工作感悟

Android原生开发如何深入进阶?工作感悟,第1张

概述开头说到程序员简历,这两个月,我看过不下10,000份简历。。。答主不是HR,也不是技术负责人,但是在网站的运营工作中,每天最开心的事情就是研究候选人的简历了~~这些人中,有BAT的资深大牛程序员,也有90后程序员小鲜肉;有人到中年的程序员渴望去创业公司突破瓶颈,也有身在硅谷的程序员 开头

说到程序员简历,这两个月,我看过不下10,000份简历。。。

答主不是HR,也不是技术负责人,但是在网站的运营工作中,每天最开心的事情就是研究候选人的简历了~~ 这些人中,有BAT的资深大牛程序员,也有90后程序员小鲜肉;有人到中年的程序员渴望去创业公司突破瓶颈,也有身在硅谷的程序员自降薪水寻求回国机会。。。

那么问题来了,为什么看上去差不多的技术和资历,有人可以一个月收到二三十个offer,有人只有寥寥几个?

答案与简历相关。虽然技术有高有低、资历有深有浅,个人客观情况在短时间无法改变(经历造假可鄙),但是,如何将它们呈现在简历中是有技巧的。

回答题主的问题「程序员简历应该怎么写」?我认为,**程序员就应该拿技术说话,「技术总结」是一份程序员简历的重中之重。**除了大神和大牛,普通的程序员如果能在叙述中中体现自己的风格,在技术总结中展示鲜明的个人形象,会更吸引公司的注意,拿到更多的面试邀请。

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内无法完成绘制冗余资源及逻辑等导致加载和执行缓慢ANR

3、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/contentProvIDer

2、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、热更新主流框架

DexposedAndFixNuwaTinker

3、热更新的原理

在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框架体系架构(高级UI+FrameWork源码)》学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

hub.com/a120464/AndroID-P7/blob/master/AndroID%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

[外链图片转存中…(img-bS0Q6SDg-1620361614525)]

总结

以上是内存溢出为你收集整理的Android原生开发如何深入进阶?工作感悟全部内容,希望文章能够帮你解决Android原生开发如何深入进阶?工作感悟所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1014083.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存