2020互联网寒冬之下,作为一个Android老码农,是如何进入腾讯的?

由于众所周知的原因,原生Android开发如今已经日渐凋敝,作为一个Android程序员,不仅要会Java,Kotlin,JavaScript,Css,Html,还要会Flutter,C++,FFmpeg,Linux等相关知识。

笔者从7月份开始面试,到8月中旬截止(因为腾讯已经面试通过,自己面试面的也累了,就决定去腾讯了) 接下来就说说各家的面试题,一共面试了快二十家公司,既有外包,也有中小型企业,也有准备D轮甚至上市的C轮企业,更有BAT等知名企业。

接下来就一一说一下各家公司的面试题。 也建议各位面试的时候不要上来就直奔BAT等,大厂面试官的技术广度与深度也不是刚出来面试的你,能搞定的。最好先去一些小公司看看他们问的哪些东西,自己回去在查漏补缺一下,刷书大厂的面试题,最后去大厂。 最后祝各位能进入自己心仪的公司。

按照面试的时间顺序来一一罗列各家公司的面试题。(记忆可能出现纰漏,哈哈,各位看看就好,有些公司的面试可能比较常规,就没有什么特别的印象)

武汉佰钧成(外包OPPO,自家面试官)

因为是周六的专场面试,也不用请假,所以马上就参加了这家公司的面试。 两轮面试

Activity的启动流程 Activity的启动模式,应用场景 如何减少对第三方框架的耦合 hashmap的基本原理

博彦科技(外包OPPO,OPPO面试官)

两轮面试

Handler机制 Binder机制 写一个单例模式,DCL为什么要加V关键字 直接在Activity Sleep 5000ms,再post一个runable会不会ANR。 如何监听ANR View的绘制流程,每个都是干什么的 事件传递机制

Insta360 (C轮公司)

三轮面试

组件化如何实现组件通信 HashMap基本原理 如何减少hash冲突 如何增大hash冲突 安装包怎么优化的 如果有A,B,C,D,E五个步骤,每个步骤都需要操作对应请求,用哪种设计模式。

华为外包

两轮技术面试

安装包优化做了哪些工作 对加班怎么看的

本来一面完了就让我等着二面的,等了十分钟后跟我说二面面试官暂时不在,等下次再约时间,出门等了10分钟的公交,离家还有20分钟的时候,又给我打电话让我回去参加第二面,然后就没去了,太折腾人。

绿网科技

三轮技术面

hashmap原理 MVP,MVVM,MVC的区别是什么 Java Memory Model的内存模型 如果让你设计一个app,打算怎么设计 JVM垃圾回收有哪几种算法,有哪几种垃圾回收处理器 Serial使用的哪一种回收算法 JVM的内存模型 Android主线程是怎么启动的 dex是如何转为机器码的 llvm编译是如何优化代码的 说一个你自己的缺点。

最终结果是这样的 哈哈,还是不能要太高

同洲电子

四轮技术面

Activity的启动流程 静态类的静态方法能不能被子类重写(不能,走的invoke-static指令,只有走invoke-virtual指令的才可能实现多态) Linux的启动流程 对Native层有没有兴趣 对做智能家居有没有兴趣 招一个应届生进来做app也是做,招你也是做,为什么要招你

顺丰科技

一轮技术面 总共三轮面试

handler机制 looper的唤醒是在Java还是Native层,怎么做到的 HashMap,ConcurrentHashMap,HashTable有什么异同 Binder通信机制 跨平台开发熟不熟悉 如何提高海外用户的访问速度,假设服务器在深圳。 如何学习一个新东西,有哪些执行步骤

百度

红包随机算法 是怎么做到的 写一个二叉树的深度度优先遍历,递归 非递归 Android中LocalServerSocket是干什么用的 binder的Native层代码看过吗 Linux有哪些RPC机制 为什么android使用了Binder机制没采用共享内存 如果让你设计一套进程间通信的机制,你会怎么设计 Linux的模块动态加载机制是怎么实现的 一个物理屏划分为三个逻辑屏,是靠谁来分发事件的。 ConcurrentHashMap是不是绝对的线程安全。(final,绝对线程安全,相对线程安全,线程不安全) 线程池是如何管理线程状态的

大宇无限(C轮公司 前身是豌豆荚)

