前几天和公众号里面的一位热心网友在进行技术交流,结果聊天就聊到了他最近的面试,他说他最近在面试阿里,光技术面就面了6轮,简历被反复打捞两次,真的恐怖。
不过我这位朋友技术实力还是不错的,能让面试官这么锲而不舍的打捞简历,我觉得也没谁了?
事实证明,他的确挺强的,在悲喜交集的6次技术面结束之后,也终于等到了通往胜利的最后一步—HR面。我想说他基本是稳了...
经过我的耐(死)心(死)教(哀)导(求),他也愿意把面经和面试前复习的学习资料奉献出来,实在可喜可贺。大家就把这篇文章当成十一月份的阿里面经来阅读吧....
因为的机制,内容过多会影响推荐,需要他所提供分享的Android面试复习资料的朋友,可以【点击加入免费打包获取】
第一次阿里( 飞猪事业部 )Android 面经分享
一面+二面
- 1、多线程断点续传原理
(1)所谓的断点续传就是指:文件在传输过程式中被中断后,在重新传输时,可以从上次的断点处开始传输,这样就可节省时间。在这里有两个关键点,其一是检测本地已经下载的文件长度和断点值;其二是在服务端调整文件指针到断点处。
(2)实现方法:我们用一个简单的方法来实现断点续传的功能.在传输文件的时候创建一个临时文件用来存放文件的断点位置在每次发送接受文件时,先检查有没有临时文件,如果有的话就从临时文件中读取断点值,并把文件指针移动到断点位置开始传输,这样便可以做到断点续传了
2、统计启动时长和如何优化冷启动时间
3、ThreadLocal原理
4、谈谈classloader
5、泛型是什么以及在项目中的应用
6、handler发消息给子线程,looper怎么启动
7、down、move、up事件的传递
8、activity栈的应用场景
(1)singleTop 适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
(2)singleTask 适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
(3)singleInstance 适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
9、static synchronized方法的多线程访问和作用,同一个类里面两个synchronized方法,两个线程同时访问的问题
10、内部类和静态内部类和匿名内部类,以及项目中的应用
11、封装view的时候怎么知道view的大小
12、arraylist和linkedlist的区别,以及应用场景
(1)区别:ArrayList是基于数组实现;LinkedList是基于双链表实现的
(2)使用场景:
①如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;
②如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;
- 13、怎么启动service,service和activity怎么进行数据交互
他是9月20日结束的阿里一二面,面完的第二天下午他便接到了电话,说他已经挂了。但是命运这玩意太能扯淡了,被挂之后的第十一天,也就是11月1号,显示他的简历被别的部门捞上来,又邀请他去阿里参加面试。
第二次阿里( 天猫事业部 )Android 面经分享
一面
1.自我介绍+介绍项目
2.自己看过的源码,说一下?
3.接下来就EventBus的东西了,还是老问题,优缺点,有没有什么问题,列举了很多场景,我看源码看的比较细,根据自己看过的东西做回答和分析,然后还是,接口回调和观察者模式之间的选择。
4.问我你看过这么多源码,你觉得什么东西最重要?
5.答了源码中看到了大量的反射使用,多线程方面,Collections,数据结构这些。
6.fragment的懒加载
二面
1.问我多线程,引申出handler,我从handler的源码去解释
2.handler引申出的内存泄漏,为什么静态内部类不会持有外部对象
3.接下来还是场景题,图片框架的实现,涉及到的Lru缓存,线程池,线程池该如何分配线程数量。
4.APP从打开到显示之间发生的事情。
5.为什么java可以调用c/c++的函数,调用jni发生的事情说一下。
6.动画种类,使用动画的步骤,有没有看过动画框架的源码。
(面试官说他在Android基础知识掌握很好,懂得去看源码学习,但是深度不够,应该要往Framework层和c/c++那边学习)7.看了我的flutter项目,我改了一个框架,问我这个框架。
9.让你设计一个跨平台的框架,你怎么设计(这里我谈了flutter的架构)
三面
1.深挖项目
2.react-native的通信机制
3.react-native和phonegap的区别
4.自己在项目中开发遇到的坑关于react-native
5.有没有看过react-native的源码,能否讲讲最熟悉的源码
6.线程和进程的区别,线程自己有没有自己的内存
7.多线程带来的影响
8.binder的机制
9.android为什么使用binder进行跨进程通信
四面
1.synchronize用法,volatile用法,两者的区别和场景
2.动态权限适配方案,权限组的概念
3.网络请求缓存处理,okhttp如何处理网络缓存的;图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
4.进程保活
5.listview图片加载错乱的原理和解决方案,listview是如何做缓存的?
6.https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,两者的区别?
7.Android系统为什么会设计ContentProvider,进程共享和线程安全问题
(1)提供一种跨进程数据共享的方式:
由系统来管理ContentProvider的创建、生命周期及访问的线程分配,简化我们在应用间共享数据(进程间通信)的方式。我们只管通过ContentResolver访问ContentProvider所提示的数据接口,而不需要担心它所在进程是启动还是未启动 。
(2)更好的数据访问权限管理:
ContentProvider可以对开发的数据进行权限设置,不同的URI可以对应不同的权限,只有符合权限要求的组件才能访问到ContentProvider的具体操作。
淘宝的聊天数据在本地都是加密处理的(防止root了被破解),设计一个类似的本地数据存储系统
8.jvm相关和GC回收算法的区别
9.Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)
10.EventBus实现原理和观察者模式在开发中的运用?
11.动态代理模式如何运用?
12.App 是如何沙箱化,为什么要这么做?
(1)Android是一个多用户系统,每个应用是一个独立的用户。系统为每个应用分配一个唯一的用户标识(UID),并为应用中所有的文件设置该用户才能访问的权限。每个进程中有一个独立的VM。每个应用在自己的进程中运行,应用组件需要执行时,系统创建该进程,当系统内存不足时,系统会销毁该进程。
(2)在很多情况下,源自同一开发者或同一开发机构的应用程序,相互间存在信任关系。Android系统提供一种所谓的共享UID(SharedUserID)机制,使具备信任关系的应用程序可以运行在同一进程空间。
(3)沙箱是为app提供隔离环境的一种安全机制,严格控制执行的程序所访问的资源,以确保系统的安全,让app在独立的进程中执行任务,让其不能访问外部进程的资源,这样一个应用出问题了,其他的应用进程能够保障不被影响
为什么写这篇呢?
其实我分享这篇面经有两个目的:
①、祝贺他顺利通过阿里的面试;
②、我希望上的朋友可以通过我这位朋友的经历来勉励自己、激励自己,其实互联网大厂的面试并不可怕,可怕的是你不懂怎么提升自己,浪费了最佳的学习的阶段。结果等来就是末尾淘汰制和“中年危机”。
由于的机制,内容过多会影响更多的推荐,需要这份Android面试复习资料的朋友,可以【点击加入免费打包获取】
结尾
与那位朋友之间的交谈到这里就已经是结尾了,最后希望我那位朋友最后能通过hr面拿到自己满意的薪资和职级,也同样希望大家能拿出破风乘浪的势头,一举在明年的春招拿下自己满意的offer。