自学Android,学多久可以加入字节跳动?
在回答自学Android,学多久可以加入字节跳动之前,我们先需要了解加入字节跳动的岗位职能要求,下图是我们从boss直聘上选取的今日头条Android工程师职位描述。
职位要求

假如我变成了一只小白。我想自学 Android,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习状态当中,并且每天的学习时间至少在 12 个小时以上。
即便是这样,我敢肯定,找到的工作肯定不会太好,勉强能够维持生活吧,毕竟是零基础入门啊。如果想更进一步,真正成为一名不可或缺的高级Android工程师,时间需要更久,两年、三年、五年,直到秃的那天。想着想着,我就觉得有必要为那一天做点准备,以备不时之需。
- 1、熟练掌握Java语言,深入理解语言特性;熟练掌握Android Studio或其他开发环境;
- 2、熟悉Android Sdk、Framework、基础组件,对重要系统特性和原理有一定的理解;
- 3、能够使用常用的第三方库、基础组件,并对其特性和实现原理有一定的了解;
- 4、了解MVC/MVP/MVVM等设计模式,熟悉面向对象思想及相关设计模式;
- 5、了解常用的Debug工具和方法,熟练掌握异常处理机制;
- 6、热爱技术,能够快速学习,始终保持技术更新;
- 7、关注业务,对产品有好奇心,关系用户体验;
- 8、有Kotlin开发经验者优先,有独立开发产品级APP经验者优先;
1、熟练掌握Java语言,深入理解语言特性;熟练掌握Android Studio或其他开发环境
Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。我们先就第一点熟练掌握Java语言,深入理解语言特性,展开说明:
首先熟悉java基本语法,然后熟悉设计模式等。
a) Java基础语法:看下面的《Java知识点列表》
b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。
Java基础
- Java Object类方法
- HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理
- HashMap 和 HashTable 区别
- HashCode 作用,如何重载hashCode方法
- ArrayList与LinkList区别与联系
- GC机制
- Java反射机制,Java代理模式
- Java泛型
- Synchronized原理
- Volatile实现原理
- 方法锁、对象锁、类锁的意义和区别
- 线程同步的方法:Synchronized、lock、reentrantLock分析
- Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等
- ThreadLocal的原理和用法
- ThreadPool的用法和示例
- wait()和sleep()的区别
Java高阶
- Java虚拟机,Java运行,Java GC机制(可达性分析法,引用计数法)
- Java对象的完整生命周期
- JVM内存模型
- 进程间通信,线程间通信
- JVM类加载机制
- Java引用类型
- 设计模式:除常用设计模式之外,特别的,反射机制,代理模式
- HTTP协议和HTTPS协议
- Socket协议,Socket实现长连接
- TCP和UDP协议
- HTTP协议中GET和POST的具体实现
- 序列化和反序列化
- 线程池的实现原理
- 数据库基础知识:多表查询、索引、数据库事务
设计模式基于六大原则:
- 开闭原则:一个软件实体如类、模块和函数应该对修改封闭,对扩展开放。
- 单一职责原则:一个类只做一件事,一个类应该只有一个引起它修改的原因。
- 里氏替换原则:子类应该可以完全替换父类。也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。
- 依赖倒置原则:细节应该依赖于抽象,抽象不应依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由低层的实现层来完成。
- 迪米特法则:又名「最少知道原则」,一个类不应知道自己操作的类的细节,换言之,只和朋友谈话,不和朋友的朋友谈话。
- 接口隔离原则:客户端不应依赖它不需要的接口。如果一个接口在实现时,部分方法由于冗余被客户端空实现,则应该将接口拆分,让实现类只需依赖自己需要的接口方法。
2.熟悉Android Sdk、Framework、基础组件,对重要系统特性和原理有一定的理解
SDK 的实现目标,概括来说:简洁、稳定、高效。
简洁
对于用户而言,一款好的产品应该是简洁易用的,不该让他们花费太长的时间学习。SDK 也当如此,它不该出现复杂繁琐的对接工作,使用者通过阅读代码和文档,花费很少的时间就能做好 SDK 的对接。
稳定
稳定站在 SDK 使用者角度来看,我们期望第三方 SDK 的服务是稳定高效的,体现在提供稳定可靠的服务,同时运行时性能要高效。这就要求我们在设计实现 SDK 时要尽可能做到以下几点:
- 对外提供稳定的 API。SDK 的 API 一旦确定,除非特殊情况不可更改,提供方变更 API 的成本非常大。
- 对外提供稳定的业务。在提供了稳定的 API 后,必须要有稳定的业务作为支撑。运行时的稳定。确保 SDK 自身稳定运行,不能出现因为接入了 SDK 而导致宿主应用不稳定的情况。
- 版本稳定更新。SDK 版本迭代非常缓慢,要尽可能对使用者屏蔽迭代过程,避免带来不必要的适配成本。
高效
无论是普通的应用开发还是 SDK 开发,都应该考虑到性能问题,SDK 设计者要着重考虑以下问题:
- 更少的内存占用。一般 SDK 和 App 运行在同一进程,此时 SDK 要管理好自己占用的内存,合理分配,注意释放。
- 更少的内存抖动。在占用更少内存的前提下,SDK 设计者必须减少频繁 GC 造成的内存抖动问题。
- 更少的电量消耗。低电量消耗和高性能表现之间很难做到权衡,可以从 CPU 计算量、屏幕刷新帧率等角度考量。
如何学习Android Framework
- 1.深入解析Binder
Binder机制作为进程间通信的一种手段,基本上贯穿了andorid框架层的全部。所以首先必须要搞懂的Android Binder的基本通信机制。 - 2.深入解析Handler
Message 源码分析,再到MessageQueue 的源码分析,Looper 的源码分析,handler 的源码分析,Handler 机制实现原理,既是面试常考,又是工作必备技能。 - 3.Dalvik VM 进程系统
Andorid系统启动、init 进程、Zygote、SystemServer启动流程、 应用程序的创建使用,Activity的创建、销毁 Handler和Looper。 - 4.深入解析 WMS
窗口管理框架 系统动画框架 View的工作原理。 - 5.PackagerManagerService
包管理服务。 资源管理相关类
Android Framework精编内核解析
需要AndroidFramework开发笔记完整文档的,点击我 即可获取资料免费领取方式!
3、能够使用常用的第三方库、基础组件,并对其特性和实现原理有一定的了解
随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,还有65535,应用之间的互相调用等等问题,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。
所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。
Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等Android第三方开源框架,只有将掌握这些Android第三方框架,并对其特性和实现原理有一定的了解,相信你离字节跳动面试跟进了一步!
高级Android组件化、插件化强化实战手册
需要高级Android组件化、插件化强化实战手册的,点击我 即可获取资料免费领取方式!
4、了解MVC/MVP/MVVM等设计模式,熟悉面向对象思想及相关设计模式
MVC、MVP、MVVM是我们工作和面试中都比较重要的一块,但很多时候我们却有点迷惑。比如看了好多篇文章都搞不懂MVC到底是个啥本来想写个MVP写着写着就变成MVC了,到底Databing和MVVM之间有啥见不得人的关系。
MVC
可能由于MVP、MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM。因为后两种都是基于MVC发展而来的。
1、MVC眼花缭乱设计图
我们从网上搜索mvc相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图