是我第二心仪的一家公司,办公环境,氛围,福利都好的一逼,可惜了 总共七轮面试 五轮技术面

Kotlin的访问权限 Koltin为什么比Java更安全 Koltin比Java好在哪 JVM的内存模型 JMM的内存模型 为什么操作数栈是Thread-Private 计算二叉树的深度 ArrayList跟LinkeList区别 ArrayList如何扩容的,如何提高ArrayList的效率 动态代理静态代理区别 启动优化怎么做的。 如果给你个IOS APP,你打算怎么优化。 http有哪几种版本,版本间有什么区别。https跟http有什么区别。 apk为什么要签名,v1跟v2签名的区别 apk从编译打包都安装的流程 dex到odex为什么不能在编译期优化 热修复原理 你的优势是什么

平安

三轮面试

http2.0 1.1 1.0的区别 http如何保证安全性 安装包优化有哪几种方式 启动优化有哪几种方式 View的绘制流程,每个方法干什么的,如果要获取View的宽高,在哪个方法里获取 如何应对弱网环境 android数据存储方式 如果一个app无法访问网络,你怎么做数据存储。 DVM跟JVM的区别 React Native跟原生开发的优劣

腾讯

三轮面试 一面

算法题 通电小球 Android 沉浸式状态栏 怎么实现的 事件处理函数有哪几个,父View 子View 监听同一个事件,重写哪些方法。在哪个View重写? ViewRootImpl接受事件吗? apk编译打包流程 V1,V2 签名区别 利用logging监听方法耗时,会不会让app增大延迟。 eventbus为什么要用CopyOnWriteList? 插件化怎么加载资源的? JVM怎么保证gc效率跟线程运行效率的 ? 如果android没用对应的view,flutter能运行吗? 手写单例模式,volatile 跟 synchronized区别? 接口暴露,但是不让别人调用,有哪些办法?

二面

为什么采用flatbuffer? 比Json好在哪里? 如何处理Crash,NativeCrash呢?Google是怎么做到的?如果上报过程中再次产生Crash能不能捕捉到? uncaughtException是被谁调用的,如果再次崩溃能不能捕获到? Linux是怎么知道app崩溃的,如果想要在被kill前 做一些耗时操作,该怎么做? 考虑设计一个crash捕捉模块。 100万个数字求100个最大值。 手写快速排序算法。

三面 (GM面)

kotlin比Java好在哪里,是函数式编程吗? 如何防止DNS劫持? 如果让你实现一个调试器,你会怎么设计?静态调试?动态调试呢?

总结:

大厂基本上不太看重具体的技术,无论你是Java还是C++,比较看重思路与抽象的解决方案。

如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。

在面试前我也准备了很久,刷了很多大厂面试题,知识点整理出来分享给大家,算是一个感恩回馈吧:

Java相关

1.容器(HashMap、HashSet、LinkedList、ArrayList、数组等)

2.内存模型

3.垃圾回收算法(JVM)

4.垃圾回收机制和调用 System.gc()的区别?

5.类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要)

6.反射

7.多线程和线程池

8.设计模式(六大基本原则、项目中常用的设计模式、手写单例等)

9.Java 四大引用

10.Java 的泛型

11.final、finally、finalize 的区别

12.接口、抽象类的区别

Android 相关

1.自定义 View

2.事件拦截分发

3.解决过的一些性能问题,在项目中的实际运用

4.性能优化工具

5.性能优化 (讲讲你自己项目中做过的性能优化)

6.Http[s]请求慢的解决办法(DNS、携带数据、直接访问 IP)

7.缓存自己如何实现(LRUCache 原理)

8.图形图像相关:OpenGL ES 管线流程、EGL 的认识、Shader 相关

9.SurfaceView、TextureView、GLSurfaceView 区别及使用场景

10.动画、差值器、估值器(Android中的View动画和属性动画 - 简书、Android 动画 介绍与使用)

11.MVC、MVP、MVVM

12.Handler、ThreadLocal、AsyncTask、IntentService 原理及应用

13.Gradle(Groovy 语法、Gradle 插件开发基础)

14.热修复、插件化

15.组件化架构思路

16.系统打包流程

17.Android 有哪些存储数据的方式。

18.SharedPrefrence 源码和问题点;

