內容來源:2017年5月25日,極光高級Android工程師王可爲在「極光開發者沙龍」進行《移動端SDK優化的特色與經驗分享》演講分享。IT大咖說做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
閱讀字數 :2098 | 4分鐘閱讀
結合極光的業務和自身開發經驗,極光高級Android工程師爲咱們簡單介紹移動SDK與APP的區別,以及在作架構設計、性能優化上的一些經驗。html
咱們作APP開發的有這樣一句話:「不要重複造輪子。」意思就是但願快速迭代,每一個APP有本身獨有的功能。基礎業務能夠直接用別人已經作好的框架或第三方的包導入進來,但業務代碼必定要作本身獨有的。緩存
在體積大小上,SDK和APP就有明顯差別。APP的核心代碼只需作上面一小塊,但這樣作的結果是一個APP自己大小有幾十兆甚至一百多兆,用戶能夠接受。而SDK須要作得小,體積在幾百K之內,纔是開發者能接受的。性能優化
因此SDK不能直接用別人的「輪子」。作基礎業務的話,像網絡、數據庫能夠用Android原生的API來作,這樣能把體積控制在較小的範圍內,APP開發者纔會用較小的包去作他們的業務。它的好處就是保持代碼的精簡,而且內部可見,方便調試和修改。服務器
爲了體積,以及優化架構和性能上,咱們要「重複造輪子」。網絡
APP只須要開發者根據本身的需求寫一份配置列表。多線程
SDK的權限則是交給開發者,開發者具體用的什麼權限或版本,咱們是沒法控制的,只能經過指引說明的形式告訴他們如何配置。架構
因此咱們要考慮配置作到儘可能簡便、友好、靈活。框架
一個APP若是要升級,開發新版本上架到應用商場把它替換下來,或是推送更新通知,保證用戶較快地用到新版本,同時在線版本範圍比較小,老版本佔有率慢慢下降。oop
而SDK不是直接上架市場,是須要開發者主動去拿文件,集成到本身的工程,再上架到市場。有些開發者幾個月以後才作更新,甚至有的從不更新,這個狀況致使同時存在不少個歷史久遠的老版本,這個問題會要求咱們作不少兼容性的考慮,因此可靠性和性能考慮的分量是比新功能要重的。
2016年以前極光推的主要是兩個SDK,一個是Jpush,一個是JMessage。
舊架構的推送跟IM是兩個獨立的SDK,存在不少種冗餘代碼。缺點是佔用空間大,有重複操做,佔用了通道和線程資源,還有就是冗餘代碼的升級管理很是麻煩。
咱們在拓展業務後還新增了統計和分享,針對多條業務線的考慮,咱們作了架構調整,把業務跟核心作了分層。
JCore負責核心通用的功能,上層SDK各自在JCore之上運行自有業務,使結構更加清晰,利於拓展共享資源,減小重複動做,針對性作基礎優化更加方便。
在和服務器通訊的時候,從協議的制定上要考慮兼容不一樣的組件和同時在線的不一樣版本。在代碼設計上涉及到的策略類要採起策略模式,方便替換更優策略。
核心組件和上層的組件拆分紅兩個,針對升級不一樣步的問題須要有更多的接口,要簡潔,適應變化。
以及關於各個組件之間的通訊,經過命令模式,把動做抽象成爲可傳出的對象,實現分發和緩衝。
在Android開發的工程設計中,因爲被拆分爲兩個包,一些接口不免會暴露出來,可是爲了起到保護代碼的做用,又不能徹底暴露。因此在方便和保護之間要作取捨權衡。
由於引入了不少組件,在打包、編譯腳本的時候能夠用到Jenkins+Gradle,編寫腳本,作集成,能夠自動打出多個包。
多線程是語言的基本功,一般狀況業務是在主線程執行,可是在移動端主線程任務太重會卡頓影響到用戶體驗,要儘可能剋制。因此在佔用資源比較多、耗時的狀況下要另外多開一個線程。
在Android應用的設計理念上,進程是很是寶貴的資源,它儘可能不把進程管理交給開發者,而是讓系統去處理。
若是是單進程的應用,作的任務不少,內存佔用數高,派多個進程能夠分擔上面的一部分任務資源到另外一個進程,避免佔用資源過高被回收。另一個好處是,在後臺跑的主進程由於一些沒法預測的緣由被系統回收掉了,在主進程的任務依然能夠繼續執行下去。
開了多進程之後內存空間是獨立的,可能在主進程是初始化的,但在子進程上未被初始化。寫代碼的時候沒有意識到,在運行的時候就出乎意料了。這就是數據不一樣步會形成的問題。
數據不一樣步是主進程和線進程都能遇到的問題,如何巧妙利用它的性能又不出錯,我我的常常用雙重檢查鎖,看上去代碼更復雜,但有利於性能更好地運行,而且不容易出現數據不一樣步的問題。
因爲變量在多進程時是不一樣步的,因此跨進程共享的變量,須要經過進程間通訊的機制,把變量的讀和寫均放到同一個進程中,雖然會帶來一點性能損耗,可是這樣才能保證數據正確性。
同一個進程下,能夠作一次讀取屢次使用。
寫的操做能夠批量提交。
使用內存級別儲存,響應更快。
跨進程的批量讀取和提交。
拆分存儲區。
咱們作極光推送,推送主要的任務都是在長連接裏。客戶端和服務器進行通信,先要進行接入服務。
咱們有一個SIS服務,就是另外開闢服務器去找當時的設備,它介入哪個IP,接入哪一個端口有更快的響應,咱們會下發一個列表給客戶端,讓它們本身去嘗試。
要作性能優化,能夠先把列表緩存在本地,若是失敗了再用SIS下發的地址。而後寫一些選擇的策略,優先選擇可用的,排除不可用的。
在接入服務這部分,會把當時的情況上報給服務器,讓服務器根據這些上報的數據反饋作調整。
個人分享到此結束,謝謝你們!
2017大數據與人工智能技術大會由網易人工智能、網易雲、IT大咖說、博學教育主辦, 七牛雲、Hadoop12三、才雲、DBAPlus協辦,成爲廣受矚目的行業技術大會。大會將匯聚衆多行業領軍企業、專家大牛、知名媒體等,繼續聚焦大數據人工智能的探索與應用,展現大數據與人工智能最新的技術創新與成就,爲技術從業者、愛好者提供具備價值的交流平臺,打造一場大數據與人工智能的技術盛宴。
線下地址:
杭州濱江區網商路599號網易大廈報告廳
直播地址:
掃碼報名,或點擊t.cn/R9mqzEF,看直播!