2019,我在幾個(gè)新的技術(shù)領(lǐng)域的嘗試和心得
? 又到一年結(jié)束時(shí),回顧這一年,我在幾個(gè)新的技術(shù)領(lǐng)域取得了一些小小的收獲,這其中,有App相關(guān)的,也有App領(lǐng)域之外的。接下來(lái),我來(lái)談?wù)勛约旱囊恍?shí)踐和心得體會(huì)。
1)《Android插件化開發(fā)指南》的英文版出版
? 在社區(qū)一眾朋友的幫助下,我把這本書翻譯成英文,并經(jīng)過(guò)幾番修改,終于由CPC Press在國(guó)外出版了,在中文版的基礎(chǔ)上加上了對(duì)Android O和P的插件化支持。書的英文名是《Android App-Hook and Plug-In technology》。我不知道老外對(duì)這個(gè)技術(shù)的接受程度有多少,但總算是了卻了一樁心愿,讓全世界知道Android技術(shù)在中國(guó)做的有多深入。
? 接下來(lái),我會(huì)在微信公眾號(hào)連載這本書的中文版本。
2)Appium自動(dòng)化測(cè)試框架
? 9月份在成都培訓(xùn)Appium的時(shí)候,順手寫了一個(gè)Appium自動(dòng)化測(cè)試框架。
? 自動(dòng)化測(cè)試框架的宗旨在于讓測(cè)試人員通過(guò)編寫配置文件的方式來(lái)大規(guī)模、快速產(chǎn)出自動(dòng)化測(cè)試用例,而不需要太多的編程知識(shí)。
? Appium傳統(tǒng)的編程方式是的面向過(guò)程的,為此要實(shí)現(xiàn)一個(gè)自動(dòng)化測(cè)試用例,需要寫很多行代碼。這對(duì)于測(cè)試人員尤其是不擅長(zhǎng)編程的測(cè)試人員,是很難推行這門技術(shù)的。
? 由此而衍生出一種Page Object的設(shè)計(jì)模式。為每個(gè)頁(yè)面建立一個(gè)類,把操作預(yù)先封裝到各個(gè)頁(yè)面類中。再往前走一步,就是把操作定義在配置文件yml中,由這個(gè)自動(dòng)化測(cè)試框架來(lái)解析配置文件。這樣的好處是,即使是不擅長(zhǎng)編碼的測(cè)試人員,也可以遵循一些簡(jiǎn)單的規(guī)則,通過(guò)配置文件,迅速組織出自動(dòng)化測(cè)試用例。
? 另一方面,Appium同時(shí)支持Android和iOS,但并不意味著寫一套代碼,同時(shí)適用于Android和iOS。為此,需要在框架中做兼容,消除這些不一致的地方,封裝出同一套接口,從而達(dá)到一臺(tái)代碼,同時(shí)適用于Android和iOS。
? Appium是一門很有趣的技術(shù),涉及大量的App技術(shù)知識(shí),各位從事Android或iOS的技術(shù)同學(xué),可以考慮入手這個(gè)領(lǐng)域。Appium的難點(diǎn)在于開發(fā)環(huán)境的搭建,90%的初學(xué)者卡在了這里,所以沒(méi)有繼續(xù)前行。對(duì)于Android和iOS開發(fā)人員而言,這都是小兒科。
? 在做Appium自動(dòng)化框架的時(shí)候,陪伴我多年的Android手機(jī)掛了,不能真機(jī)測(cè)試。這時(shí)夜神模擬器進(jìn)入我的視線。可以在一臺(tái)電腦上啟動(dòng)多個(gè)夜神模擬器,通過(guò)端口來(lái)進(jìn)行區(qū)分,也就是雙開技術(shù)。最關(guān)鍵是模擬器的速度,非常的流暢。缺點(diǎn)是目前只支持Android4.4、5.1和7.1這三個(gè)版本,以及只支持Windows和Mac兩個(gè)版本。
3)聊天機(jī)器人
? 在寫完Appium自動(dòng)化測(cè)試框架后,我順手寫了一個(gè)聊天機(jī)器人,仍然是借助于Appium技術(shù),捕獲到對(duì)方說(shuō)的話,然后自動(dòng)回復(fù)消息。
? 當(dāng)時(shí)有一個(gè)難點(diǎn)就是,在App中捕獲到的聊天內(nèi)容是圖片,如何把圖片轉(zhuǎn)換成文字?
? 再有就是這個(gè)程序的穩(wěn)定性。因?yàn)橐恢北O(jiān)聽App中的新消息,所以程序就放在那里。如何確保程序的穩(wěn)定性,而不是一個(gè)小時(shí)后程序就崩潰了。比如說(shuō)Appium會(huì)有一個(gè)timeout,超過(guò)這個(gè)值,Appium就會(huì)拋出一個(gè)異常然后終止程序。如何避免半小時(shí)沒(méi)有收到新消息,Appium不會(huì)因?yàn)槌^(guò)了這個(gè)timeout值而掛掉。
? 另一個(gè)難點(diǎn)就是人工智能。目前我寫的這個(gè)機(jī)器人還只能做到你有來(lái)言、我有去語(yǔ),但是答非所問(wèn),風(fēng)馬牛不相及。于是我最近又開始進(jìn)入“深入學(xué)習(xí)”和“知識(shí)圖譜”這兩個(gè)領(lǐng)域,去尋找成熟的解決方案。希望2020年能早日解決這個(gè)問(wèn)題。
4)搭建一套測(cè)試環(huán)境
? 隨著內(nèi)存降價(jià)到白菜價(jià),我把自己的PC本升級(jí)到32G內(nèi)存。接下來(lái)通過(guò)VMWare,創(chuàng)建了十幾臺(tái)虛擬機(jī),分別搭建Jenkins、Nginx、Maven、Redis、MySQL、SpringMVC、Node環(huán)境,這其中大部分軟件是通過(guò)Docker來(lái)搭建的。
? 在安裝這些軟件的時(shí)候,我發(fā)現(xiàn)使用Docker要比直接安裝更容易一些。
? 另一方面,就是網(wǎng)絡(luò)配置。為每臺(tái)虛擬機(jī)同時(shí)開啟兩塊網(wǎng)卡,一個(gè)是橋接模式,動(dòng)態(tài)分配IP,用于虛擬機(jī)上外網(wǎng);一塊網(wǎng)卡是NAT模式,從而和主機(jī)形成一個(gè)小型局域網(wǎng),固定IP,這樣就不會(huì)因?yàn)橹貑⑻摂M機(jī)而導(dǎo)致IP改變。虛擬機(jī)之間通過(guò)NAT模式下的固定IP相關(guān)訪問(wèn)。
? 下載一個(gè)花生殼軟件。可以免費(fèi)領(lǐng)取到兩個(gè)域名,其中一個(gè)是80端口,另一個(gè)是隨機(jī)端口。把域名指向一臺(tái)安裝了Nginx的虛擬機(jī)的ip,由Nginx負(fù)責(zé)分發(fā)到其他虛擬機(jī)處理外界的請(qǐng)求。這樣外界就可以通過(guò)這兩個(gè)域名來(lái)訪問(wèn)我這個(gè)小型局域網(wǎng)提供的服務(wù)了。
? Jenkins是唯一沒(méi)有通過(guò)Docker進(jìn)行安裝的,因?yàn)槲乙?jīng)常修改其中的文件。究其原因,還是出于對(duì)Jenkins的恐懼。這是個(gè)非常強(qiáng)大的持續(xù)集成工具,里面有各種配置開關(guān)。我只完成了Node項(xiàng)目、Android項(xiàng)目、SpringMVC的持續(xù)集成。
? 考慮到每臺(tái)虛擬機(jī)安裝的軟件以及配置都差不多,于是就做了一個(gè)虛機(jī)鏡像,這其中包括JDK、Docker、jq這些基礎(chǔ)軟件的安裝,還包括設(shè)置免密登錄、把docker加入管理員組這些基本配置。一開始我只給這個(gè)虛機(jī)鏡像分配了10G空間,但越來(lái)越不夠用,幾次擴(kuò)容后,發(fā)現(xiàn)15G是一個(gè)比較合適的值。
? 再后來(lái)我對(duì)鏡像做了優(yōu)化,刪除了界面組件,這樣鏡像的體積就減少了很多,同時(shí)啟動(dòng)速度也快了。
? 接著我把一臺(tái)虛擬機(jī)設(shè)置為maven私服、NPM私服,甚至Docker私服,從而讓我的項(xiàng)目所有的外界依賴都從這臺(tái)虛擬機(jī)獲取。
? 其實(shí)很多互聯(lián)網(wǎng)公司的測(cè)試環(huán)境和生成環(huán)境,都是不能之間訪問(wèn)的,都需要做一臺(tái)跳板機(jī)。我們開發(fā)人員先登錄到跳板機(jī),再通過(guò)跳板機(jī)訪問(wèn)測(cè)試環(huán)境或生成環(huán)境的虛機(jī)。
? 使用XShell可以同時(shí)操作多臺(tái)虛擬機(jī),還可以在主機(jī)和虛擬機(jī)之間傳遞文件。
? 這里只是粗略總結(jié)一下搭建一套環(huán)境的步驟。很多細(xì)節(jié),以后再詳細(xì)介紹,還有很多沒(méi)有提及的軟件,比如ELK、Grafana+Zabbix、MySQL、Redis等等。
? 對(duì)于一個(gè)測(cè)試人員而言,搭建一套測(cè)試環(huán)境是必須具備的機(jī)能。不能一直從事功能測(cè)試這種體力活兒,久而久之,會(huì)被這個(gè)行業(yè)所淘汰。
5)Hybrid
? 從事App研發(fā)這七八年的時(shí)間,其實(shí)有一半時(shí)間在做跨平臺(tái)和動(dòng)態(tài)化技術(shù)。這幾年我一邊做培訓(xùn),一邊在系統(tǒng)梳理這方面的知識(shí)。
? 首先是Hybrid。這是最老牌的跨平臺(tái)技術(shù)。經(jīng)過(guò)這十年來(lái)的發(fā)展,仍然不能突破手機(jī)瀏覽器性能低劣的桎梏,但是,它仍然是絕大多數(shù)創(chuàng)業(yè)公司的首選。你想啊,Android和iOS只要各招1個(gè)開發(fā)人員,負(fù)責(zé)實(shí)現(xiàn)原生App和H5的通信,以及日常的發(fā)版,剩下的錢就全都可以招H5開發(fā)人員了,只需要開發(fā)一套業(yè)務(wù)邏輯,這是多么節(jié)省人力成本的模式。
? 性能問(wèn)題是Hybrid永遠(yuǎn)的痛,業(yè)內(nèi)有很多首頁(yè)秒開的技術(shù)方案和框架,比如說(shuō)VasSonic。
? 原生App和H5之間的交互,以及頁(yè)面相互跳轉(zhuǎn)。可以使用成熟的框架例如Cordova,或者自己寫一套,其實(shí)并不難。
? Hybrid分兩套完全不同的技術(shù)方案:
-
方案1是直接訪問(wèn)線上的H5、JS和CSS、圖片,這會(huì)導(dǎo)致訪問(wèn)的時(shí)候比較慢,因?yàn)橐螺d很多資源,一般是Node+Express來(lái)提供H5的外殼,里面的內(nèi)容,用React還是vue亦或是Angular就無(wú)所謂了;
-
方案2是離線包。事先把H5、JS和CSS、圖片都打包到App中,以后有更新,再?gòu)姆?wù)器下載新的zip包,可以是全量的zip包,也可以是增量zip包,后者體積會(huì)更小一些。
? 對(duì)于流派1,難點(diǎn)主要在于:
-
Node,很多前端開發(fā)人員并不能熟練掌握Node技術(shù),畢竟這是一門服務(wù)器端技術(shù)。涉及到Jenkins持續(xù)集成、服務(wù)器查日志等等。
-
此外,如果前端H5要發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求,則需要在Node層寫一個(gè)API接口,給前端H5頁(yè)面調(diào)用。
? 對(duì)于流派2,主要問(wèn)題是麻煩:
-
H5端的網(wǎng)絡(luò)請(qǐng)求,由于跨域的問(wèn)題,所以要間接使用App端的網(wǎng)絡(luò)請(qǐng)求框架。順帶著,共享App端的用戶token。
-
配置增量更新,是一個(gè)很繁瑣的事情。要逐個(gè)版本去驗(yàn)證,下載增量包后,是否升級(jí)成功了。
-
每次調(diào)試代碼,都要經(jīng)歷一個(gè)漫長(zhǎng)的過(guò)程:生成壓縮包、打包App、清空App本地緩存,解壓H5壓縮包。
?
? 對(duì)于創(chuàng)業(yè)公司而言,更多的選擇方案1,因?yàn)槟芸焖俚囧e(cuò)而人力成本極低,招人時(shí)也不需要太多的培訓(xùn)成本。
6)React Native
? 據(jù)我所知,國(guó)內(nèi)的很多OTA公司,都已經(jīng)把原生App改造為用ReactNative來(lái)寫的了。
? RN從2015年誕生至今,雖然還沒(méi)有發(fā)布一個(gè)1.0的正式版本,但是其在國(guó)內(nèi)互聯(lián)網(wǎng)公司的受歡迎程度,已經(jīng)遠(yuǎn)非其他App技術(shù)所能企及。究其原因,是iOS jsPatch被Apple禁用,但是RN的熱更新技術(shù)卻仍然能通過(guò)Apple Store的審核。迄今為止,也只有這個(gè)技術(shù)不受Apple的限制。
? 雖然Apple Store的審核速度已經(jīng)縮短至幾天,但是對(duì)于那種很嚴(yán)重的bug,我們還是希望能在當(dāng)天修復(fù)并上線。再有就是Apple Store圣誕節(jié)假期不審核審核App,更恐怖的是,就算你修復(fù)了bug并提交審核,還可能因?yàn)槠渌蚨鴮徍吮痪艿簟8魑籭OS程序員應(yīng)該都深有體會(huì),比如說(shuō)我最長(zhǎng)的一次審核是一個(gè)半月。
? RN的熱更新技術(shù)可以自己做,也可以使用外界比較成熟的解決方案。
? 另一方面,ReactNative是建立在React基礎(chǔ)之上的。這使得原本就熟悉React的H5開發(fā)人員,只需要學(xué)習(xí)RN中的那些標(biāo)簽控件,就可以快速上手了。這就比從事Flutter開發(fā)還要去學(xué)習(xí)Dart要簡(jiǎn)單的多了。
? ReactNative還有一個(gè)尖端技術(shù),就是拆分成多個(gè)模塊,各自打包下載。這就有點(diǎn)Android插件化的意思了。
? 此外,就是性能問(wèn)題了。主要是白屏,以及列表頁(yè)的優(yōu)化。業(yè)內(nèi)有一種頁(yè)面預(yù)加載技術(shù),比如說(shuō)用戶現(xiàn)在A頁(yè)面,App預(yù)先把B頁(yè)面渲染出來(lái),只是不顯示出來(lái),從而從A頁(yè)面跳轉(zhuǎn)到B頁(yè)面,可以秒開。
7)Flutter
? 這是2019年最火的技術(shù),我也花了仔細(xì)的去研究過(guò)它的打包流程、模塊化、熱更新、網(wǎng)絡(luò)請(qǐng)求框架等等技術(shù)。
? Flutter的精髓是插件、模塊和包。
? 我在學(xué)習(xí)研究Flutter的時(shí)候,嘗試了網(wǎng)絡(luò)框架封裝的兩種方式,一種是使用Flutter自身的網(wǎng)絡(luò)框架,另一種是復(fù)用App原生的已有網(wǎng)絡(luò)框架。我的感受是,如果是一款A(yù)pp完全用Flutter,那么用第一種方式;如果在已有App上嘗試把幾個(gè)模塊用Flutter來(lái)寫,那么采用第二種方式。
? 我還嘗試過(guò)模塊化拆分。按照酒店機(jī)票火車票多個(gè)模塊的方式,把一個(gè)Flutter項(xiàng)目拆分成多個(gè)Plugin或Package(二者的區(qū)別在于要不要與原生App進(jìn)行交互)。
? 我也去嘗試過(guò)Flutter的熱更新技術(shù)。官方并沒(méi)有支持這個(gè)技術(shù)。但是在Android系統(tǒng)上,可以通過(guò)暴力替換的方式,把Flutter功能替換成新版本,來(lái)實(shí)現(xiàn)熱更新技術(shù)。對(duì)于iOS,則不具備這個(gè)能力。別看缺了這么個(gè)小功能,在國(guó)內(nèi),這可是至關(guān)重要的。
? 看了很多關(guān)于Flutter的技術(shù)文章,說(shuō)到Flutter的渲染速度要比原生App快。但這個(gè)優(yōu)點(diǎn)還遠(yuǎn)不足以讓各個(gè)一二線互聯(lián)網(wǎng)公司、軟件公司把App改造為Flutter。App線上出了bug,能快速修復(fù),才是關(guān)鍵。所以在國(guó)內(nèi),不具備熱修復(fù)能力,F(xiàn)lutter很難繼續(xù)走得更遠(yuǎn)。
8)區(qū)塊鏈
? 年底區(qū)塊鏈技術(shù)又火了起來(lái)。恰好我在2018年做過(guò)這個(gè)技術(shù),基于Fabric,搭建過(guò)一個(gè)社區(qū)買藥的區(qū)塊鏈平臺(tái)。十二月的時(shí)候,我又把這個(gè)技術(shù)拾了起來(lái)。通過(guò)前面搭建的14臺(tái)虛擬機(jī),搭建了一套Fabric區(qū)塊鏈系統(tǒng),包括4臺(tái)節(jié)點(diǎn)服務(wù)器,3臺(tái)排序服務(wù)器,3臺(tái)ZooKeeper,4臺(tái)Kafka。
? 區(qū)塊鏈技術(shù)大致分為Fabric和以太坊。我做的是Fabric技術(shù)。Fabric是一個(gè)龐然大物,學(xué)習(xí)這門技術(shù),需要具備以下的基礎(chǔ)知識(shí):
-
Docker,尤其是Docker Compose。
-
Shell腳本編寫能力。
-
nodejs或Java,用于使用Fabric SDK。
-
比特幣和區(qū)塊鏈的基礎(chǔ)概念和術(shù)語(yǔ)。
? 在此基礎(chǔ)上,就可以從搭建區(qū)塊鏈環(huán)境入手了。Fabric有很多版本,書籍多針對(duì)于1.1,網(wǎng)上文章,則從1.0到1.4各種版本都有。建議從1.1入手,版本迭代對(duì)搭建環(huán)境影響不大。在1.1的基礎(chǔ)上,再看1.2,1.3,1.4甚至2.0都很容易。
? Fabric分為兩個(gè)大方向:
? 方向1:在Fabric上做業(yè)務(wù),用GO語(yǔ)言寫智能合約,以及基于Java或Node的SDK,編寫前端業(yè)務(wù)邏輯。
? 方向2:研究Fabric底層實(shí)現(xiàn),包括CA,背書,算法,安全,對(duì)其進(jìn)行功能上的擴(kuò)展,完善對(duì)外提供的SDK,包括區(qū)塊鏈瀏覽器等等。
? 以上就是2019年我的一點(diǎn)收獲。對(duì)于我而言,很多都是全新的領(lǐng)域,如果文中的某些觀點(diǎn)有錯(cuò)誤,還請(qǐng)多多包涵多多指正,接下來(lái),我會(huì)持續(xù)更新我的公眾號(hào),依次介紹本文所涉及的這些技術(shù),包括:
? 1. DevOps:從零搭建一套測(cè)試環(huán)境
? 2. 基于Appium搭建自動(dòng)化測(cè)試框架
? 3. Android插件化技術(shù)
? 4. Hybrid技術(shù)
? 5. React Native技術(shù)
? 6. Flutter技術(shù)
? 7. Fabric區(qū)塊鏈技術(shù)
? 敬請(qǐng)期待。
? 2020年,請(qǐng)多多關(guān)照。

浙公網(wǎng)安備 33010602011771號(hào)