20.sqlite 相关

21.如何判断一个 APP 在前台还是后台?

22.AMS 、PMS

23.Activity 启动流程,App 启动流程

24.Binder 机制(IPC、AIDL 的使用)

25.为什么使用 Parcelable,好处是什么?

26.Android 图像显示相关流程,Vsync 信号等

源码理解

Glide :加载、缓存、LRU 算法 (如何自己设计一个大图加载框架) (LRUCache 原理)

EventBus

LeakCanary

ARouter

插件化(不同插件化机制原理与流派,优缺点。局限性)

热修复

RXJava (RxJava 的线程切换原理)

Retrofit (Retrofit 在 OkHttp 上做了哪些封装?动态代理和静态代理的区别,是怎么实现的)

OkHttp

算法与数据结构

1.时间复杂度 / 空间复杂度

2.常用的排序算法有哪些?

3.字符串反转

4.链表反转(头插法)

5.如何查找第一个只出现一次的字符(Hash查找)

6.如何查找两个子视图的共同父视图?

7.无序数组中的中位数(快排思想)

8.如何给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

9.二叉树前序、中序、后序遍历

10.最大 K 问题

11.广度、深度优先搜索算法

12.String 转 int。核心算法就三行代码,不过临界条件很多,除了判空,还需要注意负数、Integer 的最大最小值边界等;

13.如何判断一个单链表有环?

14.100 亿个单词,找出出现频率最高的单词。要求几种方案;

15.链表每 k 位逆序;

16.镜像二叉树;

17.找出一个无序数组中出现超过一半次数的数字;

18.计算二叉树的最大深度,要求非递归算法。

19.String 方式计算加法。

网络

1.网络框架对比和源码分析

2.网络七层协议有哪些?

3.Http 和 Https 的区别?Https为什么更加安全?

4.HTTPS的连接建立流程

5.解释一下 三次握手 和 四次挥手

6.TCP 和 UDP的区别

7.Cookie和Session

8.DNS是什么?

9.DNS解析过程

10.HTTP报文结构

11.HTTP与HTTPS的区别以及如何实现安全性

12.如何验证证书的合法性?

13.https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?

14.client如何确定自己发送的消息被server收到?

15.谈谈你对WebSocket的理解

16.WebSocket与socket的区别

17.谈谈你对安卓签名的理解。

18.请解释安卓为啥要加签名机制?

19.视频加密传输

20.App 是如何沙箱化,为什么要这么做?

21.权限管理系统(底层的权限是如何进行 grant 的)?

Kotlin 相关

1.从原理分析Kotlin的延迟初始化: lateinit var和by lazy

2.使用Kotlin Reified 让泛型更简单安全

3.Kotlin里的Extension Functions实现原理分析

4.Kotlin系列之顶层函数和属性

5.Kotlin 兼容 Java 遇到的最大的 “坑”

6.Kotlin 的协程用力瞥一眼

7.Kotlin 协程「挂起」的本质

8.到底什么是「非阻塞式」挂起?协程真的更轻量级吗?

9.资源混淆是如何影响到Kotlin协程的

10.Kotlin Coroutines(协程) 完全解析

11.破解 Kotlin 协程

Flutter相关

1.Dart 当中的 「..」表示什么意思?

2.Dart 的作用域

3.Dart 是不是单线程模型?是如何运行的?

4.Dart 是如何实现多任务并行的?

5.说一下Dart异步编程中的 Future关键字?

6.说一下Dart异步编程中的 Stream数据流?

7.Stream 有哪两种订阅模式?分别是怎么调用的?

8.await for 如何使用?

9.说一下 mixin机制?

10.请简单介绍下Flutter框架,以及它的优缺点?

11.介绍下Flutter的理念架构

12.介绍下FFlutter的FrameWork层和Engine层,以及它们的作用

13.介绍下Widget、State、Context 概念 - Widget

14.简述Widget的StatelessWidget和StatefulWidget两种状态组件类

15.StatefulWidget 的生命周期

16.简述Widgets、RenderObjects 和 Elements的关系

17.什么是状态管理,你了解哪些状态管理框架?

18.简述Flutter的绘制流程

19.简述Flutter的线程管理模型

20.Flutter 是如何与原生Android、iOS进行通信的?

21.简述Flutter 的热重载