您当前的位置:官网首页 > 技术探讨 >

有人说这是初级Android工程师的面经?吓到我了!

发布时间:2019-12-11 13:18编辑:

    本篇文章来自作者潇风寒月,文章首要介绍了他面试Android开发工程师整个进程中收拾的常识系统,信任会对咱们有所协助!By the way,作者说这是初始Android工程师的面经,我以为可不是,这难度现已把我吓到了。。

    达观锁:假定每次去拿数据都以为他人不会修正,所以不会上锁。可是在更新的时分会判别一下此期间他人有没有去更新这个数据。一般用在读比较多,写比较少的状况。

    失望锁:假定每次都是最坏状况,每次去拿数据时他人都会修正,所以每次拿数据的时分都会上锁,这样他人想拿这个数据就会被堵塞直到它拿到锁,多写少读时运用。

    String,StringBuffer,StringBuilder终究底层存储与操作的都是char数组。可是String里边的char数组是final的,而StringBuffer,StringBuilder不是,也便是说,String是不可变的,想要新的字符串只能从头生成String。而StringBuffer和StringBuilder只需求修正底层的char数组就行。相对来说,开支要小许多。

    String的大多数办法都是从头new一个新String目标回来,频频从头生成简略生成许多废物。StringBuffer是线程安全的,StringBuilder是线程不安全的,因为StringBuffer的办法是加了synchronized锁起来了的,而StringBuilder没有。增删比较多时用StringBuffer或StringBuilder。实际状况按需而取吧,已然现已知道了里边的原理。

    Android 5.0

    Android 6.0

    Android 7.0

    Android 8.0

    Android 9.0

    Android 10

    原理

    经过检查ClassLoader源码发现findClass办法是由每个子类自己完成的,比方BootClassLoader或许BaseDexClassLoader。而PathClassLoader是承继自BaseDexClassLoader的,它的findClass也是在BaseDexClassLoader里边完成的。

    BaseDexClassLoader的findClass里边运用了另一个目标DexPathList去查找对应的class,这是安卓里边特有的完成。在DexPathList目标里边有一个特点dexElements,dexElements是用于寄存加载好了的dex数组的,查找class是从这个dexElements数组里边去找的。

    dexElements里边寄存的是Element目标,findClass终究会交给Element去完成,Element又会交给Element里边的一个特点DexFile去完成。我看了下,终究是用native完成的。

    一句话总结。将修正好的类放在dexElements的最前面,这样在加载类的时分就会被优先加载到而到达修正的意图。

    首要需求知道的是为什么要进行技能结构的规划?必定是为了低耦合,进步开发功率是吧。所以不要为了规划而规划。

    MVC

    在Android中View和Controller一般便是被Activity充当了,当逻辑十分多,操作十分杂乱时,Activity代码量十分巨大,不易保护。

    MVP

    我个人视点,现在大多是运用这种办法,既不杂乱也解耦合了。

    MVVM

    为了愈加别离M,V层,所以有了MVVM。

    能够运用lint东西,检测出没有用的文件。一起能够敞开资源紧缩,主动删去无用的资源。尽量多运用可制作目标,某些图画不需求静态图画资源,结构能够在运行时动态制作图画。尽量自己写Drawable,能不必UI切图就不必,占用空间小。

    重用资源,比方一个三角按钮,点击前三角朝上代表收起的意思,点击后三角朝下,代表打开,一般状况下,咱们会用两张图来切换,咱们其实彻底能够用旋转的方式去改动。比方同一图画的上色不同,咱们能够用android:tint和tintMode特点,低版本能够运用ColorFilter。

    紧缩PNG和JPEG文件,能够削减PNG文件的巨细,而不会丢掉图画质量。运用WebP文件格局,能够运用WebP文件格局,而不是运用PNG或JPEG文件。能够运用AS将现有的BMP、JPG、PNG或静态GIF图画转换成WebP格局。运用矢量图形.svg;代码混杂,运用proGuard代码混杂器东西,它包括紧缩,优化,混杂等功能。这个咱们太了解。插件化,将功能模块放服务器上,按需下载,能够削减安装包巨细。

    运用提早展现出来的Window,快速展现出来一个节目,给用户快速反应的体会。障眼法,治标不治本。

    防止在发动时做密布沉重的初始化。某些SDK初始化放在异步去加载,比方地图,推送等,非第一时刻需求的能够在主线程做延时发动,当程序现已发动起来之后,再进行初始化。关于网络,图片恳求结构就必须在主线程中初始化了。发动时,防止I/O操作,反序列化,网络操作,布局嵌套等耗时操作。

    频频运用字符串拼接用StringBuilder或许StringBuffer;ArrayMap、SparseArray替换HashMap;防止内存走漏。

    线程池防止存在许多的Thread,重用线程池内部的线程,然后防止了线程的创立和毁掉带来的功能开支,一起能有用操控线程池的最大并发数,防止许多线程因彼此抢占系统资源而导致堵塞线现象发作。

    分类

    长处

    留意点

    从头设置LayoutInflater的Factory2,然后阻拦创立View的进程,然后搞成自己的控件,想怎样换肤就怎样换肤。

    这块暂时不明白,参加todo。

    之前写过一篇文章,死磕Android_Handler机制你需求知道的全部,里边介绍得很具体,趁便说了一下为什么loop不会堵塞主线程问题。

    Handler机制的关键在于关于ThreadLocal原理的了解,线程私有数据。运用ThreadLocal机制将Looper寄存到线程内部,perfect !

    运用层,运用结构层,系统运行库层,硬件笼统层和Linux内核层。

    我之前也写过简略的demo,JNI Java与C的彼此调用与根本操作。

    校验用户身份,校验数据的完好性。

    首要是剖析measure,layout,draw的进程,之前写过一篇比较完好的,如下。死磕Android_View作业原理你需求知道的全部:

    https://blog.csdn.net/xfhy_/article/details/90270630

    事情传递大体进程:Activity-- Window-- DecorView -- View树从上往下,传递进程中谁想阻拦就阻拦自己处理。MotionEvent是Android中的点击事情。首要事情类型:

    需求重视的几个办法。

    上面3个办法能够用以下伪代码来表明其联络:

    public boolean dispatchTouchEvent {
     boolean consume = false;//事情是否被消费
     if ) {//调用onInterceptTouchEvent判别是否阻拦事情
     consume = onTouchEvent;//假如阻拦则调用本身的onTouchEvent办法
     } else {
     consume = child.dispatchTouchEvent;//不阻拦调用子View的dispatchTouchEvent办法
     return consume;//回来值表明事情是否被消费,true事情中止,false调用父View的onTouchEvent办法
    }

    我觉得anr便是在主线程做了耗时操作,比方io、读写文件、数据库操作等等。anr发作之后一般会有日志,在/data/anr/traces.txt里边。能够参阅我的这篇文章拿anr日志,Android 未root检查ANR反常:

    https://blog.csdn.net/xfhy_/article/details/80223190

    不是同一个。

    Activity里边实例化了一个Window,Window里边有一个DecorView。看一下这篇文章,Android Window机制探究:

    https://blog.csdn.net/qian520ao/article/details/78555397

    todo。

    假如一个View需求处理事情,它设置了OnTouchListener,那么OnTouchListener的onTouch办法会被回调。假如onTouch回来false,则onTouchEvent会被调用,反之不会。在onTouchEvent办法中,事情为Action.UP的时分会回调OnClickListener的onClick办法,可见OnClickListener的优先级很低。

    先做一次丈量,做完之后有空间剩下,有weight的View再丈量一下,分一下剩下的空间。

    从前有鸿洋的AndroidAutoLayout,依据宽高进行控件缩放,十分经典,许多项目或许都还在运用,可是现已中止更新了。然后便是有名的今天头条计划,出来仍是有点时刻了。原理其实便是更改density。

    屏幕的宽度=规划稿宽度 * density。

    然后有AndroidAutoSize库,将今天头条计划交融进去还完善了许多问题,易用,完美。

    每个人遇到的状况不同,这个提早考虑一下自己做过的项目最有应战的当地。

    缺陷便是有时分代码阅览性或许会下降。

    便是一个线程结构,供给了一套操作线程的api。

    引荐小灰的漫画算法。还有其他的一些,随意聊聊:

    有些东西你不只要懂,并且要能够很好地表达出来,能够让面试官认可你的了解,例如Handler机制,这个是面试必问之题。有些不流畅的点,或许它只活在面试傍边,实际作业傍边你压根不会用到它,可是你要知道它是什么东西。

    关于程序员来说,要学习的常识内容、技能有太多太多,要想不被环境筛选就只有不断提高自己,历来都是咱们去习惯环境,而不是环境来习惯咱们!

    文章中每一个部分都包括一系列BAT面试的面试点,这些点构建了一个完好的常识系统。后边,我会细化里边的常识,假如 咱们觉得有问题,请联络我~

    这儿附上上述的技能常识点相关的几十套、头条、阿里、美团等公司19年的面试题,把技能点收拾成了视频和PDF,包括常识头绪 + 许多细节,因为篇幅有限,这儿以图片的方式给咱们展现一部分。

    信任它会给咱们带来许多收成:

    上述以及能够 加我wx:X1524478394 免费获取

    当程序员简略,当一个优异的程序员是需求不断学习的,从初级程序员到高档程序员,从初级架构师到资深架构师,或许走向办理,从技能经理到技能总监,每个阶段都需求把握不同的才能。早早确认自己的工作方向,才能在作业和才能提高中甩开同龄人。