從零開始仿寫一個抖音App——開始

本文首發於微信公衆號——世界上有意思的事,搬運轉載請註明出處,不然將追究版權責任。微信號:a1018998632,交流qq羣:859640274前端

有人說我標題黨,也怪我開始決定寫的時候沒有注意標題,也沒想到會有這麼多閱讀量,的確會生出一些是非出來。那麼從如今開始標題改成 從零開始仿寫一個抖音App 系列。但願技術討論可以多一點,沒看文章就噴的人可以少一點。我會堅持寫下去,好好提高本身的能力。java

連載文章

本項目的 github 地址:MyTikTok

1、寫在前面

這個坑可能會持續好久,以前開過好幾個坑,可是都不長久。緣由是計劃趕不上變化。每過一段時間我都會感受有更重要的事情要去作,因此以前開的坑就被我拋棄了。可是這一次不一樣,具體的不一樣點我會在下面一一列舉出來。python

  • 1.關於目的:筆者目前在抖音的競品裏面作android端的視頻拍攝和編輯這塊。大公司你們也知道,各個業務都是分層的,因此咱們平時的業務都是在音視頻架構組封裝的sdk之上進行的。因此一旦時間長久了自身的競爭力就會減弱,畢竟沒有掌握「核心科技」。好在sdk的源碼是內部開放的,因此我能夠讀讀源碼去了解「核心科技」。正好讀了源碼以後能夠練練手,本身去實現一遍,這就是本項目誕生的初衷。
  • 2.關於代碼:首先因爲保密協議,咱們公司的源碼是絕對不能開源出去的,所以本項目的所有代碼都將會是我本身根據讀源碼獲取到的思想最後實現的。因此本項目最終在性能、兼容性、代碼可讀性都是不如本來的代碼的,因此若是有讀者要集成入商業項目的話請慎重。
  • 3.關於項目:本項目預計會持續1-2年的時間,除非我中途離職了,不然必定會堅持更新。目前的預期是每兩週更新一篇博客,與此同時更新一版feature。此外本項目雖說是寫一個抖音App,但其實最終項目中的實現只會是抖音App中各類特效的實現集合,至於和服務器交互還有界面的交互方面我並不會花費很長時間去寫。固然除了抖音App中的特效,我有一個愛好是深度學習,因此我將會製做一些基於深度學習的特效集成到項目中,因此有這方面愛好的同窗也能夠和我多多交流。
  • 4.饗讀者:本項目雖然是我本身的練手項目,可是也有部分目的是但願讓一部分不甘於現狀想深刻學習android的同窗和我共同進步。因此你們有項目上面的問題和github上的issue都歡迎和我交流。

2、項目概述

這一節我主要是想對將來項目作一個概述吧,說一下項目的技術棧,這樣也好讓你們對項目有一個概念。react

  • 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應該使用的,因此以後想到會陸續補充,若是你們有什麼建議,特別、十分、很是、超級的歡迎在評論區指出來,十分感謝!

3、尾巴

在最後想和你們聊聊個人想法與將來android工程師的發展道路。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年裏能完成這個對於我來講宏大的項目。(暫定兩週一個推動節點,寫一篇博客,項目大更新一版)c++

  • 1.完成項目基礎結構的搭建,熟悉概述中的各個不熟悉的技術
  • 2.完成自建MVP框架和組件化路由框架的編寫
  • 3.將google新MVVM組件集成進自建MVP組件中,完成日誌框架編寫
  • 4.完成埋點框架編寫,寫一個python服務器進行埋點數據以及其餘須要上傳服務器的數據展現(上)
  • 5.深刻學習ncnn框架,寫一個python服務器進行埋點數據以及其餘須要上傳服務器的數據展現(下)
  • 6-10.開始畫界面,着重學習公司核心代碼,着重繼續學習深度學習
  • 11-20.界面畫完開始實現特效每一個節點實現兩個特效,同時學習公司核心代碼和繼續學習深度學習
  • 20以後.離一年還有6個節點,算是進行收尾工做以及爲中間突發事件留下的機動時間。
  • 另外.前1-5中會適當學習公司核心代碼以及深度學習

不販賣焦慮,也不標題黨。分享一些這個世界上有意思的事情。題材包括且不限於:科幻、科學、科技、互聯網、程序員、計算機編程。下面是個人微信公衆號:世界上有意思的事,乾貨多多等你來看。 git

世界上有意思的事
相關文章
相關標籤/搜索