厉害了,这竟然是毕业一年萌新的Android大厂面筋,赶紧来看看!(B站、京东、携程、腾讯---)

Java

1. 反射、注解、泛型、异常了解吗?

基本上都会被问到,回答的时候只是回答基本使用是不够的,可以说一下它们在 JVM 里面的实现原理。比如反射的性能损耗在哪,怎么优化?注解的信息存放在哪?注解的两种处理方式(反射和 APT )。泛型擦除怎么理解?泛型的 PECS 原则如何理解(典型的一个例子就是 Collections.copy 方法)?异常的两种方式(Exception 和 Error)分别简单说一下?异常实例的构造?异常表?finally 为啥总是会执行?

2. Java 集合源码

问的最多的莫过于 HashMap 了。HashMap 的扩容机制、hash 冲突的解决、负载因子为什么是 0.75,为什么链表长度的边界值是 8,取索引的过程?非线程安全,所以就牵扯到了 ConcurrentHashmap、然后又牵扯到 CAS 等等。

最后也可以说一下 Android 中推荐的使用的 SparseArray、ArrayMap (里面存在两个缓存队列)的优化,源码也要看一下。

ArrayList 比较简单,有一家让我直接手写实现,可以练习一下。然后又可以牵扯到线程安全的 Vector、CopyOnWriteArrayList。

3. JVM

问的最多的就是内存区域的划分以及 GC。回答的时候需要注意,标记清除是清除未被标记的对象;还有 GCRoots 对象是哪些?CMS 就别说了,已经被废弃了,可以说一下 G1、ZGC 这些。然后就是引用计数法和可达性分析,这个可以扩展说一下 Android Framework 层使用到的智能指针,它就是使用的引用计数,然后说一下它是怎么解决循环引用问题的。

类加载机制问的也不少,除了 Java 中的,还可以说一下 Android 中的 DexClassLoader,Android 8 的改动?然后就可以引申到了插件化和热修复了。

还有一些问到虚拟机的。这时候先从 Java 的 HotSpot (解释执行和编译执行,分层编译)说起,然后到 Dalvik,最后到 ART。期间涉及 JIT、AOT 编译,什么区别?profile 性能分析?对垃圾回收的改进,如果优化 GC 停顿(可以参考 G1 回收流程)?

4. 并发

问的最多的也就是 synchronized 和 volatile 的实现原理了。synchronized 的基本使用?1.6 的改进(无锁、偏向锁、轻量级锁、重量级锁)?Java 对象头?实现原理(ACC_SYNCHRONIZED、monitorenter/monitorexit 指令)?volatile 的可见性(lock 前缀+缓存一致性协议)和有序性(内存屏障)的实现原理?CAS 的实现(ABA 问题、循环时间长开销大问题、只能保证单个共享变量的原子性)?UnSafe 类的理解?

线程池,问的也很多,但是基本上都是问线程池的那几个参数的意思。

Android

1. 基础

基本上都大差不差,Activity 和 Fragment 的数据传递,生命周期、启动模式;

动画的使用,估值器、插值器(其实就是三角函数)都比较简单。

View 的绘制流程(从 Activity 的 attach 到 onResume),然后延伸到如何自定义 View,为什么要重写 onMeasure、MeasureSpec 的理解?

View 事件分发,需要注意 onCancel 的触发时机(典型的就是 RecyclerView 的点击滑动)?除了一般博客上面写的 Activity -> ViewGroup -> View 的流程。还可以说一下事件从哪里来的(InputManagerService)?事件最先是分发给 Activity 的吗(其实是 ViewRootImpl 里面的 mView,也就是 DecorView)?IMS 是如何分别处理 KeyEvent 和 TouchEvent 的?

在讲 View 的绘制流程,在 scheduleTraversal 时可以延伸到 View 的刷新机制。Vsync 信号的处理?四种回调前三种都比较好理解,Commit 回调是怎么触发的(onTrimMemory)?Vsync 计算掉帧,如何监听线上的卡顿情况,一种就是利用 Vsync,还一种就是 BlockCanary 的利用 Handler 回调。

