在回答自學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的具體實作
- 序列化和反序列化
- 執行緒池的實作原理
- 資料庫基礎知識:多表查詢、索引、資料庫事務
設計模式基于六大原則:
- 開閉原則:一個軟體物體如類、模塊和函式應該對修改封閉,對擴展開放,
- 單一職責原則:一個類只做一件事,一個類應該只有一個引起它修改的原因,
- 里氏替換原則:子類應該可以完全替換父類,也就是說在使用繼承時,只擴展新功能,而不要破壞父類原有的功能,
- 依賴倒置原則:細節應該依賴于抽象,抽象不應依賴于細節,把抽象層放在程式設計的高層,并保持穩定,程式的細節變化由低層的實作層來完成,
- 迪米特法則:又名「最少知道原則」,一個類不應知道自己操作的類的細節,換言之,只和朋友談話,不和朋友的朋友談話,
- 介面隔離原則:客戶端不應依賴它不需要的介面,如果一個介面在實作時,部分方法由于冗余被客戶端空實作,則應該將介面拆分,讓實作類只需依賴自己需要的介面方法,
熟練掌握Android Studio或其他開發環境
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
包管理服務, 資源管理相關類
需要AndroidFramework開發筆記完整檔案的,點擊我 即可獲取資料免費領取方式!
3、能夠使用常用的第三方庫、基礎組件,并對其特性和實作原理有一定的了解
隨著互聯網企業的不斷發展,產品專案中的模塊越來越多,用戶體驗要求也越來越高,想實作小步快跑、快速迭代的目的越來越難,還有65535,應用之間的互相呼叫等等問題,插件化技術應用而生,如果沒有插件化技術,美團、淘寶這些集成了大量“app”的應用,可能會有幾個g那么大,
所以,當今的Android移動開發,不會熱修復、插件化、組件化,80%以上的面試都過不了,
Android熱修復框架、插件化框架、組件化框架、圖片加載框架、網路訪問框架、RxJava回應式編程框架、IOC依賴注入框架、最近架構組件Jetpack等等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工具和方法,熟練掌握例外處理機制
Android Studio 你需要掌握的Debug技巧
6、Kotlin
Google 幾年前就開始走 “Kotlin First” 的路線,目前很多官方的檔案和 Demo 都是使用 Kotlin 語言作為默認,Kotlin 的重要性不言而喻,
Google 官方也出了個“Refactoring to Kotlin”的教程,其介紹如下:
此 Codelab 的適用物件為任何使用 Java 并考慮將其專案遷移到 Kotlin 的開發者,我們將從數個 Java 類入手,引導您使用 IDE 將它們轉換為 Kotlin,接著,我們會審視轉換后的代碼,研究如何加以改善,使其更符合使用習慣,同時避免常見錯誤
資料結構與演算法
1.1.1 常用的資料結構有哪些?
1.1.2 陣列
(1).如何在一個1到100的整數陣列中找到丟失的數字
相關知識點: [陣列](javascript: void(0))[數學](javascript: void(0))[位運算](javascript: void(0))
相關知識點: [陣列](javascript: void(0))[數學](javascript: void(0))[位運算](javascript: void(0))?
(2).如何在給定的整數陣列中找到重復的數字? (小米)
(3).如何在未排序整數陣列中找到最大值和最小值?(位元組跳動)
(4).在Java中如何從給定陣列中洗掉多重復制?
(5).大數相加(今日頭條)
1.1.3 鏈表
(1).那查詢第一個跟倒數第二個呢?(這就不一樣了,第一個直接給了頭結點,倒數第二個需要從倒數第一個開始查詢,走兩步) (騰訊)
(2).arrayList底層原理 (滴滴 位元組跳動)
(3).如何在一次遍歷中找到單個鏈表的中值?(中國平安)
(4).如何證明給定的鏈表是否包含回圈?如何找到回圈的頭節點?(優酷)
(5).兩個有交叉的單鏈表,求交叉點 (華為)
(6).如何得到單鏈表的長度? 360
(7).如何在不使用遞回的情況下逆轉單鏈表?(小米/美團)
(8).怎么判斷鏈表有環? (滴滴)
1.1.4 佇列&堆疊
(1).如何使用堆疊實作佇列的功能?(廣州荔枝FM)
(2).兩個堆疊實作一個佇列(蘑菇街)
(3).兩個佇列實作一個堆疊 (騰訊)
(4).對比一下佇列和堆疊,以及它們底部實作 (騰訊)
1.1.5 二叉樹
(1).如何在給定的二叉樹中執行先序遍歷?(百度)
(2).如何實作后序遍歷演算法?(百度)
(3).如何在給定陣列中執行二分法搜索?(蘇寧)
(4).已知前序遍歷為{1,2,4,7,3,5,6,8},中序遍歷為{4,7,2,1,5,3,8,6},它的二叉樹是怎么樣的?58
(5).輸入兩棵二叉樹 A 和 B,判斷 B 是不是 A 的子結構, (愛奇藝)
(6).請實作兩個函式,分別用來序列化二叉樹和反序列化二叉樹, (YY)
(7).平衡二叉樹和紅黑樹的區別?(位元組跳動)
(8).什么是平衡二叉樹,它有什么特征 (美團)
(9).B 樹,B+樹
1.1.6 HashMap
(1).HashMap的底層原理是什么?執行緒安全么? (百度 美團)
(2).HashMap中put是如何實作的? (滴滴)
(3).談一下hashMap中什么時候需要進行擴容,擴容resize()又是如何實作的?
(4).什么是哈希碰撞?怎么解決? (滴滴 美團)
(5).HashMap和HashTable的區別 (小米)
(6).HashMap中什么時候需要進行擴容,擴容resize()是如何實作的? (滴滴)
(7).hashmap concurrenthashmap原理 (美團)
(8).arraylist和hashmap的區別,為什么取數快?(位元組跳動)
1.1.7圖
(1).旋轉輸出矩陣
(2).給定一個矩陣 int matrixA[m][n],每行每列都是增序的,實作一個演算法去尋找矩陣中的某個元素 element. 搜狗
1.1.8排序演算法有哪些?
(1).top-k排序(堆排序,位圖法) (美團)
(2).冒泡排序的手寫 (華捷艾米)
(3).堆排序演算法的手寫 (華捷艾米)
(4).橢圓形場地有兩個賽道,可以同時提供兩匹馬比賽,兩匹馬比賽后,可以獲知兩匹馬中跑的快的那匹馬,但是沒有計時工具,問題,如何最優的演算法(比賽次數最少),獲知10匹馬中速度最快的三匹馬 (阿里)
(5).輸入一個整型無序陣列,對堆排序的方法使得陣列有序 (阿里)
(6).如何使用快速排序演算法對整數陣列進行排序? (CVTE)
1.1.9 查找演算法
(1).有序陣列的二分查找演算法(百度)
1.1.10 串
(1).給定一個字串,請你找出其中不含有重復字符的 最長子串的長度, (位元組跳動)
(2).給定一個字串 s,找到 s 中最長的回文子串,你可以假設 s 的最大長度為 1000,
1.1.11 請寫出以下演算法的時間復雜度
冒泡排序法 插入排序法 堆排序法 二叉樹排序法
1.1.12 其他演算法
(1).常用的對稱加密演算法,有什么同? (位元組跳動)
(2).如何在無序(有負數)的陣列中查找是否存在和為target的兩個陣列合,twoSum();(位元組)
本文在開源專案:https://github.com/Android-Alvin/Android-LearningNotes 中已收錄,里面包含不同方向的自學編程路線、面試題集合/面經、及系列技術文章等,資源持續更新中…
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/248138.html
標籤:其他
上一篇:2020年總結