2、MVC设计图解释
到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从mvc的发展说起。 MVC框架模式最早由Trygve Reenskaug 于1978年在Smalltalk-80系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型Model-View-Control。
MVP
1、MVP说明
MVP跟MVC很相像,文章开头列出了很多种MVC的设计图,所以根据MVC的发展来看,我们把MVP当成MVC来看也不为过,因为MVP也是三层,唯一的差别是Model和View之间不进行通讯,都是通过Presenter完成。 前面介绍MVC的时候提到了算是致命缺点吧,在android中由于activity(god object)的存在,Controller和View很难做到完全解耦。但在MVP中就可以很好的解决这个问题 看下MVP的设计图:

一般情况下就这两种。
MVVM
1、MVVM说明
MVP中我们说过随着业务逻辑的增加,UI的改变多的情况下,会有非常多的跟UI相关的case,这样就会造成View的接口会很庞大。而MVVM就解决了这个问题,通过双向绑定的机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了很多在View层中写很多case的情况,只需要改变数据就行。 先看下MVVM设计图:

一般情况下就这两种情况,这看起来跟MVP好像没啥差别,其实区别还是挺大的,在MVP中View和presenter要相互持有,方便调用对方,而在MVP中 View和ViewModel通过Binding进行关联,他们之前的关联处理通过DataBinding完成。
5、了解常用的Debug工具和方法,熟练掌握异常处理机制
6、Kotlin
Google 几年前就开始走 “Kotlin First” 的路线,目前很多官方的文档和 Demo 都是使用 Kotlin 语言作为默认,Kotlin 的重要性不言而喻。
Google 官方也出了个“Refactoring to Kotlin”的教程,其介绍如下:
此 Codelab 的适用对象为任何使用 Java 并考虑将其项目迁移到 Kotlin 的开发者。我们将从数个 Java 类入手,引导您使用 IDE 将它们转换为 Kotlin。接着,我们会审视转换后的代码,研究如何加以改善,使其更符合使用习惯,同时避免常见错误
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...