然后就是 Handler 机制,这个基本上大家都懂,不过可以说一下内存屏障、为什么没有卡死、IdleHandler 在实际项目中怎么用到的?

2. Framework

其实前面我们在回答 Android 基础时就已经讲到不少 Framework 的东西了。所以这一块直接问的比较多的就是 Activity 启动流程和 Binder 机制。在讲 Activity 流程的时候,可以说一下插件化 hook 式的 hook 点,以及 Android 8、10 启动 Activity 的流程改动。

Binder 机制,先说一下 Linux 下的 IPC 通信方式(管道、Socket、信号量、共享内存,其实这些在 Framework 层都有使用到,可以简单讲一下)。然后就是着重讲 Binder 的通信模型,Binder 在驱动层是如何表示的(binder_node、binder_ref 数据结构)?ServiceManager 的代理对象的获取(getStrongProxyForHandle(0))、Service 的注册?打开 Binder 机制的三大流程?

插件化和热修复,插件化的静态代理式(这个很好写,就是刚哥的 dynamic-load-apk)和 Hook 式;热修复我也只了解腾讯系的类加载机制的 dex 插桩,如果熟悉阿里系的底层替换方案也可以说一下。

3. 性能优化

这个就可以根据实际在项目中做了哪些来说了。我是写了包体积优化(减少 8M+)、布局优化(过度绘制和布局嵌套)、内存优化(LeakCanary + Android Profile)。

4. Gradle

因为我简历上的个人技能和项目经历都写了 Gradle,所以这一块问的也比较多。主要是问了编译打包流程(AAPT 和 AAPT2 的区别)以及一些项目中做了哪些事(构建优化、写了一个 Gradle 插件)。

计算机网络

1. TCP

必问,一定要回答全哦。TCP 的面向连接(三次握手、四次挥手)、基于字节流、全双工、可靠性(流量控制、拥塞控制、重传机制等)。TCP 的缺陷(队头阻塞),以及 HTTP3 的怎么解决的?TIME_WAIT 状态的理解?

2. HTTP/1.x、HTTPS、HTTP2、HTTP3

必问,这个只要成体系了,就很好回答了。

先从目前使用最广泛的 HTTP/1.1(二十多年前的版本)开始回答,长连接、如果传输大数据、现在有什么优化措施(每个域名六个并发连接、域名分片、精灵图等等),HTTP 1.x 的问题(应用层的队头阻塞、未压缩 Header、明文传输),HTTP2 是如何解决的(多路复用、HPACK 算法、二进制数据)?HTTP 的不安全性(机密性、问完整性、身份校验)由 HTTPS 保证(TLS_ECDHE_RSA_AES_128_GCM_SHA_256 + PKI)?

HTTP2 (基于 SPDY 协议)只解决了应用层的队头阻塞问题,但是并没有解决传输层的队头阻塞,所以可以说一下 HTTP3 是如何解决的(基于 QUIC 协议,使用 UDP)?连接迁移、前向冗余纠错?

算法

某度:判断合法的 IP 地址。

某多:数组奇偶排序,树的最大深度(递归和迭代都要写),加面算法判断是否是同花顺:

花色:R : 红色,B: 黑色,M: 梅花,F: 方块;牌大小:A、2、3、4 … K;
输入:[“RA”, “R2”, “R3”, “R4”, “R5”, “B4”, “M2”, “F1”]
返回 true,可以构成一个同花顺。
输入:[“FJ”, “FQ”, “FK”, “FA”, “F2”]
返回 false。

某讯:岛屿问题

某宝:对称二叉树(递归和迭代都要写)

如何进阶Android?

有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助我们深刻理解Android相关知识点的原理以及面试相关知识。

1、确定好方向,梳理成长路线图

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

看到这篇文章的人不知道有多少是和我一样的Android程序员。

35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。

我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。

千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。

给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

VjbK-1713529152876)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值