從零開始寫一個抖音App——開始
08-13
從零開始寫一個抖音App——開始
來自專欄安卓2 人贊了文章
如有在其他平台看到本文的, 都來自小編編輯.
一、寫在前面
這個坑可能會持續很久,之前開過好幾個坑,但是都不長久。原因是計劃趕不上變化。每過一段時間我都會感覺有更重要的事情要去做,所以之前開的坑就被我拋棄了。但是這一次不同,具體的不同點我會在下面一一列舉出來。
- 1.關於目的:筆者目前在抖音的競品裡面做android端的視頻拍攝和編輯這塊。大公司大家也知道,各個業務都是分層的,所以我們平時的業務都是在音視頻架構組封裝的sdk之上進行的。所以一旦時間長久了自身的競爭力就會減弱,畢竟沒有掌握「核心科技」。好在sdk的源碼是內部開放的,所以我可以讀讀源碼去了解「核心科技」。正好讀了源碼之後可以練練手,自己去實現一遍,這就是本項目誕生的初衷。
- 2.關於代碼:首先由於保密協議,我們公司的源碼是絕對不能開源出去的,因此本項目的全部代碼都將會是我自己根據讀源碼獲取到的思想最後實現的。所以本項目最終在性能、兼容性、代碼可讀性都是不如原本的代碼的,所以如果有讀者要集成入商業項目的話請慎重。
- 3.關於項目:本項目預計會持續1-2年的時間,除非我中途離職了,否則一定會堅持更新。目前的預期是每兩周更新一篇博客,與此同時更新一版feature。此外本項目雖然說是寫一個抖音App,但其實最終項目中的實現只會是抖音App中各種特效的實現集合,至於和伺服器交互還有界面的交互方面我並不會花費很長時間去寫。當然除了抖音App中的特效,我有一個愛好是深度學習,所以我將會製作一些基於深度學習的特效集成到項目中,所以有這方面愛好的同學也可以和我多多交流。
- 4.饗讀者:本項目雖然是我自己的練手項目,但是也有部分目的是希望讓一部分不甘於現狀想深入學習android的同學和我共同進步。所以大家有項目上面的問題和github上的issue都歡迎和我交流。
二、項目概述
這一節我主要是想對未來項目做一個概述吧,說一下項目的技術棧,這樣也好讓大家對項目有一個概念。
- 1.MVP:這是項目的架構方式,熟悉架構的同學應該知道現在android中有三種架構方式:MVC、MVP、MVVM。為何選擇MVP想必大家也都清楚,首先MVC非常老舊也有一堆缺點所以第一個排除。然後是MVVM雖然這種架構已經被「吹」了很久了,但是到現在為止也沒有一個成熟完整的解決方案,雖然我之前幾個自己寫的項目都是使用MVVM(databinding為基礎),但是那都是小打小鬧。據我所知的「大廠」中沒有使用MVVM來當做真正的解決方案的。所以如果大家對這種MVVM有興趣的話,可以去看看我之前寫的幾篇博客和項目。另外說一句,我會自己從零開始封裝一個MVP的框架,也算對自己一個挑戰吧。
- 2.okhttp+retrofit:這兩個框架想必大家都很熟悉了,我就不多說了。只是我會在項目的過程中對這兩個框架進行深度的定製以實現一些有意思的東西,所以這一方面還是有點看頭的。
- 3.fresco:這個也是廣為人知的框架了,可以說這是最強大和性能最好的圖片框架了吧。不是我「吹」這個框架,雖然他的缺點有一些比如:侵入性強、框架比較重。但是一個像抖音這樣的音視頻app,使用fresco是非常適合的,其他圖片框架像glide、picasso等等,都有功能不全的問題。此外因為我完整的讀過fresco的源碼,所以我也可以對fresco進行比較深度的定製。對fresco源碼感興趣的同學也可以去翻翻我之前的博客。
- 4.插件化+組件化+熱修復:這幾個東西算是類似的吧,我還是一個個說
- 1.插件化:幾個優點分別是,多成員負責不同的模塊的時候加快編譯速度、各個模塊解耦、減小發版的包大小按需載入。使用的框架我傾向於自己寫一個,但是不知道有沒有時間,最後可能會在tinker和360RePlugin中選擇一個吧。
- 2.組件化:其實和插件化類似,主要用於解耦模塊,用到的技術是路由組件和gradle分模塊依賴技術,傾向於自己寫一個。
- 3.熱修復:主要用於應對線上bug,應該會在andfix和Robust裡面選一個,畢竟我們的項目對這個要求不高
- 5.google新MVVM組件:這是google最近發布的組件套裝ViewModel+Room+Lifecycles+LiveData,雖然我們用的是MVP框架,但是google推薦的組件使用起來還是用好處的。
- 1.首先Room就可以拋棄了,他是資料庫的組件,我們有更好的選擇
- 2.ViewModel:第一個功能可以使ViewModel以及ViewModel 中的數據在屏幕旋轉或配置更改引起的Activity重建時存活下來,重建後數據可繼續使用,第二個功能可以幫助開發者輕易實現Fragment與Fragment之間,Activity與Fragment之間的通訊以及共享數據,所以還是很有必要使用的,可以集成在我們的MVP框架中。
- 3.Lifecycles:這個就不用說了,生命周期組件是Android官方架構組件中的核心組件,它可以使各種實例作為觀察者與Activity和Fragment等具有生命周期特性的組件綁定在一起,LiveData和ViewModel,都是基於此組件,簡而言之就是,你將需要綁定生命周期的實例註冊給該組件,該組件就會在你指定的某個生命周期方法執行時通知這個實例。
- 4.LiveData:這個組件其實做的和Rxjava的事情類似,第一個功能是觀察者模式,在Value發生變化時通知之前註冊的所有觀察者,第二功能是基於生命周期組件與Activity和Fragment等具有生命周期特性的組件綁定在一起,在生命周期發生改變時停止或恢復之前的事件。了解Rxjava的同學都知道這些功能在其拓展包中都是有的,所以這個組件我們可以不使用。
- 6.Rxjava:不用說Rxjava的生態已經很成熟了,他有RxCache,RxLifecycle,RxAndroid,RxPermission,Retrofit-Adapter等大量並且強大的衍生庫,在寫項目的過程中我也會對使用到的Rxjava的功能進行分析。
- 7.AOP技術:這個技術用處很多,比如日誌記錄、自動埋點等等,目前候選的框架有:AspectJ、APT和ASM這些到時候看實現日誌和埋點框架的時候再選吧。
- 8.JNA:可能有些同學不了解這個框架,其實這就是一個代替jni的對java開發者更加友好的調用native方法的框架,因為我前面說了我們這個項目主要目的是實現抖音中的各種特效,所以必不可少的會用到jni,因此我用了JNA這個更加方便的庫。
- 9.opencv:目前我也沒有開始了解我司到底是使用了哪種技術來實現視頻中的各種特效,所以暫定是opencv,以後隨著我深入核心代碼,可能框架會改變。再次聲明,本項目中的代碼並不會有任何我司的核心代碼,所以大家最好別將項目代碼用於商業項目
- 10.深度學習框架:我之前也使用過tensorflow lite,但是這個框架太簡陋了,所以現在的有一個新選擇是騰訊的ncnn,這個問題將會在到了該使用深度學習的時候再選擇。另外如果對tensorflow lite有興趣的同學可以去看看我之前寫的圖片處理APP的和一個使用demo。
- 11.資料庫:初步預想是使用GreenDao,使用起來方便一些,而且我們對於資料庫使用程度並不強,我司就是使用這個框架,所以還是可靠的。
- 12.WebView:最近hybird app非常流行,所以項目里先把這個技術佔一個坑吧,到時候可能會實現一個簡陋的與js互相調用的WebView容器吧,到時候再看。
- 13.待補充,不知道還有什麼技術或者框架是一個成熟的App應該使用的,所以之後想到會陸續補充,如果大家有什麼建議,特別、十分、非常、超級的歡迎在評論區指出來,十分感謝!
大家可以關注優質公眾號,小編會長期更新優質文章
http://weixin.qq.com/r/DyjO1ubEnrvhraK1930d (二維碼自動識別)
三、尾巴
在最後想和大家聊聊我的想法與未來android工程師的發展道路。
1.如何當好一個大廠的螺絲釘
- 1.都說面試造核彈,入職擰螺絲,我雖然是一個才剛入職的應屆生,但是感觸也頗多。入職之前希望做點有意思的事情,能多麼多麼牛逼。但是其實大多數人進入了大廠都是有可替代性的,真正不可替代的只是頂部的小部分人,所以最後大多數人每天的工作就是維護業務,接需求,修bug。我就是大多數人中的一份子,我怕我就這樣適應了這種工作,然後一天天的重複相同的事情失去了激情,最終為了錢在碼代碼退變成為一名光榮的「代碼搬運工」。
- 2.所以如何當好一個大廠的螺絲釘?辭職是不可能辭職的,這幾年都不會辭職的,大廠福利和薪資又這麼好,只能去利用公司的資源學習更多的東西,才能勉強維持激情。所以我才會決定開這個項目的坑,不斷學習公司里的技術做一些自己沒做過的事情,保持初心提升自己。
2.android工程師的發展道路
- 1.「我要轉前端」、「我要轉後台」、「android開發沒人要了」......想必這些話在各種android技術群里時長會出現,這樣也加深了不少android工程師的焦慮感。但是我想說的只有一句話:牛逼的人做啥都牛逼,只有人的問題沒有方向的問題。
- 2.為什麼android工程師沒人要了?首先我們得明確一點,在可預期的時間範圍內(五年內)android這個平台是不會死的。在我看來只有更加新型的交互操作系統(ar、vr、mr?)會革了android的命,但是最近是看不到希望的。明確了上面一點,我們就可以聊聊為啥android沒人要了。
- 1.第一個原因可能是經濟問題導致公司倒閉了,那麼App就少了,這個無解。
- 2.第二個原因應該就是hybird App、類react native框架、小程序、flutter等等跨平台解決方案的崛起。
- 1.首先hybird App可以不用管,因為「慢」是一個永恆的問題。其次「小程序」在我看來也不是一個大問題,但凡一個大一點的互聯網公司都會有原生App,因為你不可能把自己的小命完全交給騰訊。
- 2.所以現在在和原生android搶地盤的就是類react native框架與flutter。其實我們可以這麼看,這兩種其實都是通過js寫業務邏輯然後將繪製邏輯通過c++交給native控制項,所以只要你學的深並不用怕這兩個東西搶了你的飯碗。
- 3.android工程師的發展道路在哪?我目前想到的一個詞就是「深挖」,具體體現在:深入三方框架源碼、深入framework、深入c++層、深入音視頻處理以及深度學習。我想大家從我前面的項目概述中就能知道為啥了。成為一個只有很少人能替代的人,才是你我的核心競爭力。
3.計劃
說了這麼多,我來定一個計劃吧,也算是接下來整個項目的計劃表,這樣也好推動我進行項目的更新。其實上面概述中提到的技術我只熟悉1/3,希望我能堅持下去在接下來的1年里能完成這個對於我來說宏大的項目。(暫定兩周一個推進節點,寫一篇博客,項目大更新一版)
- 1.完成項目基礎結構的搭建,熟悉概述中的各個不熟悉的技術
- 2.完成自建MVP框架和組件化路由框架的編寫
- 3.將google新MVVM組件集成進自建MVP組件中,完成日誌框架編寫
- 4.完成埋點框架編寫,寫一個python伺服器進行埋點數據以及其他需要上傳伺服器的數據展示(上)
- 5.深入學習ncnn框架,寫一個python伺服器進行埋點數據以及其他需要上傳伺服器的數據展示(下)
- 6-10.開始畫界面,著重學習公司核心代碼,著重繼續學習深度學習
- 11-20.界面畫完開始實現特效每個節點實現兩個特效,同時學習公司核心代碼和繼續學習深度學習
- 20之後.離一年還有6個節點,算是進行收尾工作以及為中間突發事件留下的機動時間。
- 另外.前1-5中會適當學習公司核心代碼以及深度學習.
- 如有什麼建議和疑問,歡迎留言討論。
- 歡迎大家加群技術交流:367685933
推薦閱讀:
※100年前的戒抖音神器,請查收
※分析了兩萬份抖音數據,我發現了這些規律...
※抖音和快手的區別
※零基礎學攝影,30天快速成為抖音網紅 | 全新活動
※我還有救嗎?刷抖音根本停不下來