面试大厂,那就是考察你技术方向的一些专业技能,如果你面试Android岗位,那 Android 方向的专业技能就是考察很重要的一个方向。
但是话说回来,即便这条是所有人都知道的共识,也不是所有人都能搞得定。有些人就是觉得自己基础不好,然后就知难而退,要么就是没有决心啃下这块硬骨头,这时候就体现出每个人面对困难的方式了。
再退一步讲,即便你不想加入大厂,在IT 领域,如果你想吃技术这碗饭,长久来看,专业技能也会制约一个人的上限,等到工作时间越长,年龄越来越大,专业技能的熟练程度就会让你和别的程序员之间差距越来越明显。
而面试是测试一个人能力最直接的方式,我这两个月前前后后面了10家公司,下面就放上我遇到的所有面试题以及我的建议,并且提供一些简历的写作和面试技巧给各位即将面试的同志们。
基本信息
项目经验
须知
工资
不同的城市肯定工资水平不一样的,这里仅以一线城市为例,而且不同的公司、个人能力的高低都会造成工资差异化,这里只是一个大概。
这个是我在BOSS招聘截取的图片大家可以进行参考。
注意事项
一、启动优化有哪些容易忽略的注意点?
首先,在CPU Profiler和Systrace中有两个很重要的指标,即cpu time与wall time,我们必须清楚cpu time与wall time之间的区别,wall time指的是代码执行的时间,而cpu time指的是代码消耗CPU的时间,锁冲突会造成两者时间差距过大。我们需要以cpu time来作为我们优化的一个方向。
其次,我们不仅只追求启动速度上的一个提升,也需要注意延迟初始化的一个优化,对于延迟初始化,通常的做法是在界面显示之后才去进行加载,但是如果此时界面需要进行滑动等与用户交互的一系列操作,就会有很严重的卡顿现象,因此我们使用了idealHandler来实现cpu空闲时间来执行耗时任务,这极大地提升了用户的体验,避免了因启动耗时任务而导致的页面卡顿现象。
最后,对于启动优化,还有一些黑科技,首先,就是我们采用了类预先加载的方式,我们在MultiDex.install方法之后起了一个线程,然后用Class.forName的方式来预先触发类的加载,然后当我们这个类真正被使用的时候,就不用再进行类加载的过程了。同时,我们再看Systrace图的时候,有一部分手机其实并没有给我们应用去跑满cpu,比如说它有8核,但是却只给了我们4核等这些情况,然后,有些应用对此做了一些黑科技,它会将cpu的核心数以及cpu的频率在启动的时候去进行一个暴力的提升。
二、如何检测所有不合理的地方?
比如说大图片的检测,我们最初的一个方案是通过继承ImageView,重写它的onDraw方法来实现。但是,我们在推广它的过程中,发现很多开发人员并不接受,因为很多ImageView之前已经写过了,你现在让他去替换,工作成本是比较高的。所以说,后来我们就想,有没有一种方案可以免替换,最终我们就找到了ARTHook这样一个Hook的方案。
三、做完布局优化有哪些成果产出?
四、你们做了哪些稳定性方面的优化?
随着项目的逐渐成熟,用户基数逐渐增多,DAU持续升高,我们遇到了很多稳定性方面的问题,对于我们技术同学遇到了很多的挑战,用户经常使用我们的App卡顿或者是功能不可用,因此我们就针对稳定性开启了专项的优化,我们主要优化了三项:
通过这三方面的优化我们搭建了移动端的高可用平台。同时,也做了很多的措施来让App真正地实现了高可用。
五、如果发生了异常情况,怎么快速止损?
首先,需要让App具备一些高级的能力,我们对于任何要上线的新功能,要加上一个功能的开关,通过配置中心下发的开关呢,来决定是否要显示新功能的入口。如果有异常情况,可以紧急关闭新功能的入口,那就可以让这个App处于可控的状态了。
然后,我们需要给App设立路由跳转,所有的界面跳转都需要通过路由来分发,如果我们匹配到需要跳转到有bug的这样一个新功能时,那我们就不跳转了,或者是跳转到统一的异常正处理中的界面。如果这两种方式都不可以,那就可以考虑通过热修复的方式来动态修复,目前热修复的方案其实已经比较成熟了,我们完全可以低成本地在我们的项目中添加热修复的能力,当然,如果有些功能是由RN或WeeX来实现就更好了,那就可以通过更新资源包的方式来实现动态更新。而这些如果都不可以的话呢,那就可以考虑自己去给应用加上一个自主修复的能力,如果App启动多次的话,那就可以考虑清空所有的缓存数据,将App重置到安装的状态,到了最严重的等级呢,可以阻塞主线程,此时一定要等App热修复成功之后才允许用户进入。
六、如何优化自定义View?
1、自定义view的onTouchEvent事件中不要多次调用surper.onTouchEvent 这样滑动时候会卡顿。
@0verride
public boolean onTouchEvent (MotionEvent e) {
super. onTouchEvent (e);
return super. onTouchEvent (e):
}
代码看起来很蠢,一般也不会有人这样写,但是有的时候不经意会打印一条日志然后,正好就调用了这句话。然后就会导致页面卡顿。去找原因的时候又很难发现。 所以,注意:在写代码的时候onTouchEvent事件中不要多次调用surper.onTouchEvent
七、mmap + native 日志优化?
传统日志打印有两个性能问题,一个是反复操作文件描述符表,一个是反复进入内核态。所以需要使用mmap的方式去直接读写内存。
八、ACTION_CANCEL什么时候触发,触摸button然后滑动到外部抬起会触发点击事件吗,再滑动回去抬起会么?
首先看一下官方的解释:
/**
* Constant for {@link #getActionMasked}: The current gesture has been aborted.
* You will not receive any more points in it. You should treat this as
* an up event, but not perform any action that you normally would.
*/
public static final int ACTION_CANCEL= 3;
说人话就是:当前的手势被中止了,你不会再收到任何事件了,你可以把它当做一个ACTION_UP事件,但是不要执行正常情况下的逻辑。
然后我的理解就是:滑出view范围后,如果父view没有拦截事件,则会继续受到ACTION_MOVE和ACTION_UP等事件。
一旦滑出view范围,view会被移除PRESSED标记,这个是不可逆的,然后在ACTION_UP中不会执行performClick()等逻辑。
九、点击事件被拦截,但是想传到下面的View,如何操作?
重写子类的
requestDisallowInterceptTouchEvent()方法返回true就不会执行父类的onInterceptTouchEvent(),即可将点击事件传到下面的View。
十、1、什么是ANR 如何避免它?
答:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应 用程序无响应(ANR:Application NotResponding)对话框。 用户可以选择让程序继续运行,但是,他们在使用你的 应用程序时,并不希望每次都要处理这个对话框。因此 ,在程序里对响应性能的设计很重要这样,这样系统就不会显 示ANR给用户。
不同的组件发生ANR的时间不一样,Activity是5秒,BroadCastReceiver是10秒,Service是20秒(均为前台)。
如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。
修正:
1、使用AsyncTask处理耗时IO操作。
2、使用Thread或者HandlerThread时,调用Process.setThreadPriority(
Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
3、使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
4、Activity的onCreate和onResume回调中尽量避免耗时的代码。 BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。
解决方案:
将所有耗时操作,比如访问网络,Socket通信,查询大 量SQL 语句,复杂逻辑计算等都放在子线程中去,然 后通过handler.sendMessage、runonUIThread、AsyncTask、RxJava等方式更新UI。无论如何都要确保用户界面的流畅 度。如果耗时操作需要让用户等待,那么可以在界面上显示度条。
十一、Bunder传递对象为什么需要序列化?Serialzable和Parcelable的区别?
因为bundle传递数据时只支持基本数据类型,所以在传递对象时需要序列化转换成可存储或可传输的本质状态(字节流)。序列化后的对象可以在网络、IPC(比如启动另一个进程的Activity、Service和Reciver)之间进行传输,也可以存储到本地。
大公司VS小公司
1、大公司提供给你的只是一个基层岗位,薪资待遇也一般,但公司名气明摆着,说出去更好听。
2、创业小公司提供给你的是一个充满挑战的岗位,承诺的待遇很让人心动,但是要冒风险,在亲朋好友面前说起来貌似也不够体面。
选择
选择同样是非常重要的,选择的首要前提是你要有很多机会,不然你都没机会怎么选择,在很多机会摆在你面的时候,一定要认真思考,不要冲动,想好自己需要的,多听别人的意见,最后自己决定。我们不能保证每一次选择都是正确的,但是能保证我们是不后悔的,遇事要冷静,多思考。
这里说的选择不仅仅是选择去哪个公司,从事什么方向,还有与什么样的同事工作,甚至是生活中的事情,网上说一个人要有一些成就,需要具备下面几点,我觉得非常的对:
生活与工作
其实这个话题对我来说有一些困惑,“工作是为了更好的生活”,这句话是非常正确的,但是生活,是一种经历,也是一种体验;生活是一种感受,也是一种积累。生活没有答案,生活不需要答案。当生活即将不属于你时,你才会发现:生活仅仅是一个过程,而这个过程无论多么复杂,最终结局都是一样的。生活注重的是过程,而不是结局。最后你也要知道世上没有一件工作不辛苦,没有一处人事不复杂,如果命中注定是打工,便应该打好它,你要相信,七十二行,行行可出状元。